Matlab之图像分割技术(十一)

图像分割就是把图像分成各具特性的区域,并提取出感兴趣目标的技术。图像分割在很多领城都有着非常广泛的应用,并涉及各种不同类型的图像。
这里将详细的介绍图像分割技术,主要包括边缘分割技术、阈值分割技术和区域分割技术等。

边缘检测

边缘检测是利用物体和背景在某种图像特性上的差并来实现的。常见的边缘检测方法有:微分算子、Canny算子和LOG算子等。

图像中的线段

将图像点某个邻域中每个像素值都与模板中对应的系数相乘,然后将结果进行累加,从而得到该点的新像素值。如果邻域的大小为mXn,则总共有mn个系数。这些系数组成的矩阵,称为模板或算子。通常采用的最小模板是3X3。
对于图像中的间断点,常用的检测模板为:

矩阵
 [-1 -1 -1
  -1  s -1
  -1 -1 -1]

对于图像中的线段,常用的检测模板为:

矩阵1:水平方向线段
 [-1 -1 -1
   2  2  2
  -1 -1 -1]
  
矩阵2:正45°方向线段
 [-1 -1  2
  -1  2 -1
   2 -1 -1]

矩阵3:竖直方向线段
 [-1  2 -1
  -1  2 -1
  -1  2 -1]

矩阵4:负45°方向线段
 [ 2 -1 -1
  -1  2 -1
  -1 -1  2]

举例如下:

close all;clear all;
I = imread('lena_color_512.tif');
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; 

figure;
subplot(121), imshow(I);
subplot(122), imshow(J);

在这里插入图片描述

微分算子

常用的微分算子有Sobel算子、Prewitt算 子和Roberts算子。通过这些算子对图像进行滤波,就可以得到图像的边缘。

Roberts算子

对于离散的图像,边缘检测算子就是用图像的垂直和水平差分来逼近梯度算子

clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
[J, thresh] = edge(I, 'roberts', 35/255); 
%使用边缘函数,roberts算子,35/255为图像分割阈值
%thresh为返回的阈值,实际阈值为thresh*256

figure;
subplot(121); imshow(I);
subplot(122); imshow(J);

在这里插入图片描述

Prewitt算子

F = (f(x,y)-f(x-1,y), f(x,y)-f(x,y-1))
Prewitt算子的大小为3X3,如下所示:

%图像的水平梯度
[ -1 -1 -1
   0  0  0
   1  1  1]

%垂直梯度
[-1  0  1
 -1  0  1
 -1  0  1]

举个例子

clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
[J, thresh] = edge(I, 'prewitt', [], 'both'); %使用边缘函数,prewitt算子,both即水平和垂直两个方向分量均选择

figure;
subplot(121); imshow(I);
subplot(122); imshow(J);

在这里插入图片描述

Sobel算子

Sobel算子的大小和Prewitt算子的大小相同,都是3X3。Soble算子的模板如下所示:

[-1  0  1
 -2  0  2
 -1  0  1]

[ -1 -2 -1
   0  0  0
   1  2  1]

在MATLAB中,函数edge()可以采用Sobel算子进行边缘检测。

clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
[J, thresh] = edge(I, 'sobel', [], 'horizontal'); %使用边缘函数,sobel算子,检测水平边缘

figure;
subplot(121); imshow(I);
subplot(122); imshow(J);

在这里插入图片描述

Canny算子

Canny算子具有低误码率、高定位精度和抑制虚假边缘等优点。函数edge( )可以采用Canny算子进行边缘检测。
该函数的调用格式为:

BW = edge(I, 'canny’)
%该函数采用Canny算子对图像I进行边缘检测,并采用自动计算的低阈值和高阈值进行图像分割,函数的返回值BW为二值图像。

BW = edge(I, ' canny' , thresh)
%该函数中对分割阈值thresh进行设置,thresh为包含2个元素的向量,分别是低阈值和高阈值。如thresh为单个数值的标量,则thresh为高阈值,0.4*thresh作为低阈值。

BW = edge(I, ‘canny’,  thresh, sigma)
%该函数中对高斯滤波器的标准差sigma进行设置,默认值为1[BW, thresh] = edge(I, 'canny'...)
%该函数返回分割时所采用的阈值thresh。

举个例子

clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
J = imnoise(I, 'gaussian', 0, 0.005);
[K, thresh] = edge(J, 'canny'); %使用边缘函数,canny算子,噪声没有影响

figure;
subplot(121); imshow(J);
subplot(122); imshow(K);

在这里插入图片描述

LOG算子

拉普拉斯(Laplacian) 算子是一种不依赖于边缘方向的二阶微分算子,它是标量而不是矢量,而且具有旋转不变的性质,在图像处理中经常被用来提取图像的边缘,表达式为:
f’’ = f’’/x’’ + f’’/y’’

数字图像的近似公式为:
V"(f(x,y)) = f(x+1, y) + f(x-1, y) + f(x, y+1) + f(x, y-1) - 4f(x, y)

clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
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);

在这里插入图片描述

阈值分割技术

阈值分割技术是最简单的一种图像分割方法,关键在于子找合适的阁值,通常根据图像的直方图来选取。下面对阈值分割技术进行详细的介绍。

全局阈值

可以通过全局的信息,例如整个图像的灰度直方图。如果在整个图像中只使用一个阈值,则这种方法叫做全局阈值法,整个图象分成两个区域,即目标对象(黑色)和背景对象(白色)。全局阈值将整个图像的灰度阈值设置为常数。
对于物体和背景对比比较明显的图像,其灰度直方图为双峰形状,可以选择两峰之间的波谷对应的像素值做为全局阈值,将图像分割为目标对象和背景。

在这里插入图片描述
即从原来的灰度直方图上可以看到其阈值大概在哪,然后进行分割
以下图为例

clear all;
close all;
I = imread('cameraman.tif');

figure;
subplot(121), imshow(I);
subplot(122), imhist(I);

在这里插入图片描述
阈值为60,故我们可以写代码

clear all;
close all;
I = imread('cameraman.tif');

J = I > 60;
[width, height] = size(I);
for i = 1: width
    for j = 1: height
        if (I(i, j) > 80)
            K(i, j) = 1;
        else
            K(i, j) = 0;
        end
    end
end

figure;
subplot(121), imshow(J);
subplot(122), imshow(K);

左边为阈值选取60的,右边为阈值选取80的,可看到细节,裤腿上60的细节丰富些
在这里插入图片描述
也可以直接采用转换为二值图像来处理

clear all;
close all;
[X, map] = imread('cameraman.tif');
K = im2bw(X, map, 0.4);

figure;
subplot(121), imshow(X);
subplot(122), imshow(K);

在这里插入图片描述

OTSU阈值分割

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

clear all;
close all;
I = imread('cameraman.tif');
T = graythresh(I);  %采用OTSU算法来获取全局阈值
K = im2bw(I, T);

figure;
subplot(121), imshow(I);
subplot(122), imshow(K);

在这里插入图片描述

迭代式阈值分割

迭代阈值法是阈值法图像分割中比较有效的方法,通过迭代的方法来求出分割的最佳阈值,具有一定的自适应性。选代法阈值分割的步骤如下:
(1)设定参数,并选择一个初始的估计阈值。
(2)用阈值分割图像。将图像分成两部分:由灰度值大于的像素组成,由灰度值小于或等于的像素组成。
(3)计算和中所有像素的平均灰度值和,以及新的阈值。
(4)如果两者之差小于规定的差,则推出结果,即为最优阈值;否则,将赋值给新的阈值,并重复步骤
(2)~ (4),直到获取最优阈值。

clear all;
close all;
I = imread('cameraman.tif');
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;
end

J = im2bw(I, T2);

figure;
subplot(121), imshow(I);
subplot(122), imshow(J);

在这里插入图片描述

区域分割技术

图像分割的方法很多,除了边缘分割和阈值分割等方法以外,还可以采用区域分割。区域分割主要包括区域生长法和分水岭分割法。

区域生长法

区域生长是一种串行区域分割的图像分割方法。区域生长的基本思想是将具有相似性质的像素集合起来构成区城。区城增长方法根据同一物体区城内像素的相似性质来聚集象素点的方法,从初始区城(如小邻城或单个象素)开始,将相邻的具有同样性质的象素或其它区城归并到日前的区域中从而逐步增长区域,直至没有可以归并的点或其它小区域为止。区域内象素的相似性度量可以包括平均灰度值、纹理、颜色等信息。

分水岭分割

分水岭算法借鉴了形态学理论,是一种较新的基于区域的图像分割算法。在该方法中,将一幅图像看成一个地形图,灰度值对应地形的高度值,高灰度值对应着山峰,低灰度值对应着山谷水总是朝地势低的地方流动,直到某个局部低洼处,这个低洼处就是盆地。最终所有的水都会处于不同的盆地,盆地之间的山春称为分水岭。

clear all;
close all;
I = imread('cameraman.tif');
T = graythresh(I);  %采用OTSU算法来获取全局阈值
J = im2bw(I, T);  %要求的是二值图像
J = watershed(J, 8); %采用八连通区域

figure;
subplot(121), imshow(I);
subplot(122), imshow(J);

在这里插入图片描述


图像的分割是很有趣的呢,很多东西可以直接调用函数来实现,继续加油哈~

发布了96 篇原创文章 · 获赞 224 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44790423/article/details/104822923