Cálculo de área foliar

July 11, 2012
By

This post was kindly contributed by Ridículas - go there to comment and to read the full post.

Áreas foliares (cm²)

Área foliar calculada com funções do pacote EBImage.

Sinceramente, eu vi no r-bloggers e não acreditei. É possível calcular área de figuras geométricas no R. Bem isso sempre foi possível, basta ter as coordenadas do polígono. Mas não estou falando de áreas geográficas das quais possuímos os mapas. Estou falando de áreas de figuras digitalizadas, como por exemplo a folha de uma planta, as asas de uma borboleta, um torrão de solo, uma pedra, a seção de de um tronco, uma semente. Enfim, as possibilidades são infinitas.

Em agronomia, a análise de imagens é algo que vem se tornando mais comum. Determinações de volume/comprimento/diâmetro de raízes, dimensão de agregados do solo (diâmetros, rendondezas, perimentros), porcentagem de área ocupada por doença ou atacada por inseto são alguns exemplos de aplicação. Alguns aplicativos para essas tarefas são disponíveis. Alguns deles são pagos. E todos eles não permitem automatizar o trabalho, pois requerem em alguma altura do processo, intervenção do usuário via mouse. Imagine ter que calcular a área de 3000 folhas fazendo o trabalho uma a uma? Não dá né?

Nessa matéria eu calculo área de algumas folhas que encontrei no chão, embaixo de algumas árvores. Para ter a medidas das folhas em cm² eu coloquei um quadrado de papel de área conhecida como referência. Nos vamos usar funções disponíveis no pacote EBImage. O meu tutorial não é muito diferente do original que me motivou (leaf area measuring — R package “EBImage”). O fato é que não me contentei em apenas ler mencionada matéria, tive que ver com meus próprios olhos, e já que foi assim, está qui o código que produzi. Até a próxima ridícula.

#-----------------------------------------------------------------------------
# página de desenvolvimento do pacote
# http://www.bioconductor.org/packages/devel/bioc/html/EBImage.html

# instalação no linux, no terminal do linux, fazer
# sudo apt-get install libmagickcore-dev libmagickwand-dev

# instalando do bioconductor
source("http://bioconductor.org/biocLite.R")
biocLite("EBImage") # pacote EBImage, permite determinar área foliar

# instalando do tar.gz, pegar o link da página e rodar no terminal
# R CMD INSTALL EBImage_xxxxx.tar.gz # xxx representa a versão

#-----------------------------------------------------------------------------
# carrega o pacote

require(EBImage)

#-----------------------------------------------------------------------------
# lendo o arquivo

# lê imagem com folhas digitalizadas
fol <- readImage("http://www.leg.ufpr.br/~walmes/ridiculas/folhas.jpg")
str(fol)

display(fol) # vê a imagem
hist(fol)    # histograma dos componentes verde, vermelho e azul
             # picos de azul estão mais afastados, separam melhor

#-----------------------------------------------------------------------------
# tratamento

fol2 <- imageData(channel(fol, mode="blue")) # seleciona um canal
fol2 <- 1-fol2                               # inverte as tonalidades
hist(fol2)                                   # histigrama dos tons de cinza

display(fol2) # escala cinza com claro sendo a folha

#-----------------------------------------------------------------------------
# dicotomiza para branco e preto

fol2[fol2<0.5] <- 0
fol2[fol2>=0.5] <- 1

display(fol2)

#-----------------------------------------------------------------------------
# calcula atributos de cada região

fol3 <- bwlabel(fol2)     # coloca os rótulos nas regiões disjuntas
kern <- makeBrush(3, shape="disc", step=FALSE)
fol3 <- erode(fol3, kern) # remove alguns ruídos

display(fol3)

forma <- computeFeatures.shape(fol3)
area <- forma[, "s.area"]
area

# áreas foliares
areacm <- 25*area/min(area) # quadrado de área conhecida 25 cm²

#-----------------------------------------------------------------------------
# prepara para exportação

fol4 <- paintObjects(fol3, fol, opac=c(NA, 0.45), col=c(NA, "red"))
display(fol4)

xy <- computeFeatures.moment(fol3, fol)[, c("m.cx", "m.cy")] # centróides
font <- drawfont(weight=600, size=15)
fol5 <- drawtext(fol4, xy=xy, labels=paste(format(areacm, digits=4), "cm²"),
                 font=font, col="white")
display(fol5)

writeImage(fol5, "f038.jpg")

#-----------------------------------------------------------------------------


Tags: , ,

Comments are closed.