基于MATLAB的常见图像处理技术--图像分割技术

图像分割技术介绍

边缘分割技术

图像中的线段

close all; clear all; clc;
I=imread('gantrycrane.png');
I=rgb2gray(I);
h1=[-1, -1. -1; 2, 2, 2; -1, -1, -1];   %模板
h2=[-1, -1, 2; -1, 2, -1; 2, -1, -1];
h3=[-1, 2, -1; -1, 2, -1; -1, 2, -1];
h4=[2, -1, -1; -1, 2, -1; -1, -1, 2];
J1=imfilter(I,h1);          %线段检测
J2=imfilter(I,h2);
J3=imfilter(I,h3);
J4=imfilter(I,h4);
J=J1+J2+J3+J4;              %4条线段叠加
figure; 
subplot(121);imshow(I);     %显示灰度图像
subplot(122);imshow(J);     %显示检测到的线段

微分算子

梯度算子

仅计算相邻像素的灰度差,对噪声比较敏感,无法抑制噪声的影响。

Roberts算子

用垂直和水平差分来逼近梯度算子
与梯度算子检测边缘的方法类似,对噪声敏感,但效果较梯度算子略好。

close all; clear all; clc;
I=imread('rice.png');
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('cameraman.tif');
I=im2double(I);
[J,thresh]=edge(I,'prewitt',[],'both'); %prewitt算子进行边缘检测
figure; 
subplot(121);imshow(I);     %显示原始图像
subplot(122);imshow(J);     %显示边缘图像

Sobel算子

对4邻域采用带权方法计算差分;进一步抑制噪声;但检测的边缘较宽。

close all; clear all; clc;
I=imread('gantrycrane.png');
I=rgb2gray(I);
I=im2double(I);
[J,thresh]=edge(I,'sobel',[],'horizontal'); %sobel算子进行边缘检测
figure; 
subplot(121);imshow(I);     %显示原始图像
subplot(122);imshow(J);     %显示边缘图像

Canny算子

低误码率、高定位精度和抑制虚假边缘等优点。

close all; clear all; clc;
I=imread('rice.png');
I=im2double(I);
J=imnoise(I,'gaussian',0,0.01);  %添加高斯噪声
[K,thresh]=edge(J,'canny');      %Canny算子进行边缘检测
figure; 
subplot(121);imshow(J);     %显示原始图像
subplot(122);imshow(K);     %显示边缘图像

LOG算子(Guassian函数+拉普拉斯Laplacian算子)

拉普拉斯算子

二阶微分算子
优点:各向同性、线性和位移不变的;对细线和孤立点检测效果较好。
缺点:对噪声敏感,有双倍加强作用;不能检测出边的方向;常产生双像素的边缘。

由于梯度算子和拉普拉斯算子对噪声敏感,因此一般在用它们检测边缘前要先对图像进行平滑。

LOG算子

LOG算子:首先采用Guassian函数对图像进行平滑,然后采用Laplacian算子根据二阶导数过零点来检测图像边缘。
优点:边界定位精度高,抗干扰能力强,连续性好等。

close all; clear all; clc;
I=imread('cameraman.tif');
I=im2double(I);
J=imnoise(I,'gaussian',0,0.005);  %添加高斯噪声
[K,thresh]=edge(J,'log',[],2.3);      %LOG算子进行边缘检测
figure; 
subplot(121);imshow(J);     %显示原始图像
subplot(122);imshow(K);     %显示边缘图像

阈值分割技术

阈值分割技术:寻找合适的阈值,通常根据图像的直方图来选取。

全局阈值

分成两个区域:目标对象和背景对象,选取直方图中波谷点的灰度值作为全局阈值,对图像进行阈值分割,将图像中的物体和背景分割开。

close all; clear all; clc;
I=imread('rice.png');
figure; 
subplot(121);imshow(I);     %显示图像
subplot(122);imhist(I,200); %显示直方图
close all; clear all; clc;
I=imread('rice.png');
J=I>120;                 %图像分割,阈值为120
[width,height]=size(I);  %图像的行和列
for i=1:width
    for j=1:height
        if (I(i,j)>130)  %图像分割,阈值为130
            K(i,j)=1;
        else
            K(i,j)=0;
        end
    end
end
figure; 
subplot(121);imshow(J);     
subplot(122);imshow(K); 

im2bw(I,level); 将灰度图像转换为二值图像

close all; clear all; clc;
[X, map]=imread('trees.tif'); 
J=ind2gray(X,map);  %索引图像转换为灰度图像
K=im2bw(X,map,0.4); %图像分割
figure; 
subplot(121);imshow(J);     
subplot(122);imshow(K); 

Otsu阈值分割(最大类间方差法)

Otsu算法:在灰度直方图的基础上采用最小二乘法原理推导出来的,具有统计意义上的最佳分割。
基本原理:以最佳阈值将图像的灰度值分割成两部分,使两部分之间的方差最大,即具有最大的分离性。

close all; clear all; clc;
I=imread('coins.png');
I=im2double(I); 
T=graythresh(I);   %获取阈值
J=im2bw(I,T);      %图像分割
figure; 
subplot(121);imshow(I);     
subplot(122);imshow(J); 

迭代式阈值分割

迭代阈值法:阈值法图像分割中比较有效的方法,通过迭代的方法来求出分割的最佳阈值,具有一定的自适应性。

区域分割技术

区域生长法

优点:顾及了像素的连续性
缺点:区域增长是一种迭代的方法,空间和事件开销都比较大。
区域生长:一种串行区域分割的图像分割方法。
基本思想:将具有相似性质的像素集合起来构成区域。
具体步骤:1.选择一个或一组种子;
2.选择特征及相似性判决准则;
3.从该种子开始向外生长,首先将判断种子领域的像素是否满足相似性条件,满足则与种子合并成区域,然后以合并的像素为生长点,采用类似的方法进行生长
4.反复3操作,直到不再有满足条件的像点合并到区域为止。

分水岭分割

分水岭分割:借鉴了形态学理论,相当于一个自适应的多阈值分割算法。
基本思想:在该方法中,将一幅图像看成一个地形图,灰度值对应地形的高度值,高灰度对应着山峰,低灰度对应着山谷。水总是朝地势低的地方流动,直到某个局部低洼处,这个低洼处就是盆地。最终所有的水都会处于不同的盆地,盆地之间的山脊称为分水岭。
分水岭分割函数:watershed()

close all; clear all; clc;
I=imread('circbw.tif');
J=watershed(I,8);   %分水岭分割
figure; 
subplot(121);imshow(I);     
subplot(122);imshow(J); 

你可能感兴趣的:(基于MATLAB的常见图像处理技术--图像分割技术)