Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2024-05-03

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.978  88.319 4596       255      39.885    10.663     25.290     62.584
#> 2   64.984  79.730 3583       216      34.880     7.493     25.349     50.244
#> 3  408.209  89.951 4450       235      38.332     8.198     26.477     55.527
#> 4  179.888  86.115 3714       216      35.003     7.628     25.299     50.963
#> 5  332.706  91.761 4595       241      39.159     7.636     29.903     57.180
#> 6  498.513 102.614 5632       262      43.241     8.285     33.337     60.910
#> 7  120.931  85.234 1997       185      27.560     9.046     14.591     45.839
#> 8  430.317 221.474 4540       258      40.041    10.631     26.529     62.553
#> 9  122.551 219.411 3839       213      35.198     6.093     25.737     47.986
#> 10 207.462 227.858 4312       242      38.535     9.018     27.168     58.012
#> 11 508.742 223.613 3459       203      33.548     6.343     24.920     47.619
#> 12 353.102 213.194 2261       160      26.798     4.065     21.136     36.391
#> 13 283.772 222.857 2501       183      28.858     6.860     19.330     42.624
#> 14 512.010 330.866 3502       205      33.868     6.575     25.460     50.372
#> 15 364.540 339.504 4740       254      40.223     9.851     27.690     59.855
#> 16 129.392 341.377 4710       239      38.952     6.477     29.112     53.813
#> 17 434.654 340.102 3140       213      33.051     8.842     22.123     51.195
#> 18 292.817 338.404 3013       205      32.001     7.495     21.086     47.286
#> 19 223.578 354.074 4565       235      38.772     7.313     30.191     55.796
#> 20 498.604 470.412 5212       256      41.428     8.329     29.770     60.365
#> 21 309.112 486.982 4610       234      38.584     6.577     30.528     53.968
#> 22  84.204 480.257 2318       192      29.278     8.941     17.418     47.875
#> 23 226.612 486.934 3166       194      31.925     5.595     24.199     45.088
#> 24 371.605 483.569 2744       206      31.644     8.988     19.380     50.535
#> 25 148.527 483.259 2975       198      31.551     6.674     22.091     44.933
#> 26 434.101 481.160 2412       171      27.977     5.208     21.033     40.072
#> 27 509.516 597.312 4141       227      37.368     8.396     25.692     55.840
#> 28 436.721 608.731 4427       247      39.357     9.555     27.563     60.298
#> 29 351.847 607.111 4515       237      38.666     7.999     27.180     56.290
#>    majoraxis eccentricity  theta
#> 1    109.846        0.872 -1.476
#> 2     88.408        0.808  1.432
#> 3    100.289        0.823 -1.494
#> 4     92.242        0.829 -1.543
#> 5     98.445        0.792  1.402
#> 6    108.327        0.788  1.488
#> 7     76.747        0.895 -1.434
#> 8    107.621        0.863  1.569
#> 9     87.593        0.765  1.411
#> 10   100.537        0.837 -1.371
#> 11    85.407        0.794  1.528
#> 12    65.662        0.743  1.370
#> 13    77.997        0.850  1.432
#> 14    86.540        0.799 -1.421
#> 15   106.934        0.847  1.463
#> 16    97.085        0.768  1.326
#> 17    90.943        0.873  1.529
#> 18    83.592        0.831  1.418
#> 19    97.380        0.786 -1.535
#> 20   107.143        0.813  1.562
#> 21    95.807        0.762  1.530
#> 22    79.718        0.878  1.512
#> 23    80.446        0.779  1.389
#> 24    82.842        0.850 -1.565
#> 25    80.163        0.804  1.308
#> 26    70.695        0.785 -1.550
#> 27    97.742        0.831  1.324
#> 28   102.840        0.841  1.506
#> 29    99.205        0.808  1.353
#> 
#> 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.978  88.319 6.282176  358.3488    56.04997 14.984602   35.53977
#> 2   64.984  79.730 4.897528  303.5425    49.01650 10.529834   35.62268
#> 3  408.209  89.951 6.082612  330.2430    53.86756 11.520563   37.20785
#> 4  179.888  86.115 5.076589  303.5425    49.18935 10.719548   35.55242
#> 5  332.706  91.761 6.280810  338.6748    55.02973 10.730790   42.02237
#> 6  498.513 102.614 7.698263  368.1858    60.76612 11.642823   46.84813
#> 7  120.931  85.234 2.729658  259.9786    38.72978 12.712249   20.50458
#> 8  430.317 221.474 6.205631  362.5647    56.26920 14.939632   37.28092
#> 9  122.551 219.411 5.247449  299.3267    49.46338  8.562429   36.16794
#> 10 207.462 227.858 5.893983  340.0801    54.15283 12.672900   38.17890
#> 11 508.742 223.613 4.728035  285.2738    47.14465  8.913751   35.01981
#> 12 353.102 213.194 3.090514  224.8463    37.65895  5.712502   29.70220
#> 13 283.772 222.857 3.418565  257.1680    40.55384  9.640286   27.16425
#> 14 512.010 330.866 4.786811  288.0843    47.59434  9.239778   35.77867
#> 15 364.540 339.504 6.479007  356.9435    56.52496 13.843507   38.91247
#> 16 129.392 341.377 6.438001  335.8642    54.73884  9.102060   40.91079
#> 17 434.654 340.102 4.292000  299.3267    46.44622 12.425569   31.08922
#> 18 292.817 338.404 4.118407  288.0843    44.97067 10.532645   29.63193
#> 19 223.578 354.074 6.239803  330.2430    54.48588 10.276882   42.42709
#> 20 498.604 470.412 7.124174  359.7541    58.21833 11.704656   41.83547
#> 21 309.112 486.982 6.301313  328.8377    54.22169  9.242589   42.90068
#> 22  84.204 480.257 3.168426  269.8156    41.14407 12.564693   24.47733
#> 23 226.612 486.934 4.327539  272.6262    44.86387  7.862595   34.00660
#> 24 371.605 483.569 3.750716  289.4896    44.46898 12.630742   27.23451
#> 25 148.527 483.259 4.066465  278.2473    44.33829  9.378902   31.04425
#> 26 434.101 481.160 3.296912  240.3045    39.31578  7.318748   29.55745
#> 27 509.516 597.312 5.660246  319.0007    52.51286 11.798810   36.10470
#> 28 436.721 608.731 6.051174  347.1065    55.30798 13.427541   38.73399
#> 29 351.847 607.111 6.171459  333.0536    54.33692 11.240910   38.19577
#>    radius.max majoraxis eccentricity  theta
#> 1    87.94864 154.36543        0.872 -1.476
#> 2    70.60736 124.23883        0.808  1.432
#> 3    78.03151 140.93508        0.823 -1.494
#> 4    71.61777 129.62671        0.829 -1.543
#> 5    80.35445 138.34372        0.792  1.402
#> 6    85.59618 152.23079        0.788  1.488
#> 7    64.41706 107.85175        0.895 -1.434
#> 8    87.90507 151.23866        0.863  1.569
#> 9    67.43422 123.09352        0.765  1.411
#> 10   81.52365 141.28359        0.837 -1.371
#> 11   66.91848 120.02156        0.794  1.528
#> 12   51.13989  92.27412        0.743  1.370
#> 13   59.89906 109.60836        0.850  1.432
#> 14   70.78724 121.61375        0.799 -1.421
#> 15   84.11360 150.27322        0.847  1.463
#> 16   75.62284 136.43253        0.768  1.326
#> 17   71.94379 127.80124        0.873  1.529
#> 18   66.45052 117.47096        0.831  1.418
#> 19   78.40953 136.84709        0.786 -1.535
#> 20   84.83030 150.56693        0.813  1.562
#> 21   75.84066 134.63657        0.762  1.530
#> 22   67.27823 112.02687        0.878  1.512
#> 23   63.36169 113.04992        0.779  1.389
#> 24   71.01630 116.41699        0.850 -1.565
#> 25   63.14387 112.65222        0.804  1.308
#> 26   56.31276  99.34694        0.785 -1.550
#> 27   78.47136 137.35580        0.831  1.324
#> 28   84.73614 144.51997        0.841  1.506
#> 29   79.10374 139.41174        0.808  1.353
#> 
#> 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)