Exemplo: Contagem de objetos

Alcinei Mistico Azevedo (ICA-UFMG)

2021-09-06

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

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

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.

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)

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

Como foi possível observar, dependendo do valor de limiar escolhido, pode não aparecer toda a semente 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)
#> The treshold by Otsu melhod is (O valor do limiar pelo etodo otsu e): 0.4668

Mas neste caso o melhor é considerar o limiar de 0.30

MatrizSegmentada=segmentation(b,treshold = 0.30,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.30,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 àos 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] 58

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

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

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