Exemplo: Estimação da área foliar

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 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.935  88.356 4585       254      39.796    10.674     25.199     62.363
#> 2   64.936  79.766 3570       216      34.812     7.488     25.347     50.583
#> 3  408.175  89.955 4439       234      38.232     8.114     26.535     55.161
#> 4  179.859  86.146 3704       216      34.973     7.633     25.321     50.960
#> 5  332.603  91.847 4574       240      39.031     7.624     29.693     57.364
#> 6  498.520 102.619 5621       262      43.209     8.304     33.336     60.914
#> 7  120.907  85.163 1993       184      27.623     9.029     14.703     45.862
#> 8  430.247 221.532 4518       256      39.989    10.653     26.737     62.426
#> 9  122.456 219.494 3815       217      35.202     6.107     25.352     48.175
#> 10 207.372 227.941 4291       243      38.532     9.147     27.003     57.659
#> 11 508.695 223.640 3448       203      33.485     6.314     24.936     47.652
#> 12 353.056 213.249 2245       160      26.689     4.052     21.120     36.315
#> 13 283.712 222.959 2490       182      28.878     6.959     19.050     43.273
#> 14 511.968 330.877 3493       205      33.836     6.583     25.490     50.371
#> 15 364.445 339.596 4716       254      40.212     9.848     27.814     60.063
#> 16 129.296 341.431 4686       235      38.907     6.599     29.599     55.056
#> 17 434.539 340.207 3117       214      33.028     8.865     21.319     51.383
#> 18 292.677 338.505 2985       202      31.855     7.539     20.896     47.007
#> 19 223.372 354.283 4518       237      38.679     7.370     29.927     55.505
#> 20 498.564 470.491 5197       255      41.329     8.335     29.596     60.887
#> 21 308.946 487.006 4568       236      38.493     6.592     30.469     54.063
#> 22  84.144 480.331 2306       192      29.231     8.959     17.372     47.872
#> 23 226.510 486.956 3146       194      31.882     5.647     24.378     45.427
#> 24 371.566 483.601 2735       206      31.615     9.005     19.381     50.534
#> 25 148.370 483.270 2954       199      31.447     6.572     22.041     45.454
#> 26 434.005 481.215 2398       171      27.862     5.286     20.898     39.483
#> 27 509.508 597.362 4130       227      37.324     8.402     25.701     55.824
#> 28 436.677 608.850 4405       249      39.355     9.578     27.451     60.991
#> 29 351.735 607.202 4485       237      38.558     8.020     27.254     56.272
#>    majoraxis eccentricity  theta
#> 1    109.803        0.872 -1.476
#> 2     88.458        0.810  1.433
#> 3    100.155        0.823 -1.495
#> 4     92.161        0.829 -1.544
#> 5     98.421        0.794  1.396
#> 6    108.316        0.789  1.488
#> 7     76.482        0.894 -1.434
#> 8    107.543        0.864  1.568
#> 9     87.435        0.767  1.408
#> 10   100.482        0.838 -1.373
#> 11    85.255        0.793  1.526
#> 12    65.442        0.743  1.366
#> 13    78.009        0.851  1.430
#> 14    86.469        0.799 -1.423
#> 15   106.888        0.848  1.460
#> 16    97.029        0.770  1.324
#> 17    90.800        0.874  1.525
#> 18    83.451        0.833  1.415
#> 19    97.138        0.789 -1.540
#> 20   107.033        0.813  1.560
#> 21    95.610        0.765  1.529
#> 22    79.761        0.880  1.511
#> 23    80.331        0.781  1.387
#> 24    82.860        0.852 -1.566
#> 25    79.967        0.805  1.305
#> 26    70.706        0.788 -1.550
#> 27    97.685        0.831  1.323
#> 28   102.599        0.841  1.502
#> 29    99.173        0.810  1.351
#> 
#> 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,plot = FALSE )
#numero de objetos e medias
medidasref
#> $ObjectNumber
#> [1] 29
#> 
#> $measures
#>          x       y     area perimeter radius.mean radius.sd radius.min
#> 1  251.935  88.356 6.265126  357.6456    56.03490 15.029565   35.48155
#> 2   64.936  79.766 4.878190  304.1396    49.01717 10.543506   35.68994
#> 3  408.175  89.955 6.065626  329.4846    53.83271 11.424948   37.36270
#> 4  179.859  86.146 5.061292  304.1396    49.24386 10.747674   35.65333
#> 5  332.603  91.847 6.250095  337.9329    54.95774 10.735001   41.80934
#> 6  498.520 102.619 7.680757  368.9101    60.84059 11.692478   46.93888
#> 7  120.907  85.163 2.723314  259.0819    38.89467 12.713317   20.70261
#> 8  430.247 221.532 6.173574  360.4617    56.30666 14.999996   37.64713
#> 9  122.456 219.494 5.212967  305.5477    49.56631  8.598984   35.69698
#> 10 207.372 227.941 5.863393  342.1570    54.25512 12.879467   38.02167
#> 11 508.695 223.640 4.711484  285.8349    47.14868  8.890451   35.11123
#> 12 353.056 213.249 3.067657  225.2886    37.57955  5.705434   29.73809
#> 13 283.712 222.959 3.402435  256.2658    40.66177  9.798646   26.82342
#> 14 511.968 330.877 4.772974  288.6510    47.64290  9.269217   35.89129
#> 15 364.445 339.596 6.444129  357.6456    56.62066 13.866513   39.16361
#> 16 129.296 341.431 6.403136  330.8926    54.78315  9.291746   41.67698
#> 17 434.539 340.207 4.259192  301.3235    46.50520 12.482396   30.01830
#> 18 292.677 338.505 4.078822  284.4268    44.85355 10.615317   29.42269
#> 19 223.372 354.283 6.173574  333.7087    54.46211 10.377356   42.13882
#> 20 498.564 470.491 7.101387  359.0537    58.19345 11.736128   41.67276
#> 21 308.946 487.006 6.241896  332.3007    54.20021  9.281890   42.90199
#> 22  84.144 480.331 3.151010  270.3463    41.15882 12.614753   24.46071
#> 23 226.510 486.956 4.298819  273.1624    44.89157  7.951279   34.32553
#> 24 371.566 483.601 3.737212  290.0591    44.51562 12.679524   27.28949
#> 25 148.370 483.270 4.036463  280.2027    44.27906  9.253729   31.03491
#> 26 434.005 481.215 3.276722  240.7772    39.23119  7.442972   29.42551
#> 27 509.508 597.362 5.643396  319.6282    52.55420 11.830467   36.18839
#> 28 436.677 608.850 6.019167  350.6054    55.41395 13.486338   38.65248
#> 29 351.735 607.202 6.128482  333.7087    54.29173 11.292591   38.37510
#>    radius.max majoraxis eccentricity  theta
#> 1    87.81045 154.60852        0.872 -1.476
#> 2    71.22358 124.55361        0.810  1.433
#> 3    77.66965 141.02362        0.823 -1.495
#> 4    71.75442 129.76764        0.829 -1.544
#> 5    80.77159 138.58205        0.794  1.396
#> 6    85.77018 152.51474        0.789  1.488
#> 7    64.57616 107.69076        0.894 -1.434
#> 8    87.89916 151.42632        0.864  1.568
#> 9    67.83299 123.11317        0.767  1.408
#> 10   81.18697 141.48405        0.838 -1.373
#> 11   67.09657 120.04362        0.793  1.526
#> 12   51.13347  92.14585        0.743  1.366
#> 13   60.93071 109.84086        0.851  1.430
#> 14   70.92507 121.75299        0.799 -1.423
#> 15   84.57193 150.50404        0.848  1.460
#> 16   77.52180 136.62204        0.770  1.324
#> 17   72.35002 127.85128        0.874  1.525
#> 18   66.18838 117.50349        0.833  1.415
#> 19   78.15402 136.77552        0.789 -1.540
#> 20   85.73217 150.70821        0.813  1.560
#> 21   76.12361 134.62401        0.765  1.529
#> 22   67.40635 112.30777        0.880  1.511
#> 23   63.96366 113.11036        0.781  1.387
#> 24   71.15459 116.67133        0.852 -1.566
#> 25   64.00167 112.59783        0.805  1.305
#> 26   55.59418  99.55784        0.788 -1.550
#> 27   78.60319 137.54573        0.831  1.323
#> 28   85.87860 144.46490        0.841  1.502
#> 29   79.23400 139.64091        0.810  1.351
#> 
#> 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)