Exemplo: Estimação da área foliar

Alcinei Mistico Azevedo (ICA-UFMG)

2021-09-06

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

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
#> 1  251.77372  88.66368   4680         258      40.30646   10.878969
#> 2   64.99642  80.13837   3628         215      34.95464    7.467362
#> 3  407.99222  90.22504   4497         233      38.40077    8.133362
#> 4  179.68075  86.50877   3762         219      35.32372    7.862043
#> 5  332.47775  92.13024   4630         241      39.29406    7.734490
#> 6  498.35918 102.82616   5649         266      43.30259    8.379189
#> 7  120.79672  85.54817   2076         187      27.87588    8.994773
#> 8  430.18009 222.06652   4570         255      40.08153   10.633196
#> 9  122.32543 219.44009   3881         218      35.51034    6.240998
#> 10 207.25739 228.11796   4332         243      38.61210    9.036382
#> 11 508.61534 223.59178   3481         205      33.71838    6.403792
#> 12 352.94047 213.38116   2251         161      26.74891    4.118389
#> 13 283.56922 223.12896   2528         183      29.13498    7.064123
#> 14 511.95685 331.00369   3523         208      33.96940    6.581959
#> 15 364.27909 339.85898   4744         252      40.28450    9.948712
#> 16 129.15520 341.41614   4710         237      39.11324    6.647654
#> 17 434.41430 340.53088   3174         215      33.39776    8.935207
#> 18 292.60725 338.95943   3007         201      31.81674    7.500350
#> 19 223.33458 354.69429   4537         235      38.67454    7.478564
#> 20 498.35083 470.70280   5259         256      41.51773    8.251721
#> 21 308.76464 487.23536   4576         229      38.41558    6.578140
#> 22  84.09018 480.70586   2373         195      29.51627    8.930119
#> 23 226.39690 486.99398   3157         193      31.85713    5.622143
#> 24 371.41361 483.90916   2807         203      31.77120    8.885141
#> 25 148.19720 483.56096   3002         197      31.63035    6.590240
#> 26 433.86221 481.36469   2424         168      27.95244    5.297969
#> 27 509.56070 597.64132   4143         227      37.38750    8.548141
#> 28 436.56853 609.02480   4436         246      39.40389    9.655209
#> 29 351.54697 607.48545   4503         241      38.68635    8.094880
#>    s.radius.min s.radius.max m.majoraxis m.eccentricity   m.theta
#> 1      24.93461     61.96047   111.13309      0.8728996 -1.475677
#> 2      25.53489     50.73238    89.40943      0.8113852  1.425947
#> 3      26.29386     55.49115   100.70392      0.8220289 -1.493911
#> 4      24.74718     51.78100    93.01824      0.8298147 -1.545705
#> 5      29.63731     57.53629    99.08539      0.7942071  1.394135
#> 6      33.21045     61.55517   109.02552      0.7918883  1.486409
#> 7      14.70085     45.91910    78.81307      0.8979370 -1.438720
#> 8      26.97214     62.58624   108.46744      0.8655147  1.563350
#> 9      25.64143     48.23220    88.29446      0.7672720  1.401159
#> 10     27.37879     58.27144   101.04008      0.8383099 -1.371715
#> 11     24.99491     47.74648    85.64426      0.7931361  1.523009
#> 12     21.12534     36.55125    65.74573      0.7465741  1.362382
#> 13     19.37168     43.08195    78.76510      0.8523794  1.430376
#> 14     25.38204     49.19953    86.90649      0.7999709 -1.422090
#> 15     28.02988     60.68517   107.65993      0.8508042  1.456363
#> 16     29.59054     54.00599    97.56696      0.7731340  1.317950
#> 17     21.46633     51.76300    91.40210      0.8724311  1.514860
#> 18     21.00846     46.88853    84.12164      0.8359710  1.404550
#> 19     29.68311     55.19060    97.56922      0.7904816 -1.545611
#> 20     30.58907     60.67997   107.48981      0.8116052  1.562345
#> 21     30.11532     54.48895    95.68566      0.7643603  1.522677
#> 22     17.39236     47.74754    80.69859      0.8787039  1.505353
#> 23     24.39468     44.98401    80.35003      0.7790580  1.385843
#> 24     19.97634     50.17369    83.86356      0.8506943 -1.565709
#> 25     22.60111     45.19870    81.02673      0.8095031  1.299945
#> 26     20.97782     39.15351    71.16054      0.7889107 -1.553455
#> 27     25.54288     55.55723    98.33544      0.8342201  1.320669
#> 28     27.82714     60.19474   103.27848      0.8427778  1.501747
#> 29     27.35696     56.67525    99.89833      0.8143267  1.347638

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 area segmentada 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
#> 1  251.77372  88.66368 6.392695    9.722746      1.518951   0.4099746
#> 2   64.99642  80.13837 4.955705    8.102288      1.317268   0.2814080
#> 3  407.99222  90.22504 6.142725    8.780619      1.447135   0.3065062
#> 4  179.68075  86.50877 5.138744    8.253028      1.331177   0.2962816
#> 5  332.47775  92.13024 6.324397    9.082100      1.480799   0.2914747
#> 6  498.35918 102.82616 7.716311   10.024226      1.631861   0.3157703
#> 7  120.79672  85.54817 2.835734    7.047106      1.050504   0.3389686
#> 8  430.18009 222.06652 6.242440    9.609690      1.510475   0.4007126
#> 9  122.32543 219.44009 5.301293    8.215343      1.338209   0.2351924
#> 10 207.25739 228.11796 5.917341    9.157470      1.455099   0.3405366
#> 11 508.61534 223.59178 4.754909    7.725437      1.270679   0.2413273
#> 12 352.94047 213.38116 3.074777    6.067295      1.008034   0.1552018
#> 13 283.56922 223.12896 3.453148    6.896366      1.097954   0.2662119
#> 14 511.95685 331.00369 4.812279    7.838493      1.280139   0.2480415
#> 15 364.27909 339.85898 6.480117    9.496635      1.518124   0.3749178
#> 16 129.15520 341.41614 6.433674    8.931359      1.473985   0.2505172
#> 17 434.41430 340.53088 4.335559    8.102288      1.258596   0.3367238
#> 18 292.60725 338.95943 4.107443    7.574697      1.199016   0.2826511
#> 19 223.33458 354.69429 6.197363    8.855989      1.457453   0.2818301
#> 20 498.35083 470.70280 7.183587    9.647376      1.564598   0.3109666
#> 21 308.76464 487.23536 6.250636    8.629879      1.447693   0.2478976
#> 22  84.09018 480.70586 3.241424    7.348587      1.112322   0.3365321
#> 23 226.39690 486.99398 4.312337    7.273217      1.200538   0.2118708
#> 24 371.41361 483.90916 3.834251    7.650067      1.197300   0.3348371
#> 25 148.19720 483.56096 4.100614    7.423957      1.191992   0.2483536
#> 26 433.86221 481.36469 3.311088    6.331090      1.053389   0.1996543
#> 27 509.56070 597.64132 5.659175    8.554509      1.408950   0.3221372
#> 28 436.56853 609.02480 6.059401    9.270525      1.484938   0.3638571
#> 29 351.54697 607.48545 6.150920    9.082100      1.457898   0.3050560
#>    s.radius.min s.radius.max m.majoraxis m.eccentricity   m.theta
#> 1     0.9396625     2.334984    4.188057      0.8728996 -1.475677
#> 2     0.9622837     1.911853    3.369400      0.8113852  1.425947
#> 3     0.9908856     2.091188    3.795033      0.8220289 -1.493911
#> 4     0.9325990     1.951370    3.505398      0.8298147 -1.545705
#> 5     1.1168840     2.168258    3.734039      0.7942071  1.394135
#> 6     1.2515378     2.319710    4.108633      0.7918883  1.486409
#> 7     0.5540022     1.730464    2.970075      0.8979370 -1.438720
#> 8     1.0164468     2.358566    4.087602      0.8655147  1.563350
#> 9     0.9662989     1.817634    3.327382      0.7672720  1.401159
#> 10    1.0317712     2.195963    3.807702      0.8383099 -1.371715
#> 11    0.9419347     1.799329    3.227509      0.7931361  1.523009
#> 12    0.7961096     1.377436    2.477632      0.7465741  1.362382
#> 13    0.7300229     1.623546    2.968268      0.8523794  1.430376
#> 14    0.9565237     1.854087    3.275076      0.7999709 -1.422090
#> 15    1.0563078     2.286924    4.057171      0.8508042  1.456363
#> 16    1.1151213     2.035219    3.676817      0.7731340  1.317950
#> 17    0.8089598     1.950692    3.444494      0.8724311  1.514860
#> 18    0.7917051     1.766997    3.170129      0.8359710  1.404550
#> 19    1.1186097     2.079861    3.676902      0.7904816 -1.545611
#> 20    1.1527509     2.286728    4.050760      0.8116052  1.562345
#> 21    1.1348975     2.053419    3.605920      0.7643603  1.522677
#> 22    0.6554321     1.799369    3.041131      0.8787039  1.505353
#> 23    0.9193148     1.695225    3.027996      0.7790580  1.385843
#> 24    0.7528095     1.890798    3.160403      0.8506943 -1.565709
#> 25    0.8517244     1.703316    3.053497      0.8095031  1.299945
#> 26    0.7905502     1.475502    2.681689      0.7889107 -1.553455
#> 27    0.9625850     2.093678    3.705777      0.8342201  1.320669
#> 28    1.0486676     2.268442    3.892056      0.8427778  1.501747
#> 29    1.0309487     2.135810    3.764675      0.8143267  1.347638

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)