The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Exemplo: Contagem de objetos

Alcinei Mistico Azevedo (ICA-UFMG)

2024-05-07

Introdução

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:

https://www.youtube.com/channel/UCDGyvLCJnv9RtTY1YMBMVNQ

https://www.expstat.com/

Abrindo as imagens no R

Ativação dos pacotes

Após a instalação dos pacotes é necessário fazer sua ativação

 library(EBImage)
library(ExpImage)

Abrindo as imagens.

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
end=example_image(2)
im=read_image(end,plot=TRUE)

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)
im2=resize_image(im,w=1000,plot=FALSE)

Após criação do objeto contendo a imagem (im) precisamos proceder alguma metodologia de segmentação.

Metodologias de segementaçã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
r=gray_scale(im2,method = "r",plot=T)

g=gray_scale(im2,method = "g",plot=T)

b=gray_scale(im2,method = "b",plot=T)

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:

MatrizSegmentada=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)

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:

MatrizSegmentada=segmentation(r,treshold = "otsu",fillHull = F,selectHigher = T,plot=T)
#> [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)

MatrizSegmentada=segmentation(b,treshold = 0.4,fillHull = F,selectHigher = F,plot=T)

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:

MatrizSegmentada=segmentation(b,treshold = 0.4,fillHull = T,selectHigher = F,plot=T)

Agora que temos apenas os pixels correspondente à “folha + ovos” podemos substituir o background por outra cor, como a preta:

im3=extract_pixels(im2,target =MatrizSegmentada,valueTarget =1,valueSelect = c(0,0,0),plot=T )

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:

r=gray_scale(im3,method = "r",plot=T)

g=gray_scale(im3,method = "g",plot=T)

b=gray_scale(im3,method = "b",plot=T)

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

MatrizSegmentada2=segmentation(b,treshold = 0.50,fillHull = T,selectHigher = T,plot = T)

Ótimo, conseguimos agora obter o número de objetos pela seguinte função:

Medidas=measure_image(MatrizSegmentada2)

Medidas$ObjectNumber
#> [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:

im4=extract_pixels(im2,target =MatrizSegmentada2,valueTarget =0,valueSelect = c(1,0,0),plot=F )

Para a melhor visualização podemos apresentar as imagens lado a lado:

im5=join_image(im2,im4,plot = TRUE)

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.