--- title: "Exemplo: Contagem de objetos" author: "Alcinei Mistico Azevedo (ICA-UFMG)" date: "`r Sys.Date()`" output: rmarkdown::html_vignette fig_caption: yes vignette: > %\VignetteIndexEntry{Exemplo: Contagem de objetos} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` # 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 ```{r} 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. ```{r} # 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. ```{r} ##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). ```{r} #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: ```{r} 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: ```{r} 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: ```{r} MatrizSegmentada=segmentation(r,treshold = "otsu",fillHull = F,selectHigher = T,plot=T) ``` Mas neste caso o melhor é considerar o limiar de 0.40 ```{r} 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: ```{r} 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: ```{r} 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} 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 ```{r} 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: ```{r} Medidas=measure_image(MatrizSegmentada2) Medidas$ObjectNumber ``` 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: ```{r} 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: ```{r} im5=join_image(im2,im4,plot = TRUE) ```