Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2022-12-02

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.882  88.484 4612       258      40.098    10.870     25.156     62.050
#> 2   64.962  79.907 3587       216      34.853     7.439     25.347     50.578
#> 3  408.143  90.113 4460       239      38.475     8.254     26.239     55.915
#> 4  179.787  86.335 3725       220      35.151     7.723     25.048     51.524
#> 5  332.580  91.963 4586       242      39.175     7.703     29.544     56.912
#> 6  498.496 102.701 5620       264      43.187     8.296     33.083     61.485
#> 7  120.867  85.500 2032       190      27.826     9.074     14.586     46.069
#> 8  430.207 221.760 4541       256      39.879    10.523     26.699     62.593
#> 9  122.365 219.420 3832       217      35.289     6.139     25.687     48.645
#> 10 207.324 228.019 4306       244      38.590     9.101     27.151     57.844
#> 11 508.665 223.610 3457       205      33.589     6.347     25.049     47.357
#> 12 352.988 213.283 2246       161      26.731     4.126     21.096     36.223
#> 13 283.668 222.953 2500       185      28.919     6.922     19.248     43.352
#> 14 511.945 330.878 3499       207      33.890     6.606     25.672     50.073
#> 15 364.397 339.705 4726       254      40.268     9.878     27.953     61.317
#> 16 129.214 341.484 4683       241      38.934     6.660     29.447     54.928
#> 17 434.456 340.369 3129       216      33.189     8.918     21.296     51.949
#> 18 292.626 338.720 2983       206      31.861     7.652     20.648     46.812
#> 19 223.310 354.509 4519       238      38.772     7.513     30.034     55.713
#> 20 498.498 470.535 5212       258      41.458     8.333     29.552     60.688
#> 21 308.862 487.112 4564       237      38.510     6.659     30.333     53.974
#> 22  84.151 480.436 2321       194      29.381     8.896     17.613     48.261
#> 23 226.474 486.992 3151       195      31.912     5.671     24.339     45.373
#> 24 371.548 483.643 2755       208      31.633     8.943     19.644     50.621
#> 25 148.334 483.412 2964       198      31.468     6.539     22.100     45.678
#> 26 433.963 481.248 2404       171      27.895     5.263     21.323     39.473
#> 27 509.522 597.477 4131       231      37.456     8.480     25.363     55.318
#> 28 436.670 608.950 4413       251      39.467     9.633     27.519     60.303
#> 29 351.637 607.286 4482       239      38.526     8.094     27.107     57.141
#>    majoraxis eccentricity  theta
#> 1    110.481        0.874 -1.476
#> 2     88.669        0.809  1.430
#> 3    100.465        0.823 -1.495
#> 4     92.657        0.831 -1.543
#> 5     98.647        0.795  1.395
#> 6    108.542        0.790  1.488
#> 7     78.024        0.898 -1.438
#> 8    107.953        0.865  1.566
#> 9     87.747        0.768  1.405
#> 10   100.664        0.838 -1.375
#> 11    85.398        0.794  1.525
#> 12    65.649        0.746  1.365
#> 13    78.226        0.852  1.429
#> 14    86.637        0.800 -1.424
#> 15   107.289        0.850  1.458
#> 16    97.222        0.772  1.321
#> 17    90.953        0.874  1.522
#> 18    83.982        0.838  1.408
#> 19    97.421        0.791 -1.542
#> 20   107.234        0.813  1.562
#> 21    95.592        0.765  1.526
#> 22    80.032        0.880  1.508
#> 23    80.374        0.780  1.389
#> 24    83.060        0.851 -1.566
#> 25    80.187        0.806  1.301
#> 26    70.724        0.787 -1.554
#> 27    97.871        0.832  1.322
#> 28   102.992        0.843  1.503
#> 29    99.482        0.813  1.348
#> 
#> 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.882  88.484 6.307551  363.4258    56.48313 15.311776   35.43542
#> 2   64.962  79.907 4.905721  304.2634    49.09488 10.478776   35.70447
#> 3  408.143  90.113 6.099669  336.6619    54.19692 11.626807   36.96096
#> 4  179.787  86.335 5.094455  309.8979    49.51465 10.878826   35.28329
#> 5  332.580  91.963 6.271992  340.8877    55.18296 10.850654   41.61648
#> 6  498.496 102.701 7.686131  371.8775    60.83438 11.685970   46.60161
#> 7  120.867  85.500 2.779042  267.6391    39.19646 12.781882   20.54623
#> 8  430.207 221.760 6.210448  360.6085    56.17464 14.822982   37.60893
#> 9  122.365 219.420 5.240792  305.6721    49.70904  8.647561   36.18340
#> 10 207.324 228.019 5.889053  343.7050    54.35892 12.819915   38.24563
#> 11 508.665 223.610 4.727928  288.7685    47.31437  8.940556   35.28470
#> 12 352.988 213.283 3.071717  226.7890    37.65401  5.811995   29.71640
#> 13 283.668 222.953 3.419097  260.5960    40.73608  9.750516   27.11325
#> 14 511.945 330.878 4.785368  291.5858    47.73837  9.305390   36.16227
#> 15 364.397 339.705 6.463461  357.7913    56.72259 13.914418   39.37535
#> 16 129.214 341.484 6.404653  339.4791    54.84348  9.381456   41.47984
#> 17 434.456 340.369 4.279342  304.2634    46.75092 12.562136   29.99812
#> 18 292.626 338.720 4.079667  290.1772    44.88027 10.778814   29.08533
#> 19 223.310 354.509 6.180360  335.2532    54.61529 10.583015   42.30670
#> 20 498.498 470.535 7.128134  363.4258    58.39886 11.738089   41.62775
#> 21 308.862 487.112 6.241904  333.8446    54.24623  9.380047   42.72788
#> 22  84.151 480.436 3.174290  273.2736    41.38687 12.531146   24.81015
#> 23 226.474 486.992 4.309430  274.6823    44.95211  7.988324   34.28457
#> 24 371.548 483.643 3.767845  292.9944    44.55910 12.597351   27.67107
#> 25 148.334 483.412 4.053682  278.9082    44.32668  9.211012   31.13066
#> 26 433.963 481.248 3.287804  240.8752    39.29365  7.413604   30.03615
#> 27 509.522 597.477 5.649716  325.3928    52.76153 11.945157   35.72701
#> 28 436.670 608.950 6.035390  353.5654    55.59428 13.569304   38.76401
#> 29 351.637 607.286 6.129757  336.6619    54.26876 11.401427   38.18365
#>    radius.max majoraxis eccentricity  theta
#> 1    87.40531 155.62652        0.874 -1.476
#> 2    71.24554 124.90155        0.809  1.430
#> 3    78.76338 141.51771        0.823 -1.495
#> 4    72.57810 130.51915        0.831 -1.543
#> 5    80.16778 138.95683        0.795  1.395
#> 6    86.60943 152.89519        0.790  1.488
#> 7    64.89404 109.90671        0.898 -1.438
#> 8    88.17019 152.06551        0.865  1.566
#> 9    68.52266 123.60280        0.768  1.405
#> 10   81.48062 141.79803        0.838 -1.375
#> 11   66.70835 120.29393        0.794  1.525
#> 12   51.02470  92.47496        0.746  1.365
#> 13   61.06680 110.19126        0.852  1.429
#> 14   70.53418 122.03922        0.800 -1.424
#> 15   86.37278 151.13018        0.850  1.458
#> 16   77.37307 136.94954        0.772  1.321
#> 17   73.17677 128.11885        0.874  1.522
#> 18   65.94065 118.29931        0.838  1.408
#> 19   78.47884 137.22985        0.791 -1.542
#> 20   85.48676 151.05271        0.813  1.562
#> 21   76.02923 134.65347        0.765  1.526
#> 22   67.98175 112.73524        0.880  1.508
#> 23   63.91363 113.21699        0.780  1.389
#> 24   71.30611 117.00056        0.851 -1.566
#> 25   64.34327 112.95358        0.806  1.301
#> 26   55.60273  99.62374        0.787 -1.554
#> 27   77.92243 137.86374        0.832  1.322
#> 28   84.94444 145.07731        0.843  1.503
#> 29   80.49036 140.13303        0.813  1.348
#> 
#> 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)