Início > dados > Crescimento micelial por análise de imagens

Crescimento micelial por análise de imagens

Tamanho da colônia micelial (cm²) determinada pela análise de imagem com funções do pacote EBImage.

Nessa matéria vou apresentar os procedimentos em R para determinar o tamanho de uma colônia de micélios em placa de petri. Os resultados são baseados em numa calibração que consistiu em escolher melhor fundo, iluminação e demais parâmetros fotográficos para uma boa recuperação da informação via análise de imagem pelo pacote EBImage. Em outras palavras, como obter uma boa foto para cálculo do crescimento micelial. Esta foi uma epata preliminar de um estudo que vai comparar a determinação do crescimento micelial por análise de imagens e pelo método padrão, via uso de paquímetros.

As fotos foram obtidas com uma câmera fotográfica Canon Ti preza em um suporte de madeira com distância fixa da placa de petri. A iluminção foi ambiente. Fotografamos a placa de petri aberta. Inicialmente nós usamos um fundo azul mas que não foi adequado por não apresentar diferenças em tons na escala cinza da região micelial. Então substituímos por um fundo preto para aumentar esse contraste de tons. Superado isso, tivemos problemas com o brilho da borda da placa de petri. Isso foi resolvido com seleção de pixels dentro de um círculo que não contivesse tal borda. Vai ficar mais claro no CMR abaixo cada etapa do processo. Por fim, determinamos a área, perímetro, e diâmetros da colônia com as funções do pacote EBImage.

Por fim, tenho que deixar os créditos ao acadêmico de Doutorado em Agronomia (UFPR) Paulo Lichtemberg que é o responsável pelo estudo de crescimento de fungos por análise de imagens, membro do LEMID (Laboratório de Epidemiologia e Manejo Integrado de Doenças) e orientado da Professora Larissa May De Mio.

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

require(EBImage)

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

# lê imagem, imagem original com resolução de 2352x1568 foi recortada e
# reduzida para 400x400 pixel de dimensão

f0 <- readImage("http://www.leg.ufpr.br/~walmes/ridiculas/micelio.JPG")
str(f0)

display(f0) # vê a imagem
hist(f0)    # histograma dos componentes verde, vermelho e azul

par(mfrow=c(3,1)) # gráfico de densidade do vermelho, verde e azul
apply(f0, MARGIN=3, function(x) plot(density(x), xlim=c(0,1)))
layout(1)

#-----------------------------------------------------------------------------
# tratamento para escala cinza

f1 <- imageData(channel(f0, mode="red")) # vermelho parece separar melhor
f1 <- 1-f1                               # inverte as tonalidades
plot(density(f1), xlim=c(0,1))
b <- 0.47
abline(v=b)

filled.contour(f1, asp=1)
display(f1) # escala cinza com claro sendo a folha

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

f2 <- f1
f2[f1<b] <- 1
f2[f1>=b] <- 0
display(f2) # ops! temos a borda da placa presente, removê-la!
            # selecionar só pixels dentro de um círculo que exclui tal borda

# usado para selecionar pontos detro um círculo de certo raio
mx <- nrow(f1)/2; my <- ncol(f1)/2 # centro da imagem

# matriz de distâncias de cada pixel a partir do centro
M <- outer(1:nrow(f1), 1:ncol(f1),
           function(i,j) sqrt((i-mx)^2+(j-my)^2))
str(M)

f2 <- f1
f2[f1<b] <- 1
f2[f1>=b] <- 0
f2[M>155] <- 0
display(f2) # ok! região do micélio

f3 <- f1
f3[f1<0.65] <- 1
f3[f1>=0.65] <- 0
display(f3) # região do interior da placa de petri

#-----------------------------------------------------------------------------
# tratamento que remove pontos pretos dentro das regiões brancas

f2 <- bwlabel(f2)  # identifica os conjuntos brancos
f2 <- fillHull(f2) # elimina pontos pretos dentro do branco
f3 <- fillHull(f3)

display(f2)
display(f3)

kern <- makeBrush(3, shape="disc", step=FALSE) # remove 1 px

f2 <- erode(f2, kern) # remove alguns ruídos
f3 <- erode(f3, kern)

display(f2)
display(f3)

#-----------------------------------------------------------------------------
# calcula as dimensões e converte para cm pois o diâmetro da placa é 10cm

dimen <- c(area=pi*5^2, peri=2*pi*5, 5, 5, 5) # em cm
micel <- computeFeatures.shape(f2)
placa <- computeFeatures.shape(f3)

cm <- micel*dimen/placa
cm # área em cm² e demais em cm

#-----------------------------------------------------------------------------
# prepara para exportação (escolher preenchido ou borda)

f4 <- paintObjects(f2, f0, opac=c(NA, 0.45), col=c(NA, "red")) # preenchido
f4 <- paintObjects(f2, f0, opac=c(1, NA), col=c("black", NA))  # borda
display(f4)

xy <- computeFeatures.moment(f2, f0)[, c("m.cx", "m.cy")] # centro de massa
font <- drawfont(weight=600, size=15)
f5 <- drawtext(f4, xy=xy,
               labels=paste(format(cm[,"s.area"], digits=4), "cm²"),
               font=font, col="black")
display(f5)

writeImage(f5, "f042.jpg")

#-----------------------------------------------------------------------------
About these ads
Categoriasdados Tags:

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 44 outros seguidores

%d blogueiros gostam disto: