《MATLAB图像处理实例详解》:CH_7(图像分割技术)

图像分割技术

①提取线段

close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\xianduan.jpg');
I=rgb2gray(I);
h1=[-1 -1 -1;2 2 2;-1 -1 -1];%横线
h2=[-1 -1 2;-1 2 -1;2 -1 -1];%45°斜线
h3=[-1 2 -1;-1 2 -1;-1 2 -1];%竖线
h4=[2 -1 -1;-1 2 -1;-1 -1 2];%135°斜线
J1=imfilter(I,h1);
J2=imfilter(I,h2);
J3=imfilter(I,h3);
J4=imfilter(I,h4);
J=J1+J2+J3+J4;
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

②微分算子

%Roberts算子
close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\gray.jpg');
I=im2double(I);
[J,thresh]=edge(I,'roberts',35/255);%边缘检测,采用Roberts算子,图像分割阈值为35/255
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

%prewitt算子
close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\gray.jpg');
I=im2double(I);
[J,thresh]=edge(I,'prewitt',[],'both');%边缘检测,水平和垂直边缘都检测
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

%sobel算子
%eg.1
close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\gray.jpg');
I=im2double(I);
[J,thresh]=edge(I,'sobel',[],'horizontal');%边缘检测,检测水平边缘
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

%eg.2
close all;clear all;clc;
I = imread('E:\Matlab_exercise\图片素材\lenn.jpg');
subplot(241);imshow(I,[]);title('原图');

J1 = edge(I,'sobel',0.06);
subplot(242);imshow(J1,[]);title('sobel 0.06');
J2 = edge(I,'sobel',0.09);
subplot(243);imshow(J2,[]);title('sobel 0.09');
J3 = edge(I,'sobel',0.12);
subplot(244);imshow(J3,[]);title('sobel 0.12');
%滤波
sigma = 0.6;%滤波器的标准差
N = 5;%滤波模板大小是(2N+1*(2N+1,默认为3*3的矩阵
N_row = 2*N+1;
gausFilter = fspecial('gaussian',[N_row N_row],sigma);%高斯滤波模板
K = imfilter(I,gausFilter,'conv');
subplot(245);imshow(K,[]);title('原图滤波后');

K1 = edge(K,'sobel',0.06);
subplot(246);imshow(K1,[]);title('sobel 0.06');
K2 = edge(K,'sobel',0.09);
subplot(247);imshow(K2,[]);title('sobel 0.09');
K3 = edge(K,'sobel',0.12);
subplot(248);imshow(K3,[]);title('sobel 0.12');

%canny算子
close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\grayBeauty.jpg');
I=im2double(I);
J=imnoise(I,'gaussian',0,0.01);
[K,thresh]=edge(J,'canny');
figure;
subplot(121);imshow(J);
subplot(122);imshow(K);

%LOG算子
close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\grayBeauty.jpg');
I=im2double(I);
J=imnoise(I,'gaussian',0,0.005);
[K,thresh]=edge(J,'log',[],2.3);%thresh为自动计算的分割阈值
figure;
subplot(121);imshow(J);
subplot(122);imshow(K);

%Kirsch算子
close all;clear all;clc;
I = imread('E:\Matlab_exercise\图片素材\lenn.jpg');
figure;imshow(I,[]);title('原图');
%对图像进行均值滤波
I1 = filter2(fspecial('average',3),I);
%对图像进行高斯滤波
I2 = filter2(fspecial('gaussian'),I1);
%利用小波变换对图像进行降噪处理
[thr,sorh,keepapp] = ddencmp('den','wv',I2);%获得除燥的缺省参数
I3 = wdencmp('gbl',I2,'sym4',2,thr,sorh,keepapp);%图像进行降噪处理

%提取图像边缘
t = [0.8 1.0 1.5 2.0 2.5].*10^5;%设定阈值
J = double(I3);
[m,n] = size(J);
g = zeros(m,n);
d = zeros(1,8);
%利用Kirsch算子进行边缘提取
for i=2:m-1;
    for j=2:n-1
       d(1) =(5*J(i-1,j-1)+5*J(i-1,j)+5*J(i-1,j+1)-3*J(i,j-1)+3*J(i,j+1)-3*J(i+1,j-1)-3*J(i+1,j)-3*J(i+1,j+1))^2; 
       d(2) =((-3)*J(i-1,j-1)+5*J(i-1,j)+5*J(i-1,j+1)-3*J(i,j-1)+5*J(i,j+1)-3*J(i+1,j-1)-3*J(i+1,j)-3*J(i+1,j+1))^2; 
       d(3) =((-3)*J(i-1,j-1)-3*J(i-1,j)+5*J(i-1,j+1)-3*J(i,j-1)+5*J(i,j+1)-3*J(i+1,j-1)-3*J(i+1,j)+5*J(i+1,j+1))^2; 
       d(4) =((-3)*J(i-1,j-1)-3*J(i-1,j)-3*J(i-1,j+1)-3*J(i,j-1)+5*J(i,j+1)-3*J(i+1,j-1)+5*J(i+1,j)+5*J(i+1,j+1))^2; 
       d(5) =((-3)*J(i-1,j-1)-3*J(i-1,j)-3*J(i-1,j+1)-3*J(i,j-1)-3*J(i,j+1)+5*J(i+1,j-1)+5*J(i+1,j)+5*J(i+1,j+1))^2; 
       d(6) =((-3)*J(i-1,j-1)-3*J(i-1,j)-3*J(i-1,j+1)+5*J(i,j-1)-3*J(i,j+1)+5*J(i+1,j-1)+5*J(i+1,j)-3*J(i+1,j+1))^2; 
       d(7) =(5*J(i-1,j-1)-3*J(i-1,j)-3*J(i-1,j+1)+5*J(i,j-1)-3*J(i,j+1)+5*J(i+1,j-1)-3*J(i+1,j)-3*J(i+1,j+1))^2; 
       d(8) =(5*J(i-1,j-1)+5*J(i-1,j)-3*J(i-1,j+1)+5*J(i,j-1)-3*J(i,j+1)-3*J(i+1,j-1)-3*J(i+1,j)-3*J(i+1,j+1))^2;      
       g(i,j) = max(d);
    end
end

%显示边缘提取后的图像
for k=1:5
    for i=1:m
        for j=1:n
            if g(i,j)>t(k)
                J(i,j)=255;
            else
                J(i,j)=0;
            end
        end
    end
    figure;imshow(J,[]);
end

③阈值分割技术

%灰度直方图分割
close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\gray.jpg');
J=I>120;
[w,h]=size(I);
for i=1:w
    for j=1:h
        if(I(i,j) > 130)
            K(i,j)=1;
        else
            K(i,j)=0;
        end
    end
end
figure;
subplot(131);imshow(I);
subplot(132);imshow(J);
subplot(133);imshow(K);

%彩色图像转换为二值图像
close all;clear all;clc;
[X,map]=imread('E:\Matlab_exercise\图片素材\trees.bmp');
I=ind2gray(X,map);
J=im2bw(X,map,0.4);%转化为二值图像
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

%OTSU阈值分割
close all;clear all;clc;
[X,map]=imread('E:\Matlab_exercise\图片素材\trees.bmp');
I=ind2gray(X,map);
I=im2double(I);
T=graythresh(I);%OTSU阈值分割
J=im2bw(I,T);
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

%迭代式阈值分割
close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\grayBeauty.jpg');
I=im2double(I);
T0=0.01;
T1=(min(I(:))+max(I(:)))/2;
r1=find(I>T1);
r2=find(I<=T1);
T2=(mean(I(r1))+mean(I(r2)))/2;
while abs(T2-T1)<T0
    T1=T2;
    r1=find(I>T1);
    r2=find(I<=T1);
    T2=(mean(I(r1))+mean(I(r2)))/2;%T2为最佳阈值
end
J=im2bw(I,T2);
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

④区域分割技术

close all;clear all;clc;
I=imread('E:\Matlab_exercise\图片素材\xianduan.jpg');
I=rgb2gray(I);
J=watershed(I,8);%8连通区域
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

版权声明:本文为LIve1AnD1LeARN原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。