Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2022-08-24

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.957  88.336 4584       253      39.814    10.669     25.171     62.495
#> 2   64.956  79.761 3571       214      34.815     7.538     25.427     50.271
#> 3  408.175  89.951 4444       232      38.167     8.082     26.354     55.249
#> 4  179.873  86.130 3701       215      34.958     7.646     25.373     51.134
#> 5  332.652  91.806 4579       239      39.046     7.636     29.798     57.218
#> 6  498.493 102.640 5628       261      43.254     8.292     33.470     60.988
#> 7  120.878  85.142 1992       184      27.617     9.024     14.712     44.917
#> 8  430.272 221.621 4531       251      39.753    10.528     26.759     61.774
#> 9  122.488 219.443 3827       214      35.177     6.073     25.510     47.793
#> 10 207.394 227.900 4298       241      38.472     9.061     27.142     57.835
#> 11 508.706 223.656 3450       202      33.484     6.313     24.987     47.487
#> 12 353.085 213.239 2249       159      26.718     4.085     21.019     36.197
#> 13 283.725 222.870 2484       181      28.839     6.890     19.099     42.606
#> 14 511.981 330.890 3498       205      33.859     6.573     25.292     50.375
#> 15 364.459 339.596 4720       254      40.253     9.852     27.823     59.823
#> 16 129.367 341.459 4692       232      38.832     6.506     29.456     54.091
#> 17 434.551 340.251 3116       212      32.975     8.864     21.391     51.741
#> 18 292.701 338.480 2988       200      31.867     7.540     20.878     46.952
#> 19 223.471 354.185 4537       235      38.589     7.323     30.090     55.287
#> 20 498.556 470.469 5200       254      41.334     8.341     29.660     60.736
#> 21 309.024 487.016 4577       231      38.426     6.548     30.383     54.570
#> 22  84.107 480.280 2314       192      29.272     8.931     17.352     47.873
#> 23 226.503 486.926 3148       195      31.892     5.635     24.287     45.272
#> 24 371.616 483.638 2739       204      31.502     9.008     19.240     50.125
#> 25 148.391 483.273 2954       195      31.369     6.517     22.406     45.693
#> 26 434.001 481.184 2394       168      27.800     5.201     21.007     39.957
#> 27 509.496 597.334 4128       227      37.324     8.402     25.701     55.824
#> 28 436.665 608.812 4404       246      39.286     9.514     27.843     61.008
#> 29 351.793 607.149 4498       238      38.588     8.004     27.117     56.360
#>    majoraxis eccentricity  theta
#> 1    109.631        0.871 -1.477
#> 2     88.391        0.809  1.431
#> 3    100.125        0.822 -1.495
#> 4     92.130        0.829 -1.543
#> 5     98.374        0.793  1.399
#> 6    108.315        0.788  1.488
#> 7     76.489        0.895 -1.433
#> 8    107.847        0.865  1.567
#> 9     87.468        0.765  1.410
#> 10   100.504        0.838 -1.372
#> 11    85.243        0.793  1.527
#> 12    65.558        0.744  1.370
#> 13    77.858        0.851  1.428
#> 14    86.453        0.799 -1.421
#> 15   106.908        0.848  1.460
#> 16    97.146        0.771  1.324
#> 17    90.746        0.874  1.524
#> 18    83.283        0.832  1.415
#> 19    97.172        0.787 -1.539
#> 20   107.048        0.813  1.559
#> 21    95.673        0.764  1.530
#> 22    79.515        0.878  1.509
#> 23    80.374        0.781  1.388
#> 24    82.918        0.852 -1.565
#> 25    80.053        0.806  1.308
#> 26    70.569        0.787 -1.550
#> 27    97.616        0.831  1.323
#> 28   102.523        0.841  1.503
#> 29    99.188        0.809  1.352
#> 
#> 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.957  88.336 6.261746  355.6610    55.96951 14.998209   35.38475
#> 2   64.956  79.761 4.877988  300.8358    48.94204 10.596729   35.74463
#> 3  408.175  89.951 6.070506  326.1397    53.65420 11.361470   37.04778
#> 4  179.873  86.130 5.055568  302.2415    49.14307 10.748553   35.66872
#> 5  332.652  91.806 6.254916  335.9801    54.88988 10.734495   41.88927
#> 6  498.493 102.640 7.687851  366.9072    60.80537 11.656683   47.05128
#> 7  120.878  85.142 2.721073  258.6625    38.82328 12.685710   20.68176
#> 8  430.272 221.621 6.189348  352.8494    55.88376 14.799995   37.61712
#> 9  122.488 219.443 5.227684  300.8358    49.45093  8.537269   35.86131
#> 10 207.394 227.900 5.871070  338.7917    54.08296 12.737724   38.15553
#> 11 508.706 223.656 4.712702  283.9665    47.07096  8.874655   35.12609
#> 12 353.085 213.239 3.072135  223.5182    37.55949  5.742589   29.54798
#> 13 283.725 222.870 3.393145  254.4452    40.54113  9.685787   26.84889
#> 14 511.981 330.890 4.778270  288.1838    47.59812  9.240156   35.55485
#> 15 364.459 339.596 6.447522  357.0667    56.58664 13.849691   39.11287
#> 16 129.367 341.459 6.409274  326.1397    54.58904  9.145970   41.40850
#> 17 434.551 340.251 4.256457  298.0242    46.35542 12.460786   30.07092
#> 18 292.701 338.480 4.081609  281.1549    44.79782 10.599540   29.34976
#> 19 223.471 354.185 6.197544  330.3570    54.24744 10.294487   42.29976
#> 20 498.556 470.469 7.103202  357.0667    58.10629 11.725566   41.69527
#> 21 309.024 487.016 6.252184  324.7339    54.01829  9.205012   42.71165
#> 22  84.107 480.280 3.160925  269.9087    41.14983 12.554973   24.39300
#> 23 226.503 486.926 4.300169  274.1260    44.83296  7.921540   34.14205
#> 24 371.616 483.638 3.741475  286.7780    44.28471 12.663218   27.04710
#> 25 148.391 483.273 4.035165  274.1260    44.09774  9.161433   31.49779
#> 26 434.001 481.184 3.270205  236.1701    39.08053  7.311434   29.53111
#> 27 509.496 597.334 5.638850  319.1108    52.46913 11.811318   36.12981
#> 28 436.665 608.812 6.015866  345.8206    55.22726 13.374540   39.14098
#> 29 351.793 607.149 6.144270  334.5744    54.24603 11.251820   38.12039
#>    radius.max majoraxis eccentricity  theta
#> 1    87.85388 154.11648        0.871 -1.477
#> 2    70.66969 124.25782        0.809  1.431
#> 3    77.66764 140.75318        0.822 -1.495
#> 4    71.88288 129.51401        0.829 -1.543
#> 5    80.43561 138.29167        0.793  1.399
#> 6    85.73538 152.26648        0.788  1.488
#> 7    63.14318 107.52629        0.895 -1.433
#> 8    86.84032 151.60857        0.865  1.567
#> 9    67.18619 122.96029        0.765  1.410
#> 10   81.30297 141.28597        0.838 -1.372
#> 11   66.75602 119.83244        0.793  1.527
#> 12   50.88482  92.15977        0.744  1.370
#> 13   59.89443 109.45080        0.851  1.428
#> 14   70.81590 121.53343        0.799 -1.421
#> 15   84.09765 150.28855        0.848  1.460
#> 16   76.03975 136.56538        0.771  1.324
#> 17   72.73618 127.56842        0.874  1.524
#> 18   66.00393 117.07713        0.832  1.415
#> 19   77.72106 136.60193        0.787 -1.539
#> 20   85.38113 150.48536        0.813  1.559
#> 21   76.71312 134.49467        0.764  1.530
#> 22   67.29865 111.78017        0.878  1.509
#> 23   63.64223 112.98773        0.781  1.388
#> 24   70.46445 116.56402        0.852 -1.565
#> 25   64.23406 112.53647        0.806  1.308
#> 26   56.17054  99.20411        0.787 -1.550
#> 27   78.47596 137.22609        0.831  1.323
#> 28   85.76350 144.12423        0.841  1.503
#> 29   79.22946 139.43597        0.809  1.352
#> 
#> 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)