Segmentación de imágenes Matlab

Parte 1. Implicaciones de la segmentación de imágenes

       La segmentación de imágenes consiste en dividir la imagen en varias regiones inconexas según la escala de grises, el color, la forma geométrica, la textura espacial y otras características de la imagen; de hecho, consiste en extraer el objetivo de la imagen y separarlo del fondo;

Parte II Tipos de Segmentación de Imágenes en Matlab

   1. Método de detección de bordes (utilice la diferencia entre la unión entre el objetivo y el fondo para extraer el borde)

   2. Método de segmentación de umbral (establezca un umbral, el lugar por debajo del umbral es 0 negro y el lugar por encima del umbral es 1 blanco)

   3. Método de segmentación de regiones ()

Parte 3. Método de detección de bordes

Principales métodos de detección: operadores diferenciales (operador Roberts, operador Sobel, operador Prewit), operador LOG, operador Canny; 

1. Detección de segmentos de línea en la imagen:

Al igual que el filtrado, debe haber plantillas. Hay cuatro plantillas básicas en total:

[-1 -1 -1; 2 2 2; -1 -1 -1] detección de nivel

[-1 -1 2; -1 2 -1; 2 -1 -1] Detección de +45 grados

[-1 2 -1; -1 2 -1; -1 2 -1] detección vertical

[2 -1 -1; -1 2 -1; -1 -1 2] Detección de -45 grados

Luego, la plantilla y la imagen se combinan y filtran, usando la función imfilter

2. Operador diferencial

<1>Operador Robert:

clc
clear all
I = imread('dream.jpg');
I=rgb2gray(I);
[J, thresh] = edge(I, 'Roberts', 30/255); %进行边缘检测 ,Roberts算子, 分割阈值为30/255
figure;
subplot(121),imshow(I);
subplot(122),imshow(J);

El interior 30/255 es el umbral de segmentación, el umbral real es umbral*256, donde umbral es el valor normalizado;

<2>Operador de Sobel: el uso es el mismo que el del operador de Roberts, simplemente cambie el parámetro en borde a Sobel

<3>Operador Prewit: el uso es el mismo que el del operador de Roberts, simplemente cambie el parámetro en borde a Prewit

3. Operador REGISTRO:

En la aplicación de la función edge, tanto log como canny corresponden al parámetro sigma, que es la desviación estándar del filtro correspondiente; Canny corresponde al filtro gaussiano (el valor predeterminado es sqrt(2)), y LOG corresponde al filtro gaussiano Filtro laplaciano tor (el valor predeterminado es 2)

4. Operador astuto:

Su característica especial es que su umbral incluye dos, un umbral bajo y un umbral alto, ignora la parte del borde por debajo del umbral bajo y mantén la parte por encima del umbral alto;

Parte IV Método de segmentación por umbral

1. Puede usar el histograma para establecer el umbral. Primero leemos la imagen en escala de grises y luego usamos la función imhist para mostrar el histograma;

%图像分割(全局阈值,借助直方图)
clc
clear all
I=rgb2gray(imread('dream.jpg'));
figure (1)
imhist(I);
R=I>125;%大于125的地方为白(1),小于为黑(0)
figure(2);
imshow(R);

 Se puede ver que podemos encontrar un umbral del histograma y juzgar de acuerdo con este umbral;

2. Segmentación de umbral Otsu, puede usar la función graythresh para obtener automáticamente el umbral y luego segmentar de acuerdo con este umbral;

%Otsu阈值分割
clc
clear all
I=rgb2gray(imread('dream.jpg'));
M=graythresh(I);%自动获取阈值
J=im2bw(I,M);%根据M的大小来进行分割
figure;
imshow(J);

 3. Segmentación de umbral iterativo, el principio es muy simple. Primero, lea la imagen en escala de grises, establezca un valor de precisión (aquí se establece S) y establezca una variable de valor inicial S1 igual a la suma de los valores máximo y mínimo de la imagen en escala de grises. La mitad, luego establezca dos variables r1 y r2, r1 es la suma de todos los elementos mayores que el valor inicial variable S1, r2 es la suma de todos los elementos menores o iguales a S1; establezca la variable S2 igual a (promedio de r1 + promedio del número r2)/2; después de ingresar al ciclo while, haga que S1 sea igual a S2 después de la conversión, y luego repita los pasos anteriores hasta que la precisión sea menor que la precisión establecida S1; en este momento, el obtenido S2 es el valor umbral, y luego muestra la imagen binaria a través de im2bw;

%迭代式阈值分隔法
clc
clear all
I=rgb2gray(imread('dream.jpg'));
I=im2double(I);
S=0.1;
S1=(max(I(:))+min(I(:)))/2;
r1=find(I>S1);
r2=find(I<=S1);
S2=(mean(I(r1))+mean(I(r2)))/2;
while abs(S2-S1)>S
   S1=S2;
   r1=find(I>S1);
   r2=find(I<=S1);
   S2=(mean(I(r1))+mean(I(r2)))/2;
end
J=im2bw(I,S2);
figure;
imshow(J);

Parte V. Método de Segmentación de Regiones

1. Método de crecimiento de regiones: el
crecimiento de regiones consiste en comparar continuamente una semilla (es decir, un punto) con los puntos circundantes y luego fusionar la región con un gran trazo. La condición de fusión es que la similitud con los puntos circundantes es menor que un cierta precisión Luego continúe expandiendo la fusión hacia afuera hasta que todos los puntos similares se fusionen y se detengan Aquí usamos el valor gris para medir;

El crecimiento de la región generalmente se divide en los siguientes pasos:

1. Determinar el punto de siembra

2. Determine si usará el vecindario 8 o el vecindario 4 como objeto de fusión

3. La relación de la diferencia entre el valor de gris y el valor de umbral (también se pueden agregar otras condiciones de juicio, configuradas de acuerdo con la situación real)

4. Hasta que el crecimiento se detenga, es decir, el punto en el que el crecimiento ya no se satisface

Ejemplo:

clc
clear all
I=rgb2gray(imread('dream.jpg'));
if isinteger(I)%判断是否为整数数组,若不为整数数组I的值过大,这样设置的精度就得改变,不能太小,否则无法得到想要的图片
    I=im2double(I);
end
figure 
imshow(I)
[M,N]=size(I);
[y,x]=getpts; %单击取点后,按enter结束
x1=round(x);%获得整数x
y1=round(y);%获得整数y
seed=I(x1,y1); %获取中心像素灰度值

grow1=zeros(M,N);%要绘制二值图,就可以先设置为0数组
grow1(x1,y1)=1;%种子点设为1,满足条件的点在后续判断中也会设为一

growcount=1; %待处理点个数
threshold=0.15;%与isinteger相互结合起来理解,如果没有isinteger,该值应该变得很大

while growcount>0
    growcount=0;
     for i=1:M %让种子去融合图片中满足的所有点
        for j=1:N
            if grow1(i,j)==1 %点在"栈"内,即一开始先检测到种子点,然后根据判断条件去判断种子点邻域的点是否满足条件,若满足为1,然后进行下一轮循环进行判断,直到循环时没有点可以满足添加进行融合了
                if (i-1)>1&(i+1)<M&(j-1)>1&(j+1)<N %确保可以将8邻域完全放置
                    for u=-1:1 %8邻域生长
                        for v=-1:1
                            if (grow1(i+u,j+v)==0&abs(I(i+u,j+v)-seed)<=threshold)%只有在点为0的时候才进行,否则gowtcount会计算错误
                                grow1(i+u,j+v)=1;%种子合并其他点,只要满足条件的点都会和种子点一样置1
                                growcount=growcount+1;  %记录此次新生长的点个数
                            end
                        end
                    end
                end
            end
        end
    end
end

subplot(1,2,1),imshow(I);
title("original image")
subplot(1,2,2),imshow(grow1);
title("growed image")

Puede consultar el algoritmo de crecimiento de la región basado en matlab para realizar el código de crecimiento de la región del blog-CSDN blog_matlab de realizar_minisal, el contenido se comenta en él, siempre que comprenda los pasos del crecimiento de la región, el código lo entenderá naturalmente;

2. Método de segmentación de cuencas hidrográficas:

El método de transformación de cuencas generalmente incluye los siguientes pasos:

1. Lee la imagen en escala de grises

2. Establezca la marca de primer plano (limpie la imagen reconstruyendo y reconstruyendo), erosión + reconstrucción en

3. Cierre de ampliación + reconstrucción

4. Reconstrucción morfológica + inversión de imagen

5. Encuentre el valor máximo local + combine la imagen en escala de grises con el valor máximo local

6. Elimine los puntos desordenados circundantes para el máximo local (primero cierre la operación, luego corroa)

7. Combinando el máximo local modificado con la imagen en escala de grises

8. Calcule la marca de fondo y use la imagen limpia (es decir, la imagen reconstruida abierta y reconstruida cerrada) para la binarización

9. Pero, idealmente, no queremos que los marcadores de fondo estén demasiado cerca de los bordes de los objetos que queremos segmentar, por lo que podemos hacerlo calculando la bwtransformación de la cuenca de la transformación de la distancia y luego buscando la cresta de la cuenca resultante.

10. Utilice la función imimposemin para modificar la imagen de magnitud de gradiente de modo que los mínimos regionales se muestren en los píxeles de los marcadores de primer plano y de fondo;

11. Realice una segmentación de cuenca hidrográfica en la imagen de magnitud de gradiente modificada (segmente el límite del objeto)

12. Finalmente, para la visualización visual, la imagen original en escala de grises, el marcador de primer plano, el marcador de fondo y el objeto segmentado se pueden combinar en una sola imagen, y los marcadores de primer plano y de fondo se escalan a diferentes valores enteros para asignarles diferentes etiquetas. .

Ejemplo:

clc
clear all
I=rgb2gray(imread('apple.jpg'));
tidu=imgradient(I);
% figure;
% imshow(tidu,[]);
se=strel('disk',20);
fs=imerode(I,se);
fscj=imreconstruct(fs,I);
pz=imdilate(fscj,se);
pzcj=imcomplement(imreconstruct(imcomplement(pz),imcomplement(fscj)));
figure;
imshow(pzcj);
dgm=imregionalmax(pzcj);
figure;
imshow(dgm);
I2=labeloverlay(I,dgm);
figure;
imshow(I2);
se2 = strel(ones(5,5));
fgm2 = imclose(dgm,se2);
fgm3 = imerode(dgm,se2);
figure;
imshow(fgm3);
fgm4=bwareaopen(fgm3,15);
%I3=labeloverlay(I,fgm4);
I(fgm4)=255;
figure
imshow(I);
bw1=imbinarize(pzcj);
D = bwdist(bw1);
DL = watershed(D);
bgm = DL == 0;
figure;
imshow(bgm);
gmag2 = imimposemin(tidu, bgm|fgm4);
L=watershed(gmag2);
labels = imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4;
I4 = labeloverlay(I,labels);
figure;
imshow(I4);

Supongo que te gusta

Origin blog.csdn.net/new_EAGLE/article/details/125821401
Recomendado
Clasificación