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.
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.
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.background
I
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.imadjust
I2
uint8
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)
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 .labelmatrix
bwconncomp
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 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')
bwareaopen
| bwconncomp
| imadjust
| imbinarize
| imopen
| imread
| imshow
| label2rgb
| labelmatrix
| regionprops