O pacote R pliman

Image by Tiago Olivoto

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!

Next
Previous