Segmentação de imagens
Diretório das imagens
# mudar de acordo com a pasta em seu computador
setwd("E:/Desktop/tiagoolivoto/static/tutorials/pliman_esalq/leaves")
Importar imagens
library(pliman)
img <- image_import("img_1.jpeg")
img <- image_resize(img, 50)
plot(img)
Segmentação de imagem
No pliman
, as seguintes funções podem ser usadas para segmentar uma imagem.
image_binary()
para produzir uma imagem binária(preto e branco)image_segment()
para produzir uma imagem segmentada(objetos de imagem e um fundo branco).image_segment_iter()
para segmentar uma imagem iterativamente.
Ambas as funções segmentam a imagem com base no valor de algum índice de imagem, que pode ser uma das bandas RGB ou qualquer operação com essas bandas. Internamente, essas funções chamam image_index()
para calcular esses índices.
Aqui, usamos o argumento index"
para testar a segmentação com base no RGB e seus valores normalizados. Os usuários também podem fornecer seu índice com o argumento my_index
.
# Calcule os índices
indexes <- image_index(img, index = c("R, G, B, NR, NG, NB"))
# Crie um gráfico raster com os valores RGB
plot(indexes)
# Crie um histograma com os valores RGB
plot(indexes, type = "hist")
Neste exemplo, podemos ver a distribuição dos valores RGB (primeira linha) e os valores RGB normalizados (segunda linha). Os dois picos representam a folha (pico menor) e o fundo (pico maior). Quanto mais clara for a diferença entre esses picos, melhor será a segmentação da imagem.
A função image_segmentation()
é usada para segmentar imagens usando índices de imagem. Em nosso exemplo, usaremos os mesmos índices calculados abaixo para ver como a imagem é segmentada. A saída desta função pode ser usada como entrada na função analyze_objects()
.
segmented <- image_segment(img, index = c("R, G, B, NR, NG, NB"))
Parece que o índice "G"
proporcionou melhor segmentação.
Produzindo uma imagem binária
Também podemos produzir uma imagem binária com image_binary()
. A título de curiosidade, usaremos os índices "B"
(azul). Por padrão, image_binary()
redimensiona a imagem para 30% do tamanho da imagem original para acelerar o tempo de computação. Use o argumento resize = FALSE
para produzir uma imagem binária com o tamanho original.
binary <- image_binary(img)
# tamanho de imagem original
image_binary(img,
index = "G",
resize = FALSE)
Para contornar a questão de pixeis não segmentados no interior da image, o argumento fill_hull
pode ser utilizado.
image_binary(img,
index = "G",
resize = FALSE,
fill_hull = TRUE)