Esta página es para la versión anterior. La página correspondiente en inglés se eliminó en la versión actual.

Corrección de la iluminación no uniforme

En este ejemplo se muestra cómo corregir la iluminación no uniforme en una imagen para facilitar la identificación de granos individuales de arroz en la imagen. A continuación, puede aprender sobre las características de los granos y calcular fácilmente las estadísticas de todos los granos en la imagen.

Paso 1: Leer imagen

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

Paso 2: Utilice la abertura morfológica para estimar el fondo

Observe que la iluminación de fondo es más brillante en el centro de la imagen que en la parte inferior. Utilice imopen para estimar la iluminación de fondo.

background = imopen(I,strel('disk',15));  % Display the Background Approximation as a Surface figure surf(double(background(1:8:end,1:8:end))),zlim([0 255]); ax = gca; ax.YDir = 'reverse';

Paso 3: Sustraer la imagen de fondo de la imagen original

I2 = I - background; imshow(I2)

Note que el paso 2 y el paso 3 juntos podrían ser reemplazados por un solo paso usando imtophat que primero calcula la abertura morfológica y luego la resta de la imagen original.

I2 = imtophat (I, Strel (' Disk ', 15));

Paso 4: Aumentar el contraste de la imagen

I3 = imadjust(I2); imshow(I3);

Paso 5: Umbral de la imagen

Cree una nueva imagen binaria al umbralar la imagen ajustada. Elimine el ruido de fondo con bwareaopen.

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

Paso 6: Identificar objetos en la imagen

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

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

Paso 7: Examinar un objeto

Cada objeto distinto está etiquetado con el mismo valor entero. Mostrar el grano que es el 50 componente conectado.

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

Paso 8: Ver todos los objetos

Una forma de visualizar los componentes conectados es crear una matriz de etiquetas y, a continuación, mostrarla como una imagen de pseudo-color indexada.

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

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

En la imagen de pseudo-color, la etiqueta que identifica cada objeto en la matriz de etiquetas se asigna a un color diferente en la matriz colores asociada. Utilice label2rgb para elegir el colores, el color de fondo y cómo los objetos de la matriz de etiquetas se asignan a los colores de la colores.

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

Paso 9: Calcular área de cada objeto

Cada grano del arroz es uno componente conectado en la estructura cc. Utilice regionprops en cc para obtener el área.

graindata = regionprops(cc,'basic')
graindata = 95x1 struct array with fields:
    Area
    Centroid
    BoundingBox

Para encontrar el área del componente 50, utilice la notación de puntos para acceder al campo área en el elemento 50 de la matriz de estructura graindata.

graindata(50).Area
ans = 194 

Paso 10: Calcular estadísticas basadas en el área

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

grain_areas = [graindata.Area];

Encuentra 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);

Paso 11: Crear histograma del área

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