Obrigado por utilizar o pacote ExpImage
. Este pacote foi
desenvolvido a fim de facilitar o uso da analise de imagens na obtenção
de várias informações sobre os objetos que elas contém. Para a
utilização do pacote é indispensável a instalação do pacote
EBImage
. Geralmente, este pacote pode ser instalado ao
executar os seguintes comandos:
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("EBImage")
Porém se houver problemas na instalação sugerimos que consulte mais opções de instalação no site: https://bioconductor.org/packages/release/bioc/html/EBImage.html
Para instalar o pacote ´ExpImage´ basta utilizar o seguinte comando:
install.packages("ExpImage")
Convidamos a todos os usuários do ExpImage que venha conhecer nossos materiais didáticos sobre este e outros pacotes nos seguintes links:
Após a instalação dos pacotes é necessário fazer sua ativação
library(EBImage)
library(ExpImage)
Para abrir as imagens pode-se inicialmente indicar a pasta de
trabalho onde a imagem se encontra com a função setwd
. E,
posteriormente, abrir a imagem com a função read_image
.
Neste caso, poderiam ser utilizados comandos como esses:
#Apagar memoria do R
remove(list=ls())
#Indicar a pasta de trabalho
setwd("D:/Backup Pendrive/")
im=read_image("Imagem.jpeg",plot=TRUE)
Neste exemplo utilizaremos uma imagem contida no banco de dados do pacote.
# Obtendo o endereço da imagem de exemplo
=example_image(2)
end=read_image(end,plot=TRUE) im
Em algumas situações é interessante diminuir a resolução das imagens, pois torna-se possível reduzir o esforço computacional sem perdas expressivas na precisão das medidas a serem obtidas.
##Diminuir a resolucao (tamanho da imagem)
=resize_image(im,w=1000,plot=FALSE) im2
Após criação do objeto contendo a imagem (im) precisamos proceder alguma metodologia de segmentação.
Varias metodologias de segmentação podem ser utilizadas. Uma opção é o método do limiar. Para isso, é necessários escolher um índice ou banda que proporcionará maior contraste entre as sementes (foreground) e o fundo (background).
#Selecionando o melhor indice para a segmentacao
=gray_scale(im2,method = "r",plot=T) r
=gray_scale(im2,method = "g",plot=T) g
=gray_scale(im2,method = "b",plot=T) b
Como foi possível observar, quando se utilizou a banda de azul foi possível obter melhor contraste entre a folha e o fundo. Logo, podemos considerar essa banda como a melhor para fazer o processo de segmentação.
Outra opção de explorar outros possíveis índices é por meio do seguinte comando:
plot_indexes(im,NumberCores=2)
A segmentação pode ser feita considerando-se um limiar. Ou seja, um valor a partir do qual os pixels serão consideradas como background ou foreground. O melhor valor de limiar pode ser obtido pela tentativa e erro:
=segmentation(b,treshold = 0.20,fillHull = F,selectHigher = T,plot=T) MatrizSegmentada
=segmentation(b,treshold = 0.40,fillHull = F,selectHigher = T,plot=T) MatrizSegmentada
=segmentation(b,treshold = 0.60,fillHull = F,selectHigher = T,plot=T) MatrizSegmentada
Como foi possível observar, dependendo do valor de limiar escolhido, pode não aparecer toda a folha ou ter muitos ruídos.
Outra opção é considerar um treshold obtido pelo método de otsu da seguinte forma:
=segmentation(r,treshold = "otsu",fillHull = F,selectHigher = T,plot=T)
MatrizSegmentada#> [1] "The threshold by Otsu method is (O valor do limiar pelo metodo otsu e): 0.4668"
Mas neste caso o melhor é considerar o limiar de 0.40
plot_image(b,col = 3)
=segmentation(b,treshold = 0.4,fillHull = F,selectHigher = F,plot=T) MatrizSegmentada
Como é possível ver, foi feita a segmentacao separando o que é folha e o que não é. Dessa forma, podemos separar o que é “folha + ovos” e o que não é, preechendo os espaços em branco dentro da folha da seguinte forma:
=segmentation(b,treshold = 0.4,fillHull = T,selectHigher = F,plot=T) MatrizSegmentada
Agora que temos apenas os pixels correspondente à “folha + ovos” podemos substituir o background por outra cor, como a preta:
=extract_pixels(im2,target =MatrizSegmentada,valueTarget =1,valueSelect = c(0,0,0),plot=T ) im3
Agora, se fazermos outra segmentação apenas para selecionar os pixeis claros, conseguiremos obter os pixels correspondentes apenas aos ovos.
Para isso, vamos ver qual é a melhor banda para considerarmos na segmentação:
=gray_scale(im3,method = "r",plot=T) r
=gray_scale(im3,method = "g",plot=T) g
=gray_scale(im3,method = "b",plot=T) b
Como pode-se observar, o canal “azul” continua sendo melhor para a segmentação dos ovos.
Logo, vamos fazer outra segmentação para obter os pixeis correspondentes apenas aos ovos
=segmentation(b,treshold = 0.50,fillHull = T,selectHigher = T,plot = T) MatrizSegmentada2
Ótimo, conseguimos agora obter o número de objetos pela seguinte função:
=measure_image(MatrizSegmentada2) Medidas
$ObjectNumber
Medidas#> [1] 157
Agora se estiver com dúvida que este valor está correto é só contar, rsrsrsrs.
Apenas para verificar se os pontos correspondem a todos os ovos é só substituir na imagem os pixeis correspondentes aos ovos por outra cor:
=extract_pixels(im2,target =MatrizSegmentada2,valueTarget =0,valueSelect = c(1,0,0),plot=F ) im4
Para a melhor visualização podemos apresentar as imagens lado a lado:
=join_image(im2,im4,plot = TRUE) im5