Segmentación de imágenes: algoritmo de cuenca hidrográfica
Nombre: Xie Yiyuan
ID de estudiante: 19021110366T
Introducción a la vaca incrustada: los objetos de destino en la imagen están conectados entre sí, por lo que es difícil segmentar El algoritmo de segmentación de cuencas hidrográficas se utiliza a menudo para abordar este tipo de problemas y normalmente logra mejores resultados.
Embed Niu Nose: segmentación de imágenes, algoritmo de cuenca hidrográfica
Embed Niu preguntó: ¿Cuáles son los pasos específicos del algoritmo de cuenca hidrográfica?
Texto de vaca incrustado:
1. Descripción general
El algoritmo de segmentación de cuencas considera la imagen como un "mapa topográfico", en el que los valores de píxeles de las áreas con mayor brillo son más grandes, mientras que los valores de píxeles en las áreas más oscuras son más pequeños, la imagen se segmenta buscando "cuencas de captación" y "límites de cuencas hidrográficas". Sin embargo, el efecto de aplicar directamente el algoritmo de segmentación de cuencas hidrográficas a menudo no es bueno. Si los objetos de primer plano y los objetos de fondo están marcados y distinguidos en la imagen, la aplicación del algoritmo de cuenca hidrográfica logrará mejores resultados de segmentación. El método de segmentación de cuencas basado en el control de marcadores tiene los siguientes pasos básicos:
1? Descripción general
El algoritmo de segmentación de cuencas considera la imagen como un "mapa topográfico", en el que los valores de píxeles El valor de píxel del área más oscura es menor y el valor de píxel del área más oscura es menor. La imagen se segmenta buscando la "cuenca de captación" y el "límite de la cuenca". El efecto de aplicar directamente el algoritmo de segmentación de cuencas hidrográficas a menudo no es bueno. Si los objetos de primer plano y los objetos de fondo están marcados y distinguidos en la imagen, la aplicación del algoritmo de cuenca hidrográfica logrará mejores resultados de segmentación. El método de segmentación de cuencas basado en el control de marcadores tiene los siguientes pasos básicos:
1. Calcular la función de segmentación. Las áreas más oscuras de la imagen son los objetos a segmentar
2. Calcula el punto de referencia del primer plano. Estos son píxeles de burbujas conectados dentro de cada objeto.
3. Calcula la bandera de fondo. Son elementos que no pertenecen a ningún objeto.
4. Modifique la función de segmentación para que solo tenga valores mínimos en las posiciones de las marcas de primer plano y fondo.
5. Realice el cálculo de transformación de cuenca hidrográfica en la función de segmentación modificada.
Uso de la caja de herramientas de procesamiento de imágenes de MATLAB
Nota: durante el período se utilizaron muchas funciones de la caja de herramientas de procesamiento de imágenes, como fspecial, imfilter, watershed, label2rgb, imopen, imclose, imreconstruct, imcomplement, Funciones imregionalmax, bwareaopen, graythresh e imponemin, etc.
2? Pasos
?El primer paso: leer la imagen en color y convertirla en una imagen en escala de grises
borrar todo;
rgb = imread('pears.png');
if ndims(rgb) == 3
?I = rgb2gray(rgb);
else
?I = rgb;
end
figure('unidades', 'normalizado', 'posición', [0 0 1 1]);
Paso 2: use la amplitud del gradiente como función de segmentación
Use el operador de borde de Sobel para filtrar la imagen en las direcciones horizontal y vertical, y luego calcule el módulo valor, la imagen filtrada por el operador sobel mostrará valores relativamente grandes en los límites y tendrá valores muy pequeños sin límites.
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicar') ;
Ix = imfilter(double(I), hx, 'replicar');
gradmag = sqrt(Ix.^2 + Iy.^2);
figura('unidades', 'normalizado', 'posición', [0 0 1 1]);
subplot(1, 2, 1); imshow(I,[]), título ('Imagen en escala de grises')
subplot(1, 2, 2); imshow(gradmag,[]), title('Imagen de magnitud del gradiente')
¿Puedo directamente Magnitud del gradiente? ¿Imagen usando el algoritmo de cuenca hidrográfica?
L = watershed(gradmag);
Lrgb = label2rgb(L);
figure('units', 'normalized', 'position', [ 0 0 1 1]);
subplot(1, 2, 1); imshow(gradmag,[]), title('Imagen de magnitud de gradiente')
subplot(1, 2, 2); imshow(Lrgb); title('Amplitud de gradiente para la transformación de cuencas')
Los resultados obtenidos utilizando directamente la imagen del valor del módulo de gradiente para el algoritmo de cuencas a menudo tienen una segmentación excesiva. Por lo tanto, normalmente es necesario marcar los objetos de primer plano y los de fondo por separado para obtener mejores resultados de segmentación.
Paso 3: Marcar objetos de primer plano
Hay varios métodos que se pueden aplicar aquí para obtener marcadores de primer plano, que deben estar conectados en píxeles de burbujas dentro del objeto de primer plano. En este ejemplo, se utilizarán las técnicas morfológicas "reconstrucción basada en apertura" y "reconstrucción basada en cierre" para limpiar la imagen. Estas operaciones crearán máximos unitarios dentro de cada objeto, lo que permitirá ubicarlos usando imregionalmax.
Operaciones de apertura y cierre: primero la corrosión y luego la expansión se llama apertura primero y luego la corrosión se llama cierre; Las operaciones de apertura y cierre pueden eliminar detalles específicos de la imagen más pequeños que los elementos estructurales y, al mismo tiempo, no garantizan una distorsión geométrica global. La operación de apertura puede filtrar los espolones más pequeños que los elementos estructurales y cortar las superposiciones delgadas para desempeñar el papel de separación; la operación de cierre puede llenar los huecos o agujeros más pequeños que los elementos estructurales y superponer los intervalos cortos para desempeñar el papel de conexión; .
La operación de apertura es expansión después de la corrosión, y la reconstrucción basada en apertura (operación de apertura basada en reconstrucción) es reconstrucción morfológica después de la corrosión. Compare estos dos métodos a continuación. Primero, use imopen para realizar la operación de apertura.
se = strel('disk', 20);
Io = imopen(I, se);
figure('units', 'normalizado' , 'posición', [0 0 1 1]);
subplot(1, 2, 1); imshow(I, []); título('Imagen en escala de grises');
subplot(1, 2, 2); imshow(Io), title('Operación de apertura de imagen')
A continuación, el cálculo de reconstrucción basado en la apertura se realiza mediante la reconstrucción después de la erosión.
Es decir = imerode(I,se)
Iobr = imreconstruct(Es decir,I);
figure('unidades', 'normalizado', 'posición ', [0 0 1 1]);
subplot(1, 2, 1); imshow(I, []); title('Imagen en escala de grises');
subplot. (1, 2, 2); imshow(Iobr, []), title('Imagen reconstruida basada en la apertura')
Después de la operación de apertura, seguida de la operación de cierre, se pueden eliminar las manchas más oscuras y marcas de ramas. Compare las operaciones de cierre morfológico convencionales y las operaciones de reconstrucción basadas en el cierre. Primero, use imclose:
Ioc = imclose(Io, se);
Ic = inclose(I,se);
figure('units', 'normalizado', 'posición', [0 0 1 1]);
subplot(2, 2, 1); imshow(I, []); p>
subplot(2, 2, 2); imshow(Io, []); title('Abrir la imagen operativa');
subplot(2, 2, 3); Ic, []); title('Imagen de operación de cierre');
subplot(2, 2, 4); imshow(Ioc, []), title('Operación de apertura y cierre');
p>Ahora use imdilate, luego imreconstruct. Tenga en cuenta que la imagen de entrada debe complementarse y la imagen de salida de imreconstruct debe complementarse. IM2 = implementar(IM) calcula el complemento de la imagen IM. IM puede ser una imagen binaria o una imagen RGB. IM2 tiene el mismo tipo y tamaño de datos que IM.
Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr) );
figure('unidades', 'normalizado', 'posición', [0 0 1 1]);
subplot(2, 2, 1); , []); title('Imagen en escala de grises');
subplot(2, 2, 2); imshow(Ioc, []); >
subplot(2, 2, 3); imshow(Iobr, []); title('Imagen reconstruida basada en la apertura');
subplot(2, 2, 4); Iobrcbr, []), title('Imagen reconstruida basada en cierre');
Al comparar Iobrcbr y loc, podemos ver que en la aplicación de eliminar pequeñas manchas sin afectar la forma global del objeto, basado en reconstrucción La operación de apertura y cierre es más eficiente que la reconstrucción de apertura y cierre estándar. Calcule el máximo local de Iobrcbr para obtener un mejor etiquetado en primer plano.
fgm = imregionalmax(Iobrcbr);
figure('unidades', 'normalizada', 'posición', [0 0 1 1]);
subplot(1, 3, 1); imshow(I, []); título('Imagen en escala de grises');
subplot(1, 3, 2); ('Operación de apertura y cierre basada en reconstrucción');
subplot(1, 3, 3); imshow(fgm, []); p>Para ayudar a comprender este resultado, superponga marcadores de primer plano sobre la imagen original.
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, : , 3);
It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;
I2 = cat(3, It1, It2, It3 );
figure('unidades', 'normalizado', 'posición', [0 0 1 1]);
subplot(2, 2, 1); , []); title('Imagen original');
subplot(2, 2, 2); imshow(Iobrcbr, []);
subplot(2, 2, 3); imshow(fgm, []); título('Imagen máxima local');
subplot(2, 2, 4); (I2); title('Máximo local superpuesto a la imagen original');
Tenga en cuenta que la mayoría de las oclusiones y objetos de sombra no están marcados, lo que significa que estos objetos no estarán razonablemente representados en los resultados. división. Además, algunos objetos tienen marcadores de primer plano que se extienden hasta el borde del objeto. Esto significa que debes limpiar los bordes de los puntos marcados y luego encogerlos. Esto se puede lograr mediante operaciones de cierre y operaciones de corrosión.
se2 = strel(ones(5,5));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2) ;
figure('unidades', 'normalizado', 'posición', [0 0 1 1]);
subplot(2, 2, 1); []); title('Operación de apertura y cierre basada en reconstrucción');
subplot(2, 2, 2); imshow(fgm, []);
subplot(2, 2, 3); imshow(fgm2, []); title('Cerrar operación');
subplot(2, 2, 4); fgm3, []); title('Operación de erosión');
Este proceso dejará algunos píxeles perdidos, que deben eliminarse. Puede utilizar bwareaopen para eliminar manchas que tengan menos de una determinada cantidad de píxeles. BW2 = bwareaopen(BW,P) elimina los bloques conectados con menos de P valores de píxeles de la imagen binaria para obtener otra imagen binaria BW2.
fgm4 = bwareaopen(fgm3, 20);
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2 );
It3 = rgb(:, :, 3);
It1(fgm4) = 255; It2(fgm4) = 0; It3(fgm4) = 0; p>
I3 = cat(3, It1, It2, It3);
figure('unidades', 'normalizado', 'posición', [0 0 1 1]);
subplot(2, 2, 1); imshow(I2, []); title('Máximo local superpuesto a la imagen original');
subplot(2, 2, 2); imshow(fgm3, []); title('Cerrar operación de corrosión');
subplot(2, 2, 3); imshow(fgm4, []); ;
subplot(2, 2, 4); imshow(I3, []); title('Modificar el máximo local y superponerlo a la imagen original');
Paso 4: Calcular la etiqueta de fondo
Ahora, necesitas etiquetar el fondo. En la imagen limpia Iobrcbr, los píxeles oscuros pertenecen al fondo, por lo que se puede comenzar con una operación de umbral.
bw =im2bw(Iobrcbr, graythresh(Iobrcbr));
figure('units', 'normalized', 'position', [0 0 1 1]); p> p>
subplot(1, 2, 1); imshow(Iobrcbr, []); title('Operación de apertura y cierre basada en reconstrucción');
subplot(1, 2, 2); imshow(bw, []); title('Threshold Segmentation');
Los píxeles del fondo están en el área negra, pero idealmente no es necesario que los marcadores del fondo también lo estén. cerca del borde del objeto a segmentar. "Adelgace" el fondo, o SKIZ, el primer plano de bw calculando el "rango de influencia del esqueleto". Esto se puede lograr calculando la transformada de la cuenca hidrográfica de la transformada de distancia de bw y luego encontrando la cresta de la cuenca hidrográfica resultante (DL==0). D = bwdist(BW) calcula la matriz euclidiana de la imagen binaria BW. Para cada píxel de BW, la transformación de distancia especifica la distancia entre el píxel y el píxel de BW distinto de cero más cercano. bwdist utiliza la fórmula de distancia euclidiana de forma predeterminada. BW puede tener cualquier dimensión y D y BW tienen el mismo tamaño.
D = bwdist(bw);
DL = cuenca(D);
bgm = DL == 0;
figura ('unidades', 'normalizado', 'posición', [0 0 1 1]);
subplot(2, 2, 1); imshow(Iobrcbr, []); operación de apertura y cierre de reconstrucción');
subplot(2, 2, 2); imshow(bw, []); , 2, 3); imshow(label2rgb(DL), []); title('Diagrama de transformación de la cuenca');
subplot(2, 2, 4); title ('Mapa de crestas de transformación de cuenca');
Paso 5: Calcular la transformación de cuenca de la función de segmentación
La función imimposemin se puede utilizar para modificar la imagen de modo que solo sea en posiciones requeridas específicas Hay mínimos locales.
Imposemin se puede utilizar aquí para modificar la imagen de amplitud del gradiente de modo que solo tenga mínimos locales en los píxeles marcados en primer plano y en el fondo.
gradmag2 = imimposemin(gradmag, bgm | fgm4);
figure('unidades', 'normalizado', 'posición', [0 0 1 1]);
subplot(2,2,1)imshow(bgm,[]);title('Mapa de crestas de transformación de cuencas hidrográficas');
subplot(2, 2, 2); []); title('marca de primer plano');
subplot(2, 2, 3); imshow(gradmag, []); p> subplot(2, 2, 4); imshow(gradmag2, []); title('Modificar imagen de amplitud de gradiente');
Finalmente, se puede realizar el cálculo de segmentación de imágenes basado en la cuenca hidrográfica.
Paso 6: Ver los resultados
Una técnica de visualización consiste en superponer marcadores de primer plano, marcadores de fondo y límites de objetos segmentados en la imagen inicial. La dilatación se puede utilizar para lograr ciertos requisitos, como hacer que los límites de los objetos sean más visibles. El límite del objeto se coloca en L==0.
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, : , 3);
fgm5 = imdilar(L == 0, unos(3, 3)) | bgm | fgm4;
It1(fgm5) = 255; = 0; It3(fgm5) = 0;
I4 = cat(3, It1, It2, It3);
figure('unidades', 'normalizado', 'posición' , [0 0 1 1]);
subplot(1, 2, 1); imshow(rgb, []); título('Imagen original');
subplot( 1, 2, 2); imshow(I4, []); title('Marcadores y bordes de objetos superpuestos a la imagen original');
Visualización de cómo los marcadores de primer plano y de fondo afectan los resultados. En varios lugares, partes de los objetos más oscuros se fusionan con sus vecinos más brillantes adyacentes porque los objetos ocluidos no tienen marcadores de primer plano.
Otra técnica de visualización útil es mostrar la matriz del marcador como una imagen en color. Las matrices de etiquetas, como las obtenidas por watershed y bwlabel, se pueden convertir en imágenes en color verdadero para mostrarlas usando label2rgb.
Lrgb = label2rgb(L,'jet', 'w', 'shuffle');
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(rgb, []); título('Imagen original');
subplot(1, 2, 2); imshow(Lrgb); title('Matriz de marcadores de cuencas coloreadas');
Puede utilizar la transparencia para superponer esta matriz de marcadores de pseudocolor y mostrarla en la imagen de brillo original.
figure('unidades', 'normalizado', 'posición', [0 0 1 1]);
subplot(1, 2, 1); ]); título('Imagen original');
subplot(1, 2, 2); imshow(rgb, []);
himage = imshow(Lrgb). );
set(himage, 'AlphaData', 0.3);
title('Matriz de marcadores superpuesta a la imagen original');