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.

Corrija la iluminación no uniforme y analice los objetos de primer plano

En este ejemplo se muestra cómo mejorar una imagen como un 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 en 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

Leer 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. Preprocese la imagen para que la iluminación de fondo sea más uniforme.

Como primer paso, retire todo el primer plano (granos de arroz) utilizando la abertura morfológica. La operación de apertura elimina objetos pequeños que no pueden contener completamente el elemento de estructuración. Define un elemento de estructuración en forma de disco con un radio de 15, que encaja 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 abertura morfológica, utilice con el elemento de estructuración.imopen

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

Reste la imagen de aproximación de fondo, de la imagen original, y visualice 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)

Utilínela para aumentar el contraste de la imagen procesada saturando el 1% de los datos en intensidades bajas y altas, y extendiendo los valores de intensidad para rellenar el rango dinámico.imadjustI2uint8

I3 = imadjust(I2); imshow(I3)

Tenga en cuenta que los dos pasos anteriores podrían sustituirse por un solo paso mediante el cual primero calcula la abertura 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 poder utilizar las funciones de Toolbox 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)

Identifique objetos en la imagen

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

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

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

cc.NumObjects
ans = 95 

Ver el grano de arroz que se etiqueta 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 mostrándolo 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 usa para elegir el colormap, el color de fondo y cómo los objetos de la matriz de etiquetas se asignan a los colores en el ColorMap.label2rgb En la imagen 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)

Estadísticas basadas en área de computación

Calcule 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 = 95x1 struct array with fields:
    Area
    Centroid
    BoundingBox

Cree un nuevo Vector, que contiene la medición de área para cada grano.grain_areas

grain_areas = [graindata.Area];

Encuentre el área del componente 50.

grain_areas(50)
ans = 194 

Busque y visualice 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 las áreas de grano de arroz.histogram

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

Consulte también

| | | | | | | | |