Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2023-12-14

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.915  88.297 4532       253      39.730    10.697     24.640     61.968
#> 2   64.913  79.666 3544       214      34.668     7.432     25.426     50.664
#> 3  408.136  89.978 4405       234      38.106     8.094     26.424     55.183
#> 4  179.859  86.098 3675       213      34.792     7.656     25.245     51.145
#> 5  332.517  91.788 4534       240      38.970     7.715     29.653     57.018
#> 6  498.538 102.647 5594       260      43.148     8.344     33.374     60.668
#> 7  120.783  85.113 1961       183      27.424     8.970     14.854     45.148
#> 8  430.207 221.427 4468       249      39.487    10.426     26.533     62.175
#> 9  122.397 219.572 3768       211      34.899     6.115     25.543     47.921
#> 10 207.348 227.912 4263       241      38.353     9.149     26.619     57.122
#> 11 508.700 223.667 3421       201      33.344     6.334     25.051     48.375
#> 12 353.060 213.219 2224       160      26.585     4.062     21.114     35.413
#> 13 283.673 222.893 2449       179      28.596     6.920     18.856     41.871
#> 14 511.905 330.903 3468       203      33.675     6.534     25.253     49.153
#> 15 364.350 339.461 4680       251      40.045     9.822     27.379     60.437
#> 16 129.237 341.460 4638       233      38.729     6.715     29.569     55.362
#> 17 434.447 340.264 3069       210      32.762     8.872     21.401     51.871
#> 18 292.526 338.406 2937       201      31.633     7.697     20.114     46.883
#> 19 223.246 354.380 4463       232      38.360     7.370     29.757     55.143
#> 20 498.544 470.460 5161       257      41.264     8.344     29.751     60.889
#> 21 308.812 487.052 4512       236      38.254     6.645     30.092     54.209
#> 22  84.084 480.243 2273       192      29.151     8.982     17.209     47.863
#> 23 226.472 486.972 3113       195      31.724     5.695     24.242     44.971
#> 24 371.505 483.517 2685       203      31.401     9.041     18.944     50.119
#> 25 148.177 483.291 2898       194      31.184     6.695     22.268     45.322
#> 26 433.938 481.193 2367       167      27.644     5.236     20.848     39.738
#> 27 509.468 597.346 4106       226      37.195     8.408     25.601     54.888
#> 28 436.606 608.877 4358       247      39.193     9.589     27.502     60.260
#> 29 351.672 607.220 4450       239      38.475     8.012     27.225     56.573
#>    majoraxis eccentricity  theta
#> 1    109.102        0.872 -1.478
#> 2     87.879        0.808  1.432
#> 3     99.856        0.823 -1.494
#> 4     91.913        0.830 -1.544
#> 5     98.111        0.795  1.397
#> 6    108.086        0.789  1.487
#> 7     76.130        0.896 -1.437
#> 8    106.687        0.863  1.566
#> 9     86.977        0.768  1.406
#> 10   100.196        0.838 -1.376
#> 11    84.859        0.793  1.523
#> 12    65.205        0.744  1.371
#> 13    77.472        0.853  1.427
#> 14    86.001        0.798 -1.426
#> 15   106.539        0.849  1.460
#> 16    96.905        0.774  1.320
#> 17    90.319        0.876  1.523
#> 18    83.369        0.839  1.420
#> 19    96.700        0.790 -1.546
#> 20   106.806        0.814  1.559
#> 21    95.436        0.770  1.529
#> 22    78.905        0.879  1.509
#> 23    80.186        0.784  1.390
#> 24    82.038        0.851 -1.570
#> 25    79.829        0.812  1.303
#> 26    70.338        0.789 -1.554
#> 27    97.415        0.831  1.323
#> 28   101.855        0.840  1.499
#> 29    98.917        0.811  1.350
#> 
#> 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.915  88.297 6.181503  355.7701    55.86856 15.042184   34.64891
#> 2   64.913  79.666 4.833902  300.9280    48.75034 10.450922   35.75419
#> 3  408.136  89.978 6.008279  329.0522    53.58488 11.381830   37.15758
#> 4  179.859  86.098 5.012582  299.5218    48.92471 10.765912   35.49967
#> 5  332.517  91.788 6.184230  337.4894    54.79984 10.848878   41.69822
#> 6  498.538 102.647 7.630036  365.6135    60.67497 11.733381   46.93071
#> 7  120.783  85.113 2.674741  257.3357    38.56379 12.613666   20.88778
#> 8  430.207 221.427 6.094209  350.1452    55.52685 14.661102   37.31086
#> 9  122.397 219.572 5.139431  296.7094    49.07518  8.598949   35.91872
#> 10 207.348 227.912 5.814595  338.8956    53.93221 12.865377   37.43179
#> 11 508.700 223.667 4.666134  282.6474    46.88853  8.906908   35.22686
#> 12 353.060 213.219 3.033465  224.9929    37.38398  5.712008   29.69063
#> 13 283.673 222.893 3.340357  251.7108    40.21186  9.730944   26.51542
#> 14 511.905 330.903 4.730241  285.4598    47.35398  9.188149   35.51092
#> 15 364.350 339.461 6.383370  352.9577    56.31151 13.811754   38.50051
#> 16 129.237 341.460 6.326083  327.6460    54.46095  9.442672   41.58010
#> 17 434.447 340.264 4.186018  295.3032    46.07011 12.475858   30.09421
#> 18 292.526 338.406 4.005974  282.6474    44.48251 10.823566   28.28442
#> 19 223.246 354.380 6.087389  326.2397    53.94206 10.363737   41.84447
#> 20 498.544 470.460 7.039438  361.3949    58.02568 11.733381   41.83603
#> 21 308.812 487.052 6.154223  331.8646    53.79300  9.344238   42.31555
#> 22  84.084 480.243 3.100299  269.9915    40.99231 12.630541   24.19940
#> 23 226.472 486.972 4.246032  274.2101    44.61047  8.008342   34.08924
#> 24 371.505 483.517 3.662254  285.4598    44.15627 12.713507   26.63916
#> 25 148.177 483.291 3.952779  272.8039    43.85112  9.414548   31.31339
#> 26 433.938 481.193 3.228512  234.8364    38.87315  7.362894   29.31658
#> 27 509.468 597.346 5.600452  317.8025    52.30383 11.823378   36.00028
#> 28 436.606 608.877 5.944172  347.3328    55.11342 13.484108   38.67347
#> 29 351.672 607.220 6.069657  336.0832    54.10377 11.266521   38.28395
#>    radius.max majoraxis eccentricity  theta
#> 1    87.13976 153.41987        0.872 -1.478
#> 2    71.24401 123.57596        0.808  1.432
#> 3    77.59866 140.41809        0.823 -1.494
#> 4    71.92040 129.24860        0.830 -1.544
#> 5    80.17904 137.96426        0.795  1.397
#> 6    85.31169 151.99116        0.789  1.487
#> 7    63.48738 107.05445        0.896 -1.437
#> 8    87.43085 150.02388        0.863  1.566
#> 9    67.38679 122.30756        0.768  1.406
#> 10   80.32529 140.89620        0.838 -1.376
#> 11   68.02521 119.32922        0.793  1.523
#> 12   49.79797  91.69165        0.744  1.371
#> 13   58.87924 108.94158        0.853  1.427
#> 14   69.11923 120.93511        0.798 -1.426
#> 15   84.98686 149.81576        0.849  1.460
#> 16   77.85037 136.26837        0.774  1.320
#> 17   72.94130 127.00710        0.876  1.523
#> 18   65.92715 117.23397        0.839  1.420
#> 19   77.54241 135.98010        0.790 -1.546
#> 20   85.62247 150.19122        0.814  1.559
#> 21   76.22901 134.20266        0.770  1.529
#> 22   67.30523 110.95667        0.879  1.509
#> 23   63.23848 112.75802        0.784  1.390
#> 24   70.47763 115.36231        0.851 -1.570
#> 25   63.73206 112.25600        0.812  1.303
#> 26   55.87981  98.90970        0.789 -1.554
#> 27   77.18382 136.98554        0.831  1.323
#> 28   84.73796 143.22909        0.840  1.499
#> 29   79.55328 139.09766        0.811  1.350
#> 
#> 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)