Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2021-12-10

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
#>       m.cx    m.cy s.area s.perimeter s.radius.mean s.radius.sd s.radius.min
#> 1  251.924  88.247   4553         250        39.679      10.688       24.515
#> 2   64.933  79.709   3561         213        34.724       7.466       25.470
#> 3  408.176  89.933   4427         235        38.161       8.065       26.534
#> 4  179.898  86.075   3682         212        34.749       7.572       25.485
#> 5  332.599  91.751   4558         240        39.042       7.685       29.724
#> 6  498.497 102.640   5618         260        43.212       8.321       33.557
#> 7  120.889  85.060   1976         183        27.483       8.949       14.787
#> 8  430.240 221.419   4497         247        39.418      10.336       26.803
#> 9  122.479 219.560   3800         213        35.045       6.008       25.456
#> 10 207.363 227.908   4280         240        38.415       9.104       26.964
#> 11 508.721 223.647   3440         200        33.416       6.343       25.092
#> 12 353.080 213.183   2240         159        26.674       4.086       21.016
#> 13 283.681 222.861   2467         180        28.710       6.902       19.115
#> 14 511.961 330.843   3480         202        33.720       6.549       25.371
#> 15 364.434 339.486   4697         251        40.094       9.791       27.877
#> 16 129.365 341.427   4673         232        38.701       6.512       29.378
#> 17 434.512 340.155   3097         210        32.851       8.839       21.448
#> 18 292.692 338.444   2975         201        31.798       7.560       20.928
#> 19 223.341 354.214   4496         234        38.563       7.377       29.783
#> 20 498.600 470.439   5179         254        41.249       8.302       29.691
#> 21 308.982 486.997   4554         232        38.360       6.599       30.065
#> 22  84.074 480.211   2293         192        29.218       8.942       17.334
#> 23 226.524 486.935   3136         194        31.837       5.674       24.361
#> 24 371.588 483.488   2715         203        31.496       9.022       19.058
#> 25 148.305 483.235   2931         197        31.302       6.588       22.146
#> 26 433.987 481.162   2387         168        27.764       5.209       21.001
#> 27 509.492 597.296   4122         227        37.307       8.399       25.704
#> 28 436.632 608.809   4384         247        39.287       9.549       27.825
#> 29 351.795 607.111   4484         238        38.571       8.018       27.149
#>    s.radius.max m.majoraxis m.eccentricity m.theta
#> 1        62.181     109.270          0.872  -1.476
#> 2        50.504      88.140          0.808   1.432
#> 3        55.334      99.982          0.822  -1.494
#> 4        51.378      91.860          0.829  -1.543
#> 5        56.999      98.134          0.793   1.400
#> 6        61.158     108.229          0.788   1.488
#> 7        45.158      76.063          0.894  -1.434
#> 8        61.279     107.105          0.864   1.567
#> 9        47.306      87.164          0.766   1.408
#> 10       57.685     100.329          0.838  -1.374
#> 11       47.441      85.205          0.794   1.527
#> 12       35.309      65.433          0.744   1.370
#> 13       42.388      77.664          0.852   1.427
#> 14       49.820      86.191          0.798  -1.422
#> 15       60.424     106.564          0.848   1.460
#> 16       54.210      96.982          0.771   1.322
#> 17       51.894      90.510          0.874   1.525
#> 18       46.841      83.212          0.833   1.415
#> 19       55.612      96.976          0.790  -1.540
#> 20       60.696     106.776          0.813   1.559
#> 21       54.353      95.669          0.767   1.529
#> 22       47.863      78.958          0.877   1.509
#> 23       45.425      80.321          0.782   1.390
#> 24       50.141      82.355          0.851  -1.568
#> 25       45.636      80.056          0.810   1.308
#> 26       39.957      70.511          0.788  -1.551
#> 27       55.114      97.498          0.831   1.323
#> 28       60.809     102.312          0.841   1.501
#> 29       56.400      99.003          0.809   1.353

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
#>       m.cx    m.cy   s.area s.perimeter s.radius.mean s.radius.sd s.radius.min
#> 1  251.924  88.247 6.211414    9.421265      1.495306   0.4027779    0.9238493
#> 2   64.933  79.709 4.858082    8.026918      1.308576   0.2813567    0.9598385
#> 3  408.176  89.933 6.039519    8.855989      1.438100   0.3039300    0.9999354
#> 4  179.898  86.075 5.023156    7.989233      1.309518   0.2853513    0.9604038
#> 5  332.599  91.751 6.218236    9.044415      1.471300   0.2896097    1.1201507
#> 6  498.497 102.640 7.664337    9.798116      1.628447   0.3135774    1.2645976
#> 7  120.889  85.060 2.695751    6.896366      1.035699   0.3372436    0.5572490
#> 8  430.240 221.419 6.135017    9.308210      1.485470   0.3895128    1.0100727
#> 9  122.479 219.560 5.184137    8.026918      1.320673   0.2264118    0.9593109
#> 10 207.363 227.908 5.838975    9.044415      1.447672   0.3430848    1.0161400
#> 11 508.721 223.647 4.693008    7.537012      1.259284   0.2390363    0.9455935
#> 12 353.080 213.183 3.055912    5.991925      1.005211   0.1539812    0.7919892
#> 13 283.681 222.861 3.365596    6.783311      1.081938   0.2601023    0.7203499
#> 14 511.961 330.843 4.747578    7.612382      1.270740   0.2467995    0.9561077
#> 15 364.434 339.486 6.407866    9.458950      1.510945   0.3689744    1.0505464
#> 16 129.365 341.427 6.375124    8.742934      1.458450   0.2454051    1.1071117
#> 17 434.512 340.155 4.225071    7.913863      1.237992   0.3330983    0.8082692
#> 18 292.692 338.444 4.058633    7.574697      1.198310   0.2848991    0.7886729
#> 19 223.341 354.214 6.133652    8.818304      1.453249   0.2780027    1.1223742
#> 20 498.600 470.439 7.065433    9.572005      1.554471   0.3128614    1.1189071
#> 21 308.982 486.997 6.212779    8.742934      1.445599   0.2486837    1.1330013
#> 22  84.074 480.211 3.128217    7.235532      1.101082   0.3369798    0.6532328
#> 23 226.524 486.935 4.278277    7.310902      1.199779   0.2138250    0.9180458
#> 24 371.588 483.488 3.703929    7.650067      1.186929   0.3399946    0.7182019
#> 25 148.305 483.235 3.998607    7.423957      1.179618   0.2482692    0.8345734
#> 26 433.987 481.162 3.256456    6.331090      1.046288   0.1963015    0.7914240
#> 27 509.492 597.296 5.623424    8.554509      1.405917   0.3165168    0.9686568
#> 28 436.632 608.809 5.980857    9.308210      1.480533   0.3598546    1.0485868
#> 29 351.795 607.111 6.117281    8.969044      1.453550   0.3021588    1.0231117
#>    s.radius.max m.majoraxis m.eccentricity m.theta
#> 1      2.343295    4.117847          0.872  -1.476
#> 2      1.903246    3.321561          0.808   1.432
#> 3      2.085265    3.767828          0.822  -1.494
#> 4      1.936183    3.461750          0.829  -1.543
#> 5      2.148011    3.698186          0.793   1.400
#> 6      2.304743    4.078616          0.788   1.488
#> 7      1.701782    2.866439          0.894  -1.434
#> 8      2.309303    4.036258          0.864   1.567
#> 9      1.782729    3.284781          0.766   1.408
#> 10     2.173863    3.780904          0.838  -1.374
#> 11     1.787817    3.210956          0.794   1.527
#> 12     1.330622    2.465847          0.744   1.370
#> 13     1.597394    2.926773          0.852   1.427
#> 14     1.877470    3.248113          0.798  -1.422
#> 15     2.277082    4.015871          0.848   1.460
#> 16     2.042907    3.654773          0.771   1.322
#> 17     1.955629    3.410875          0.874   1.525
#> 18     1.765206    3.135849          0.833   1.415
#> 19     2.095742    3.654546          0.790  -1.540
#> 20     2.287332    4.023860          0.813   1.559
#> 21     2.048296    3.605292          0.767   1.529
#> 22     1.803720    2.975537          0.877   1.509
#> 23     1.711844    3.026902          0.782   1.390
#> 24     1.889567    3.103553          0.851  -1.568
#> 25     1.719795    3.016915          0.810   1.308
#> 26     1.505782    2.657211          0.788  -1.551
#> 27     2.076974    3.674218          0.831   1.323
#> 28     2.291591    3.855634          0.841   1.501
#> 29     2.125437    3.730934          0.809   1.353

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)