Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2022-01-22

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.929  88.236 4536       251      39.702    10.706     24.512     62.390
#> 2   64.912  79.673 3546       213      34.672     7.458     25.488     50.511
#> 3  408.143  89.948 4411       235      38.168     8.107     26.394     55.402
#> 4  179.893  86.066 3676       212      34.726     7.584     25.340     51.374
#> 5  332.544  91.774 4542       240      38.997     7.710     29.689     57.017
#> 6  498.492 102.640 5610       260      43.203     8.313     33.569     60.676
#> 7  120.837  85.047 1965       183      27.447     8.957     14.824     45.150
#> 8  430.229 221.410 4480       248      39.424    10.340     26.785     61.470
#> 9  122.456 219.551 3781       211      34.943     6.094     25.528     47.923
#> 10 207.373 227.883 4268       240      38.369     9.139     26.783     57.288
#> 11 508.686 223.627 3425       200      33.374     6.309     25.131     47.403
#> 12 353.071 213.195 2236       160      26.683     4.094     20.975     35.101
#> 13 283.676 222.868 2454       181      28.704     6.927     18.862     42.192
#> 14 511.950 330.858 3474       202      33.705     6.549     25.381     49.822
#> 15 364.391 339.447 4685       252      40.110     9.835     27.671     60.222
#> 16 129.328 341.430 4658       232      38.690     6.508     29.458     54.099
#> 17 434.441 340.239 3074       211      32.796     8.842     21.341     52.041
#> 18 292.625 338.400 2954       201      31.710     7.618     20.518     46.861
#> 19 223.293 354.325 4477       233      38.439     7.367     29.676     55.357
#> 20 498.587 470.449 5168       255      41.256     8.335     29.647     60.885
#> 21 308.910 487.043 4530       232      38.309     6.669     29.844     54.331
#> 22  84.073 480.105 2278       192      29.181     8.972     17.223     47.862
#> 23 226.506 486.946 3120       193      31.726     5.667     24.352     45.208
#> 24 371.520 483.176 2682       192      30.510     7.888     19.673     47.844
#> 25 148.250 483.237 2910       196      31.218     6.637     21.981     45.535
#> 26 433.976 481.163 2378       168      27.724     5.216     20.996     39.956
#> 27 509.474 597.274 4115       227      37.269     8.362     25.707     55.133
#> 28 436.622 608.805 4368       245      39.178     9.563     27.800     60.416
#> 29 351.735 607.135 4464       240      38.419     7.913     27.080     56.981
#>    majoraxis eccentricity  theta
#> 1    109.024        0.871 -1.478
#> 2     87.875        0.807  1.432
#> 3     99.898        0.823 -1.495
#> 4     91.850        0.829 -1.543
#> 5     98.109        0.795  1.398
#> 6    108.029        0.787  1.487
#> 7     75.903        0.895 -1.435
#> 8    106.938        0.864  1.567
#> 9     87.055        0.767  1.406
#> 10   100.121        0.837 -1.375
#> 11    84.875        0.792  1.526
#> 12    65.349        0.744  1.369
#> 13    77.532        0.853  1.428
#> 14    86.079        0.798 -1.425
#> 15   106.464        0.848  1.459
#> 16    96.935        0.772  1.322
#> 17    90.288        0.875  1.523
#> 18    83.162        0.835  1.418
#> 19    96.837        0.790 -1.543
#> 20   106.736        0.813  1.560
#> 21    95.610        0.769  1.528
#> 22    78.577        0.876  1.508
#> 23    80.197        0.783  1.393
#> 24    80.934        0.845 -1.570
#> 25    79.912        0.811  1.305
#> 26    70.430        0.788 -1.552
#> 27    97.342        0.830  1.323
#> 28   101.973        0.840  1.500
#> 29    98.863        0.810  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.929  88.236 6.203610  353.3367    55.88914 15.071008   34.50594
#> 2   64.912  79.673 4.849647  299.8435    48.80833 10.498746   35.87987
#> 3  408.143  89.948 6.032655  330.8133    53.72971 11.412354   37.15526
#> 4  179.893  86.066 5.027441  298.4358    48.88435 10.676118   35.67152
#> 5  332.544  91.774 6.211816  337.8519    54.89670 10.853491   41.79368
#> 6  498.492 102.640 7.672454  366.0062    60.81756 11.702343   47.25562
#> 7  120.837  85.047 2.687410  257.6120    38.63758 12.608913   20.86798
#> 8  430.229 221.410 6.127022  349.1136    55.49780 14.555784   37.70567
#> 9  122.456 219.551 5.171043  297.0281    49.18982  8.578622   35.93618
#> 10 207.373 227.883 5.837083  337.8519    54.01266 12.865117   37.70286
#> 11 508.686 223.627 4.684163  281.5432    46.98112  8.881281   35.37731
#> 12 353.071 213.195 3.058041  225.2346    37.56209  5.763189   29.52684
#> 13 283.676 222.868 3.356186  254.7966    40.40708  9.751249   26.55234
#> 14 511.950 330.858 4.751177  284.3586    47.44707  9.219132   35.72924
#> 15 364.391 339.447 6.407388  354.7444    56.46349 13.844887   38.95291
#> 16 129.328 341.430 6.370462  326.5901    54.46453  9.161416   41.46850
#> 17 434.441 340.239 4.204122  297.0281    46.16746 12.447025   30.04207
#> 18 292.625 338.400 4.040005  282.9509    44.63868 10.723981   28.88352
#> 19 223.293 354.325 6.122919  327.9978    54.11120 10.370644   41.77538
#> 20 498.587 470.449 7.067958  358.9676    58.07673 11.733313   41.73456
#> 21 308.910 487.043 6.195404  326.5901    53.92819  9.388058   42.01188
#> 22  84.073 480.105 3.115481  270.2815    41.07856 12.630028   24.24509
#> 23 226.506 486.946 4.267033  271.6892    44.66120  7.977527   34.28070
#> 24 371.520 483.176 3.668007  270.2815    42.94942 11.104064   27.69400
#> 25 148.250 483.237 3.979829  275.9123    43.94608  9.343011   30.94301
#> 26 433.976 481.163 3.252245  236.4963    39.02752  7.342647   29.55641
#> 27 509.474 597.274 5.627834  319.5515    52.46417 11.771322   36.18816
#> 28 436.622 608.805 5.973847  344.8904    55.15150 13.461989   39.13451
#> 29 351.735 607.135 6.105140  337.8519    54.08304 11.139257   38.12095
#>    radius.max majoraxis eccentricity  theta
#> 1    87.82740 153.47483        0.871 -1.478
#> 2    71.10515 123.70305        0.807  1.432
#> 3    77.99028 140.62802        0.823 -1.495
#> 4    72.32000 129.29872        0.829 -1.543
#> 5    80.26375 138.10961        0.795  1.398
#> 6    85.41458 152.07416        0.787  1.487
#> 7    63.55838 106.84987        0.895 -1.435
#> 8    86.53231 150.53834        0.864  1.567
#> 9    67.46198 122.54872        0.767  1.406
#> 10   80.64524 140.94194        0.837 -1.375
#> 11   66.72996 119.47990        0.792  1.526
#> 12   49.41224  91.99284        0.744  1.369
#> 13   59.39436 109.14304        0.853  1.428
#> 14   70.13523 121.17479        0.798 -1.425
#> 15   84.77548 149.87108        0.848  1.459
#> 16   76.15603 136.45695        0.772  1.322
#> 17   73.25895 127.09987        0.875  1.523
#> 18   65.96698 117.06848        0.835  1.418
#> 19   77.92694 136.31900        0.790 -1.543
#> 20   85.70879 150.25398        0.813  1.560
#> 21   76.48262 134.59173        0.769  1.528
#> 22   67.37611 110.61410        0.876  1.508
#> 23   63.64003 112.89460        0.783  1.393
#> 24   67.35077 113.93209        0.845 -1.570
#> 25   64.10035 112.49340        0.811  1.305
#> 26   56.24670  99.14544        0.788 -1.552
#> 27   77.61161 137.02990        0.830  1.323
#> 28   85.04857 143.54903        0.840  1.500
#> 29   80.21307 139.17103        0.810  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)