Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2023-01-04

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.770  88.528 4681       266      40.495    10.801     25.250     62.163
#> 2   64.968  80.076 3625       222      35.015     7.398     25.393     50.899
#> 3  408.066  90.205 4495       241      38.598     8.247     26.092     55.203
#> 4  179.690  86.483 3769       224      35.409     7.859     24.305     51.787
#> 5  332.513  92.024 4622       246      39.361     7.744     29.376     57.522
#> 6  498.467 102.761 5645       268      43.292     8.376     33.213     61.592
#> 7  120.828  85.567 2061       194      28.086     9.118     14.675     46.131
#> 8  430.181 221.963 4573       262      40.217    10.635     26.510     62.758
#> 9  122.340 219.383 3878       223      35.625     6.284     25.507     48.373
#> 10 207.327 228.075 4349       249      38.715     9.014     27.068     57.805
#> 11 508.601 223.595 3500       211      33.886     6.348     24.911     47.178
#> 12 352.931 213.325 2255       163      26.752     4.098     21.056     36.240
#> 13 283.665 223.085 2541       199      29.661     7.387     19.144     44.396
#> 14 511.939 330.935 3531       214      34.079     6.633     25.620     49.830
#> 15 364.326 339.712 4756       258      40.403     9.833     27.880     61.388
#> 16 129.140 341.374 4713       249      39.157     6.638     29.544     54.462
#> 17 434.505 340.499 3183       220      33.529     8.999     22.100     51.196
#> 18 292.608 338.879 3018       208      31.946     7.598     20.838     46.618
#> 19 223.356 354.608 4550       244      38.901     7.496     29.818     55.560
#> 20 498.382 470.626 5252       265      41.584     8.241     29.574     60.543
#> 21 308.835 487.124 4593       238      38.486     6.589     30.341     54.063
#> 22  84.182 480.579 2360       198      29.570     9.084     17.413     48.603
#> 23 226.458 487.008 3171       198      31.917     5.548     24.416     44.499
#> 24 371.423 483.878 2802       210      31.723     8.846     19.963     50.710
#> 25 148.325 483.480 3009       206      31.767     6.532     22.446     45.072
#> 26 433.929 481.313 2425       173      28.037     5.308     20.991     39.076
#> 27 509.540 597.603 4153       231      37.475     8.485     25.305     55.813
#> 28 436.652 608.993 4445       255      39.711     9.725     27.579     60.618
#> 29 351.530 607.446 4513       246      38.692     8.086     27.009     56.684
#>    majoraxis eccentricity  theta
#> 1    110.934        0.872 -1.475
#> 2     89.273        0.811  1.427
#> 3    100.897        0.824 -1.495
#> 4     93.061        0.829 -1.544
#> 5     99.009        0.794  1.396
#> 6    109.042        0.793  1.488
#> 7     78.726        0.898 -1.439
#> 8    108.501        0.865  1.565
#> 9     88.332        0.768  1.406
#> 10   101.000        0.837 -1.373
#> 11    85.652        0.790  1.523
#> 12    65.705        0.745  1.365
#> 13    79.200        0.854  1.432
#> 14    87.131        0.801 -1.425
#> 15   107.700        0.850  1.455
#> 16    97.640        0.773  1.320
#> 17    91.575        0.873  1.518
#> 18    84.298        0.836  1.406
#> 19    97.602        0.789 -1.543
#> 20   107.585        0.813  1.563
#> 21    95.674        0.762  1.526
#> 22    80.766        0.881  1.510
#> 23    80.467        0.778  1.385
#> 24    83.895        0.851 -1.565
#> 25    80.648        0.805  1.299
#> 26    71.131        0.788 -1.554
#> 27    98.285        0.833  1.322
#> 28   103.436        0.843  1.504
#> 29    99.748        0.812  1.345
#> 
#> 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.770  88.528 6.393875  374.4539    57.00568 15.204800   35.54497
#> 2   64.968  80.076 4.951462  312.5142    49.29137 10.414324   35.74627
#> 3  408.066  90.205 6.139813  339.2609    54.33524 11.609479   36.73027
#> 4  179.690  86.483 5.148155  315.3296    49.84601 11.063283   34.21467
#> 5  332.513  92.024 6.313285  346.2995    55.40933 10.901395   41.35323
#> 6  498.467 102.761 7.710622  377.2694    60.94308 11.791075   46.75465
#> 7  120.828  85.567 2.815162  273.0980    39.53727 12.835605   20.65831
#> 8  430.181 221.963 6.246355  368.8230    56.61434 14.971118   37.31870
#> 9  122.340 219.383 5.297040  313.9219    50.15008  8.846122   35.90675
#> 10 207.327 228.075 5.940389  350.5227    54.49994 12.689202   38.10421
#> 11 508.601 223.595 4.780722  297.0292    47.70205  8.936216   35.06775
#> 12 352.931 213.325 3.080151  229.4586    37.65937  5.768843   29.64098
#> 13 283.665 223.085 3.470804  280.1366    41.75443 10.398839   26.94942
#> 14 511.939 330.935 4.823066  301.2524    47.97374  9.337417   36.06583
#> 15 364.326 339.712 6.496319  363.1922    56.87617 13.842126   39.24728
#> 16 129.140 341.374 6.437584  350.5227    55.12215  9.344455   41.58972
#> 17 434.505 340.499 4.347725  309.6987    47.19949 12.668086   31.11065
#> 18 292.608 338.879 4.122349  292.8061    44.97107 10.695868   29.33410
#> 19 223.356 354.608 6.214939  343.4840    54.76177 10.552280   41.97544
#> 20 498.382 470.626 7.173815  373.0462    58.53869 11.601033   41.63196
#> 21 308.835 487.124 6.273674  335.0377    54.17757  9.275477   42.71168
#> 22  84.182 480.579 3.223573  278.7289    41.62633 12.787742   24.51265
#> 23 226.458 487.008 4.331334  278.7289    44.93025  7.810039   34.37093
#> 24 371.423 483.878 3.827310  295.6215    44.65715 12.452705   28.10234
#> 25 148.325 483.480 4.110055  289.9906    44.71909  9.195237   31.59772
#> 26 433.929 481.313 3.312358  243.5358    39.46829  7.472186   29.54948
#> 27 509.540 597.603 5.672668  325.1837    52.75436 11.944517   35.62239
#> 28 436.652 608.993 6.071517  358.9690    55.90203 13.690092   38.82355
#> 29 351.530 607.446 6.164400  346.2995    54.46756 11.382836   38.02115
#>    radius.max majoraxis eccentricity  theta
#> 1    87.50819 156.16418        0.872 -1.475
#> 2    71.65162 125.67152        0.811  1.427
#> 3    77.71045 142.03488        0.824 -1.495
#> 4    72.90167 131.00397        0.829 -1.544
#> 5    80.97496 139.37710        0.794  1.396
#> 6    86.70438 153.50077        0.793  1.488
#> 7    64.93960 110.82428        0.898 -1.439
#> 8    88.34579 152.73919        0.865  1.565
#> 9    68.09571 124.34686        0.768  1.406
#> 10   81.37334 142.17987        0.837 -1.373
#> 11   66.41349 120.57416        0.790  1.523
#> 12   51.01583  92.49434        0.745  1.365
#> 13   62.49720 111.49154        0.854  1.432
#> 14   70.14676 122.65618        0.801 -1.425
#> 15   86.41721 151.61161        0.850  1.455
#> 16   76.66733 137.44993        0.773  1.320
#> 17   72.06971 128.91210        0.873  1.518
#> 18   65.62516 118.66811        0.836  1.406
#> 19   78.21301 137.39644        0.789 -1.543
#> 20   85.22768 151.44972        0.813  1.563
#> 21   76.10565 134.68235        0.762  1.526
#> 22   68.41949 113.69604        0.881  1.510
#> 23   62.64220 113.27513        0.778  1.385
#> 24   71.38556 118.10080        0.851 -1.565
#> 25   63.44882 113.52992        0.805  1.299
#> 26   55.00813 100.13264        0.788 -1.554
#> 27   78.56916 138.35791        0.833  1.322
#> 28   85.33326 145.60908        0.843  1.504
#> 29   79.79529 140.41741        0.812  1.345
#> 
#> 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)