Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Iluminación no uniforme correcta y análisis de objetos de primer plano

En este ejemplo se muestra cómo mejorar una imagen como paso de preprocesamiento antes del análisis. En este ejemplo, se corrige la iluminación de fondo no uniforme y se convierte la imagen en una imagen binaria para facilitar la identificación de objetos de primer plano (granos individuales de arroz). A continuación, puede analizar los objetos, como buscar el área de cada grano de arroz, y puede calcular estadísticas para todos los objetos de la imagen.

Preprocesar la imagen

Lea una imagen en el espacio de trabajo.

I = imread('rice.png'); imshow(I)

La iluminación de fondo es más brillante en el centro de la imagen que en la parte inferior. Preprocesar la imagen para que la iluminación de fondo sea más uniforme.

Como primer paso, retire todo el primer plano (granos de arroz) usando la abertura morfológica. La operación de apertura quita los objetos pequeños que no pueden contener completamente el elemento de estructuración. Defina un elemento de estructuración en forma de disco con un radio de 15, que cabe completamente dentro de un solo grano de arroz.

se = strel('disk',15)
se =  strel is a disk shaped structuring element with properties:        Neighborhood: [29x29 logical]     Dimensionality: 2  

Para realizar la apertura morfológica, utilice con el elemento estructurante.imopen

background = imopen(I,se); imshow(background)

Reste la imagen de aproximación de fondo, , de la imagen original, y vea la imagen resultante.backgroundI Después de restar la imagen de fondo ajustada de la imagen original, la imagen resultante tiene un fondo uniforme, pero ahora es un poco oscura para el análisis.

I2 = I - background; imshow(I2)

Se utiliza para aumentar el contraste de la imagen procesada saturando el 1% de los datos a intensidades bajas y altas y estirando los valores de intensidad para llenar el rango dinámico.imadjustI2uint8

I3 = imadjust(I2); imshow(I3)

Tenga en cuenta que los dos pasos anteriores podrían reemplazarse por un solo paso utilizando el que primero calcula la apertura morfológica y luego la resta de la imagen original.imtophat

I2 = imtophat(I,strel('disk',15));

Cree una versión binaria de la imagen procesada para que pueda utilizar las funciones de la caja de herramientas para el análisis. Utilice la función para convertir la imagen en escala de grises en una imagen binaria.imbinarize Elimine el ruido de fondo de la imagen con la función.bwareaopen

bw = imbinarize(I3); bw = bwareaopen(bw,50); imshow(bw)

Identificar objetos en la imagen

Ahora que ha creado una versión binaria de la imagen original, puede realizar análisis de objetos en la imagen.

Busque todos los componentes conectados (objetos) en la imagen binaria. La precisión de los resultados depende del tamaño de los objetos, del parámetro de conectividad (4, 8 o arbitrario) y de si los objetos se tocan o no (en cuyo caso podrían etiquetarse como un objeto). Algunos de los granos de arroz en la imagen binaria se están tocando.bw

cc = bwconncomp(bw,4)
cc = struct with fields:
    Connectivity: 4
       ImageSize: [256 256]
      NumObjects: 95
    PixelIdxList: {1x95 cell}

cc.NumObjects
ans = 95 

Vea el grano de arroz que está etiquetado como 50 en la imagen.

grain = false(size(bw)); grain(cc.PixelIdxList{50}) = true; imshow(grain)

Visualice todos los componentes conectados en la imagen creando una matriz de etiquetas y, a continuación, mostrándola como una imagen indexada pseudocolor.

Se utiliza para crear una matriz de etiquetas a partir de la salida de .labelmatrixbwconncomp Tenga en cuenta que almacena la matriz de etiquetas en la clase numérica más pequeña necesaria para el número de objetos.labelmatrix

labeled = labelmatrix(cc); whos labeled
  Name           Size             Bytes  Class    Attributes    labeled      256x256            65536  uint8               

Se utiliza para elegir el mapa de colores, el color de fondo y cómo los objetos de la matriz de etiquetas se asignan a los colores del mapa de colores.label2rgb En la imagen de pseudocolor, la etiqueta que identifica cada objeto de la matriz de etiquetas se asigna a un color diferente en una matriz de mapa de colores asociada.

RGB_label = label2rgb(labeled,'spring','c','shuffle'); imshow(RGB_label)

Calcular estadísticas basadas en áreas

Calcular el área de cada objeto de la imagen utilizando .regionprops Cada grano de arroz es un componente conectado en la estructura.cc

graindata = regionprops(cc,'basic')
graindata=95×3 struct
    Area
    Centroid
    BoundingBox

Cree un nuevo vector, que contiene la medida de área para cada grano.grain_areas

grain_areas = [graindata.Area];

Encuentre el área del componente 50.

grain_areas(50)
ans = 194 

Busque y muestre el grano con el área más pequeña.

[min_area, idx] = min(grain_areas)
min_area = 61 
idx = 16 
grain = false(size(bw)); grain(cc.PixelIdxList{idx}) = true; imshow(grain)

Utilice el comando para crear un histograma de áreas de grano de arroz.histogram

histogram(grain_areas) title('Histogram of Rice Grain Area')

Consulte también

| | | | | | | | |