Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2022-07-05

Introdução

Obrigado por utilizar o pacote ExpImage. Este pacote foi desenvolvido a fim de facilitar o uso da análise 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 imagens contidas no banco de dados do pacote. Vamos utilizar neste exemplo 4 imagens. Uma da imagem a ser avaliada e 3 de paletas de cores a serem utilizadas na segmentação.

#######################################################
#Abrir imagem das folhas
end1=example_image(3)
im=read_image(end1,plot=TRUE)


#Abrir paleta de cores do fundo
end2=example_image(4)
fundo=read_image(end2,plot=TRUE)



#Abrir paleta de cores das folhas
end3=example_image(5)
folhas=read_image(end3,plot=TRUE)


#Abrir paleta de cores referência
end4=example_image(6)
ref=read_image(end4,plot=TRUE)

Segmentação

Para resolver este problema nós vamos fazer duas segmentações. A primeira para obter os pixels referente apenas às folhas. A segunda segmentação será feita para obter os pixels correspondente apenas ao objeto de referência.

#################################################################
#Segmentacao para separar as folhas do restante
folhas.seg=segmentation_logit(im,foreground=folhas,background=list(fundo,ref),sample=2000,fillHull=TRUE,plot=TRUE)


#Segmentacao para separar o objeto de referencia do restante
ref.seg=segmentation_logit(im,foreground=ref,background=list(fundo,folhas),sample=2000,fillHull=TRUE,plot=TRUE)

Estimação da área foliar

Agora que temos os pixels referentes apenas às folhas podemos estimar várias medidas com a função measure_image

medidas=measure_image(folhas.seg,noise = 1000)

#numero de objetos e medias
medidas
#> $ObjectNumber
#> [1] 29
#> 
#> $measures
#>          x       y area perimeter radius.mean radius.sd radius.min radius.max
#> 1  251.868  88.446 4567       254      39.823    10.684     25.134     62.693
#> 2   64.941  79.789 3559       214      34.696     7.412     25.440     50.666
#> 3  408.108  90.071 4419       233      38.107     8.074     26.350     55.386
#> 4  179.808  86.242 3688       212      34.787     7.601     25.395     51.379
#> 5  332.538  91.887 4549       238      38.965     7.680     29.586     57.124
#> 6  498.418 102.705 5605       259      43.112     8.262     33.221     60.761
#> 7  120.817  85.232 1987       183      27.505     8.931     14.841     45.155
#> 8  430.162 221.732 4500       251      39.664    10.525     26.451     61.750
#> 9  122.380 219.562 3796       212      35.084     6.143     25.718     47.333
#> 10 207.317 227.966 4280       240      38.370     9.080     26.791     57.619
#> 11 508.656 223.668 3433       200      33.354     6.272     25.108     47.799
#> 12 353.010 213.297 2226       160      26.615     4.082     21.052     35.433
#> 13 283.609 222.918 2461       179      28.668     6.886     18.919     42.205
#> 14 511.920 330.953 3482       205      33.785     6.553     25.353     49.212
#> 15 364.322 339.679 4683       252      40.107     9.901     27.531     59.865
#> 16 129.257 341.505 4649       231      38.639     6.603     29.791     54.512
#> 17 434.397 340.397 3084       210      32.838     8.931     21.514     51.046
#> 18 292.483 338.564 2939       201      31.651     7.679     20.107     46.880
#> 19 223.234 354.427 4464       231      38.327     7.379     29.434     54.949
#> 20 498.497 470.512 5175       254      41.256     8.376     29.620     60.728
#> 21 308.735 487.152 4513       228      38.261     6.636     29.736     54.803
#> 22  84.061 480.409 2296       192      29.207     8.940     17.300     47.864
#> 23 226.418 487.005 3116       192      31.736     5.732     24.589     45.391
#> 24 371.519 483.660 2719       203      31.509     8.985     19.401     50.138
#> 25 148.156 483.419 2917       193      31.194     6.628     22.258     45.439
#> 26 433.929 481.277 2374       163      27.582     5.247     20.709     39.376
#> 27 509.498 597.416 4115       226      37.220     8.405     25.593     55.598
#> 28 436.581 608.967 4372       245      39.084     9.535     27.774     60.318
#> 29 351.604 607.292 4449       239      38.471     8.023     27.256     56.599
#>    majoraxis eccentricity  theta
#> 1    109.598        0.872 -1.477
#> 2     88.177        0.809  1.430
#> 3     99.875        0.822 -1.497
#> 4     92.015        0.829 -1.544
#> 5     98.303        0.796  1.396
#> 6    108.193        0.789  1.486
#> 7     76.490        0.895 -1.436
#> 8    107.569        0.866  1.565
#> 9     87.363        0.769  1.406
#> 10   100.384        0.838 -1.376
#> 11    84.932        0.792  1.525
#> 12    65.329        0.746  1.368
#> 13    77.573        0.852  1.427
#> 14    86.261        0.799 -1.423
#> 15   106.803        0.850  1.458
#> 16    97.121        0.775  1.317
#> 17    90.589        0.876  1.519
#> 18    83.417        0.839  1.416
#> 19    96.746        0.791 -1.547
#> 20   106.967        0.815  1.560
#> 21    95.371        0.769  1.525
#> 22    79.470        0.879  1.509
#> 23    80.281        0.785  1.387
#> 24    82.500        0.851 -1.569
#> 25    80.015        0.811  1.301
#> 26    70.312        0.788 -1.552
#> 27    97.595        0.832  1.322
#> 28   102.411        0.842  1.499
#> 29    99.053        0.813  1.349
#> 
#> attr(,"class")
#> [1] "measurements"

Com o comando acima temos várias medidas de áreas em pixels. Logo, é legal converter essa medida para cm² a partir do objeto de referência. Sabendo a área do objeto de referência podemos fazer a conversão com da seguinte forma:

#Convertendo a area dos objetos para cm2

#Identificando a area do objeto de referência (maior area)
# A area conhecida do objeto de referência tem 8.5 x 5.5 cm 
#e sua areasegmentada esta no objeto ref.seg

medidasref=measure_image(img = folhas.seg,noise =1000,id=ref.seg,length =8.5,width =5.5 )

#numero de objetos e medias
medidasref
#> $ObjectNumber
#> [1] 29
#> 
#> $measures
#>          x       y     area perimeter radius.mean radius.sd radius.min
#> 1  251.868  88.446 6.240348  357.3112    56.02049 15.029578   35.35693
#> 2   64.941  79.789 4.863017  301.0417    48.80815 10.426735   35.78739
#> 3  408.108  90.071 6.038120  327.7697    53.60653 11.357995   37.06752
#> 4  179.808  86.242 5.039282  298.2282    48.93616 10.692608   35.72409
#> 5  332.538  91.887 6.215752  334.8034    54.81351 10.803740   41.61972
#> 6  498.418 102.705 7.658670  364.3449    60.64725 11.622461   46.73321
#> 7  120.817  85.232 2.715036  257.4329    38.69230 12.563568   20.87738
#> 8  430.162 221.732 6.148799  353.0910    55.79682 14.805907   37.20960
#> 9  122.380 219.562 5.186853  298.2282    49.35396  8.641585   36.17846
#> 10 207.317 227.966 5.848191  337.6169    53.97650 12.773172   37.68789
#> 11 508.656 223.668 4.690850  281.3474    46.92031  8.823054   35.32035
#> 12 353.010 213.297 3.041606  225.0779    37.44031  5.742300   29.61463
#> 13 283.609 222.918 3.362710  251.8059    40.32834  9.686791   26.61406
#> 14 511.920 330.953 4.757804  288.3811    47.52661  9.218348   35.66500
#> 15 364.322 339.679 6.398850  354.4977    56.42000 13.928103   38.72888
#> 16 129.257 341.505 6.352392  324.9562    54.35491  9.288684   41.90810
#> 17 434.397 340.397 4.213977  295.4148    46.19443 12.563568   30.26454
#> 18 292.483 338.564 4.015849  282.7541    44.52463 10.802333   28.28526
#> 19 223.234 354.427 6.099608  324.9562    53.91601 10.380312   41.40590
#> 20 498.497 470.512 7.071119  357.3112    58.03634 11.782829   41.66755
#> 21 308.735 487.152 6.166562  320.7360    53.82316  9.335107   41.83073
#> 22  84.061 480.409 3.137254  270.0935    41.08657 12.576229   24.33655
#> 23 226.418 487.005 4.257702  270.0935    44.64421  8.063417   34.59026
#> 24 371.519 483.660 3.715241  285.5676    44.32488 12.639532   27.29210
#> 25 148.156 483.419 3.985788  271.5002    43.88175  9.323853   31.31115
#> 26 433.929 481.277 3.243833  229.2981    38.80062  7.381149   29.13212
#> 27 509.498 597.416 5.622735  317.9226    52.35875 11.823625   36.00262
#> 28 436.581 608.967 5.973900  344.6506    54.98091 13.413237   39.07071
#> 29 351.604 607.292 6.079112  336.2101    54.11858 11.286251   38.34202
#>    radius.max majoraxis eccentricity  theta
#> 1    88.19256 154.17556        0.872 -1.477
#> 2    71.27374 124.04185        0.809  1.430
#> 3    77.91354 140.49786        0.822 -1.497
#> 4    72.27674 129.44091        0.829 -1.544
#> 5    80.35844 138.28647        0.796  1.396
#> 6    85.47475 152.19910        0.789  1.486
#> 7    63.52121 107.60131        0.895 -1.436
#> 8    86.86601 151.32129        0.866  1.565
#> 9    66.58508 122.89676        0.769  1.406
#> 10   81.05478 141.21389        0.838 -1.376
#> 11   67.24062 119.47699        0.792  1.525
#> 12   49.84491  91.90072        0.746  1.368
#> 13   59.37134 109.12481        0.852  1.427
#> 14   69.22834 121.34654        0.799 -1.423
#> 15   84.21431 150.24373        0.850  1.458
#> 16   76.68405 136.62370        0.775  1.317
#> 17   71.80830 127.43490        0.876  1.519
#> 18   65.94783 117.34578        0.839  1.416
#> 19   77.29879 136.09618        0.791 -1.547
#> 20   85.42832 150.47444        0.815  1.560
#> 21   77.09341 134.16191        0.769  1.525
#> 22   67.33206 111.79339        0.879  1.509
#> 23   63.85320 112.93425        0.785  1.387
#> 24   70.53098 116.05580        0.851 -1.569
#> 25   63.92072 112.56006        0.811  1.301
#> 26   55.39168  98.91049        0.788 -1.552
#> 27   78.21176 137.29050        0.832  1.322
#> 28   84.85156 144.06534        0.842  1.499
#> 29   79.61991 139.34152        0.813  1.349
#> 
#> attr(,"class")
#> [1] "measurements"

Para a melhor visualização dos resultados, podemos sobrepor a área das folhas sobre a imagem com o seguinte comando:

#Plotar resultados das areas em pixel e salvar em imagem jpg
plot_meansures(im,medidasref$measures[,1],coordy=medidasref$measures[,2],text=round(medidasref$measures[,3],1),col="red",
               cex = 0.9 ,plot=TRUE)