Exemplo: Comprimento da plântula

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)
#> Loading required package: raster
#> Loading required package: sp

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.


end1=example_image(10)
im=read_image(end1,plot=TRUE)

Segmentação

Para resolver este problema nós vamos fazer duas segmentações. A primeira para obter os pixeis referente apenas à parte aérea. A segunda segmentação será feita para obter os pixeis correspondente apenas à parte radicular.

Para isso, vamos primeiramente escolher a melhor banda para trabalharmos:

#Selecionando o melhor indice para a segmentacao
r=gray_scale(im,method = "r",plot=T)

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

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

Como foi possível observar, a banda de azul possibilita um bom contraste da plântula do fundo. Logo, vamos escolher um valor de limiar pela tentativa e erro.

Outra opção de explorar outros possíveis índices é por meio do seguinte comando:

plot_indexes(im,NumberCores=2)

Segmentação da parte radicular

plot_image(b,col = 3)

Seg=segmentation(b,treshold = 0.65,selectHigher = TRUE,fillHull = TRUE,plot = TRUE)

Quando se utiliza um limiar de 0.65 torna-se possivel separar apenas os pixels correspondentes às raízes.

A partir dessa imagem segmentada pode-se obter o comprimento da radícula a partir da contagem de pixels após o thinning:

radicula=thinning_image(Seg,plot = TRUE)
#> [1] "a"
#> Warning in class(x) <- "matrix": Setting class(x) to "matrix" sets attribute to
#> NULL; result will no longer be an S4 object
#> [1] "b"


#Obtenção do comprimento da raiz em pixels
sum(radicula)
#> [1] 847

Para a melhor visualização do eixo obtido pelo thinning podemos apresenta-lo sobre a imagem:

im2=mask_pixels(im,TargetPixels=radicula==1,col.TargetPixels = "red",plot=F)
im3=join_image(im,im2,plot=T)

Segmentação da parte aérea

Vamos escolher um novo limiar para conseguir separar o que é parte aérea.

plot_image(b,col = 3)

Seg2=segmentation(b,treshold = 0.5,selectHigher = FALSE,fillHull = TRUE,plot=TRUE)

É possível observar muito ruído. Este problema pode ser amenizado utilizando a função erode do EBImage:

Seg2b=EBImage::erode(Seg2)
EBImage::display(Seg2b)    

Agora é possível fazer o thinning considerando os pixels correspondentes à parte aérea:

PA=thinning_image(Seg2b,plot = TRUE)
#> [1] "a"
#> Warning in class(x) <- "matrix": Setting class(x) to "matrix" sets attribute to
#> NULL; result will no longer be an S4 object
#> [1] "b"


#Obtenção do comprimento da raiz em pixels
sum(PA)
#> [1] 683

Para a melhor visualização podemos destacar em azul o eixo correspondente ao thinning:

im4=mask_pixels(im,TargetPixels=PA==1,plot=F,)
im4=join_image(im,im4,plot=T)

A unidade de medidas dos comprimentos está em pixels, mas podem ser convertido para cm quando se tem um objeto de referencia na imagem ou se sabe a área da imagem escaneada.