O pacote R pliman
This post is also available in English
Introdução
Tenho o prazer de anunciar o lançamento do pliman
(pant image analysis) 0.2.0 no
CRAN. pliman
é um pacote para análise de imagens, com foco especial em imagens de plantas. A análise de imagens é uma ferramenta útil para obter informações quantitativas para objetos alvo. No contexto de imagens de plantas, quantificar a área foliar, a severidade das doenças, o número de lesões, contar o número de grãos, obter estatísticas de grãos (por exemplo, comprimento e largura) são algumas das tarefas que agrônomos, melhoristas, fitopatologistas, geneticistas e biólogos fazem rotineiramente.
O pacote irá ajudá-lo a:
- Medir a área foliar com
leaf_area()
- Contar a gravidade da doença com
symptomatic_area()
- Contar o número de lesões com
count_lesions()
- Contar objetos em uma imagem com
count_objects()
- Obter os valores RGB para cada objeto em uma imagem com
objects_rgb()
- Obter estatisticas de objetos com
get_measures()
- Plotar as estatisticas do objetos com
plot_measures()
Instalação
Instale a última versão estável do pliman
do
CRAN com:
install.packages("pliman")
A versão de desenvolvimento do pliman
pode ser instalada do
GitHub com:
devtools::install_github("TiagoOlivoto/pliman")
# To build the HTML vignette use
devtools::install_github("TiagoOlivoto/pliman", build_vignettes = TRUE)
Nota: Se você for um usuário do Windows, é sugerido instalar a versão mais recente do Rtools antes.
Breves exemplos
Área foliar
Medir a área foliar é uma tarefa muito comum para melhoristas e agrônomos. A área foliar é usada como um recurso chave para o cálculo de vários índices, como o Índice de Área da Folha (IAF), que quantifica a quantidade de material foliar em um dossel. No pliman, os pesquisadores podem medir a área foliar usando imagens de folhas de duas maneiras principais. O primeiro, usando leaf_area()
usa uma amostra de folhas junto com um modelo com uma área conhecida. As paletas de cores de fundo, folha e modelo devem ser declaradas. Uma forma alternativa de calcular a área foliar em pliman
é usando count_objects()
. Esta função tem a vantagem de usar segmentação de imagem com base em vários índices (por exemplo, valores de vermelho, verde e azul, RGB). Portanto, as paletas de amostra não precisam ser inseridas. No exemplo a seguir, calcularemos a área da folha da imagem leaves
com esta última abordagem. Para mais detalhes e outros exemplos, veja esta
vinheta.
library(pliman)
# |========================================================|
# | Tools for Plant Image Analysis (pliman 0.2.0) |
# | Author: Tiago Olivoto |
# | Type 'vignette('pliman_start')' for a short tutorial |
# | Visit 'https://bit.ly/3eL0dF3' for a complete tutorial |
# |========================================================|
leaves <- image_import(image_pliman("la_leaves.JPG"))
image_show(leaves)
count <- count_objects(leaves)
#
# --------------------------------------------
# Number of objects: 6
# --------------------------------------------
# statistics area perimeter
# min 4332.00 253.0000
# mean 26704.17 533.5000
# max 44763.00 727.0000
# sd 16286.76 197.2265
# sum 160225.00 3201.0000
plot_measures(count)
A função get_measures()
é utilizada para ajustar a área foliar utilizando o objeto 6. Sabe-se que este objeto tem um lado de 2 cm, portanto apresenta 4 cm \(^2\)
.
area <-
get_measures(count,
id = 6,
area ~ 4)
# -----------------------------------------
# measures corrected with:
# object id: 6
# area: 4
# -----------------------------------------
area
# id x y area perimeter radius_mean radius_min radius_max
# 1 1 537.3833 498.9915 41.332410 22.091245 3.678437 2.756046 5.259454
# 2 2 438.6512 165.2385 35.362881 19.477975 3.370650 2.875019 4.546890
# 3 3 110.8785 477.0276 31.268698 20.116099 3.268759 2.374700 4.856987
# 4 4 178.4196 174.2348 27.445983 18.201727 3.027071 2.307497 4.394600
# 5 5 315.2358 434.6106 8.535549 9.693407 1.655947 1.311698 2.253471
# 6 6 313.4910 655.2052 4.000000 7.687875 1.125488 0.926436 1.378890
Contagem de grãos em uma imagem
Aqui, contaremos os grãos na imagem soybean_touch.png
. Esta imagem tem um fundo ciano e contém 30 grãos de soja se tocando. Visite
este post para mais detalhes e exemplos.
soy <- image_import (image_pliman ("soybean_touch.jpg"))
image_show(soy)
A função count_objects()
segmenta a imagem usando o índice azul padrão como padrão, como segue $ NB = (B / (R + G + B)) $, onde \(R\)
, \(G\)
e \(B\)
são os faixas vermelhas, verdes e azuis. Os objetos são contados e os objetos segmentados são coloridos aleatoriamente
count <- count_objects(soy)
#
# --------------------------------------------
# Number of objects: 30
# --------------------------------------------
# statistics area perimeter
# min 1366.0000 117.000000
# mean 2057.3667 146.600000
# max 2445.0000 158.000000
# sd 230.5574 8.406073
# sum 61721.0000 4398.000000
Os usuários podem remover cores aleatórias e identificar objetos (neste exemplo, grãos) usando os argumentos marker = "text"
e show_segmentation = FALSE
. A cor de fundo também pode ser alterada com o argumento col_background
. Neste exemplo, apenas os cinco maiores grãos na área serão identificados usando topn_upper = 5
.
count2 <-
count_objects(soy,
marker = "text",
show_segmentation = FALSE,
col_background = "white",
topn_upper = 5)
#
# --------------------------------------------
# Number of objects: 5
# --------------------------------------------
# statistics area perimeter
# min 2299.00000 152.000000
# mean 2334.60000 154.200000
# max 2445.00000 158.000000
# sd 62.07495 2.387467
# sum 11673.00000 771.000000
# Obtém as medidas do objeto
(medidas <- get_measures(count2))
# id x y area perimeter radius_mean radius_min radius_max
# 4 1 345.3566 105.78323 2445 158 27.51343 24.68250 30.47116
# 11 2 468.9970 56.42549 2315 155 26.76542 23.03064 30.78003
# 3 3 237.5917 339.82483 2312 152 26.69878 23.96521 29.04402
# 5 4 406.9314 77.54909 2302 153 26.64891 23.96546 29.63586
# 2 5 538.0561 401.89604 2299 153 26.60716 24.95688 28.40020
Severidade de doenças
A severidade da doença em plantas é um parâmetro importante para medir o nível da doença e, portanto, pode ser usada para prever a produção e recomendar tratamentos. No pliman
, a função symptomatic_area()
é usada para quantificar a severidade das doenças. O usuário fornece paletas de cores, diz ao pliman
o que cada uma representa e ele cuida dos detalhes.
img <- image_import(image_pliman("sev_leaf.jpg"))
healthy <- image_import(image_pliman("sev_healthy.jpg"))
symptoms <- image_import(image_pliman("sev_sympt.jpg"))
background <- image_import(image_pliman("sev_back.jpg"))
image_combine(img, healthy, symptoms,background)
# Computar a severidade de doenças
symptomatic_area(img = img,
img_healthy = healthy,
img_symptoms = symptoms,
img_background = background,
show_image = TRUE)
# healthy symptomatic
# 1 88.98089 11.01911
Processamento em lote
Na análise de imagens de plantas, frequentemente é necessário processar mais de uma imagem. Por exemplo, no melhoramento de plantas, o número de grãos por planta (por exemplo, trigo) é frequentemente usado na seleção indireta de plantas de alto rendimento. No pliman
, o processamento em lote pode ser feito quando o usuário declara o argumento img_pattern
.
O exemplo a seguir seria usado para contar os objetos nas imagens com um nome de padrão "trat"
(por exemplo, "trat1"
, "trat2"
, "tratn"
) salvos na subpasta “originals"
no diretório de trabalho atual. As imagens processadas serão salvas na subpasta "processed"
. O objeto list_res
será uma lista com dois objetos (results
e statistics
) para cada imagem.
Para acelerar o tempo de processamento, especialmente para um grande número de imagens, o argumento parallel = TRUE
pode ser usado. Nesse caso, as imagens são processadas de forma assíncrona (em paralelo) em sessões R
separadas rodando em segundo plano na mesma máquina. O número de seções é configurado para 90% dos núcleos (virtuais) disponíveis. Este número pode ser controlado explicitamente com o argumento workers
.
list_res <-
count_objects(img_pattern = "trat", # matches the name pattern in 'originals' subfolder
dir_original = "originals",
dir_processed = "processed",
parallel = TRUE, # parallel processing
workers = 8, # 8 multiple sections
save_image = TRUE)
Siga o
projeto pliman no Research Gate.
Compartilhe este post nas suas redes sociais.
Aproveite as funcionalidades do pacote!