图像分割(matlab)

图像分割是将一幅数字图像分割成不同区域,在同一区域内具有在一定的准测下可认为是相同的性质,如灰度、颜色、纹理等,而任何相邻区域之间其性质具有明显的区别,主要包括边缘分割技术、阈值分割技术和区域分割技术

边缘分割技术

利用物体和背景在某种图像特性上的差异来实现的。

图像中的线段

将图像点x(x,y)某个领域中的每个像素值都与模板中对应的系数相乘,然后将结果进行累加,从而得到该点的新像素值。如果邻域的大小为m×n,则总共有mn个系数。这些系数组成矩阵,称为模板或算子。
对于图像中的间断点,常用的检测模板为:在这里插入图片描述

对于图像中的线段,常用的检测模板为:分别对应水平线段、+45°线段、垂直线段和-45°线段
在这里插入图片描述
检测图像中的线段

>> I = imread('E:\persional\matlab\images\house.tif');
>> 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);%显示检测到的线段

在这里插入图片描述

微分算子

通过算子对图像进行滤波,可以得到图像的边缘

Roberts算子:对于离散的图像f(x,y),边缘检测算子就是用图像的垂直和水平差分来逼近梯度算子,即为:
▽f = (f(x,y)-f(x-1,y),f(x,y)-f(x,y-1))
在进行边缘检测时,对图像中的每个像素计算▽f,然后求绝对值,最后进行阈值操作就可以实现。
Roberts算子计算公式:
在这里插入图片描述
Roberts算子由下面的两个模板组成:
在这里插入图片描述
采用函数edge()进行图像的边缘检测,该函数的返回值为二值图像,和输入图像大小相同,数据类型为逻辑型

BW = edge(I,‘roberts’)
BW = edge(I,‘roberts’,thresh)
[BW,thresh] = edge(I,‘roberts’,…)

BW:二值图像
thresh:分割阈值

图像边缘检测:

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> [J,thresh] = edge(I,'roberts',15/255);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

在这里插入图片描述

Prewitt算子:更加复杂的图像大小为3×3的算子
在这里插入图片描述
BW = edge(I,‘Prewitt’)
BW = edge(I,‘Prewitt’,thresh)
BW = edge(I,'Prewitt,thresh,direction)
[BW,thresh] = edge(I,‘Prewitt’,…)

BW:二值图像
thresh:分割阈值,可以为空矩阵[ ],如若不设置,系统自动计算阈值进行分割
direction:可以取值horizontal、vertical和borth,默认为borth

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I); 
>> [J,thresh] = edge(I,'Prewitt',[],'both');%采用prewitt算子边缘检测
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

在这里插入图片描述

Sobel算子:

BW = edge(I,‘Sobel’)
BW = edge(I,‘Sobel’,thresh)
BW = edge(I,‘Sobel’,thresh,direction)
[BW,thresh] = edge(I,‘Sobel’,…)

BW:二值图像
thresh:分割阈值,可以为空矩阵[ ],如若不设置,系统自动计算阈值进行分割
direction:可以取值horizontal、vertical和borth,默认为borth

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> [J,thresh] = edge(I,'sobel',[],'horizontal');%采用sobel算子检测边缘
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

在这里插入图片描述

采用函数fspecial()产生预定义模板:

>> format rat;%设置为有理输出
>> hsobel = fspecial('sobel');%获得水平方向的算子,可以通过转置得到垂直方向的算子
>> hprewitt = fspecial('prewit');%获得水平方向的算子,可以通过转置得到垂直方向的算子
>> hlaplacian = fspecial('laplacian');
>> hlog = fspecial('log',3);
>> format short;%设置输出数据的格式
>> hsobel

hsobel =

     1     2     1
     0     0     0
    -1    -2    -1

>> hprewitt

hprewitt =

     1     1     1
     0     0     0
    -1    -1    -1

>> hlaplacian

hlaplacian =

    0.1667    0.6667    0.1667
    0.6667   -3.3333    0.6667
    0.1667    0.6667    0.1667

>> hlog

hlog =

    0.4038    0.8021    0.4038
    0.8021   -4.8233    0.8021
    0.4038    0.8021    0.4038

采用函数fespecail()和imfilter提取图像的边缘:

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> h = fspecial('laplacian');
>> J = imfilter(I,h,'replicate');%图像滤波
>> K = im2bw(J,20/255);%变为二值图
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(J);%显示灰度
>> subplot(133),imshow(K);%二值图像

在这里插入图片描述

Canny算子

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

BW = edge(I,‘canny’)
BW = edge(I,‘canny’,thresh)
BW = edge(I,‘canny’,thresh,sigma)
[BW,thresh] = edge(I,‘canny’,…)

BW:二值图像
thresh:分割阈值,可以为空矩阵[ ],如若不设置,系统自动计算阈值进行分割
sigma:对高斯滤波器的标准值sigma进行设置,默认值为1

>> I = imread('E:\persional\matlab\images\house.tif');
>> 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 算子

拉普拉斯算子是一种不依赖边缘方向的二阶微分算子,它是标量而不是矢量,而且具有旋转不变的性质,在图像处理中经常被用来提取图像的边缘,表达式:
在这里插入图片描述
数字图像的近似公式:▽2 f(x,y) = f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1) - 4*f(x,y)
由于Laplacian算子是二阶微分算子,对图像中的噪声非常敏感,首先采用Gaussian函数对图像进行平滑,然后采用Laplacian算子根据二阶导数过零点来检测图像边缘,称为LOG

BW = edge(I,‘log’)
BW = edge(I,‘log’,thresh)
BW = edge(I,‘log’,thresh,sigma)
[BW,thresh] = edge(I,‘log’,…)

BW:二值图像
thresh:分割阈值,可以为空矩阵[ ],如若不设置,系统自动计算阈值进行分割
sigma:对高斯滤波器的标准值sigma进行设置,默认值为2,滤波器大小为n×n,其中n为ceil(sigma×3)×2+1

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> J = imnoise(I,'gaussian',0,0.05);
>> [K,thresh] = edge(J,'log',[],6);
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(J);
>> subplot(133),imshow(K);

在这里插入图片描述

阈值分割技术

阈值分割技术是最简单的一种图像分割方法,关键在于寻找合适的阈值,通常根据图像的直方图来选取

全局阈值

通过全局的信息,例如整个图像的灰度直方图。如果在整个图像中只使用一个阈值,则这种方法叫做全局阈值法,整个图像分成两个区域,即目标对象(黑色)和背景对象(白色)。全局阈值将整个图像的灰度阈值设置为常熟。
对于物体和背景对比较明显的图像,其灰度直方图为双峰形状,可以选择两峰之间的波谷对应的像素值作为全局阈值,将图像分割为目标对象和背景。公式如下:
在这里插入图片描述
其中f(x,y)为点(x,y)的像素值,g(x,y)为分割后的图像,T为全局阈值,通常通过直方图来获取全局阈值。

采用全局阈值对图像进行分割:

>> I = imread('E:\persional\matlab\images\house.tif');
>> [width,height] = size(I);
>> imhist(I,200);
>> J = I>124;%图像分割,阈值为124
>> for i=1:width
		for j=1:height
			if(I(i,j)>164)%图像分割,阈值为164
				K(i,j)=1;
			else
				K(i,j)=0;
			end
		end
  end
>> figure,
>> subplot(121),imshow(J);
>> subplot(122),imshow(K);

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/71b9dcb425124071afc9713ca9d77278.png#pic_center在这里插入图片描述

对于彩色图像来说,首先将其转换成灰度图像,然后再转换为二值图像

BW = im2bw(I,level)
BW = im2bw(X,map,level)
BW = im2bw(RGB,level)
level:阈值

>> I = imread('E:\persional\matlab\images\ln.tif');
>> [I1,map] = rgb2ind(I,64);%变成索引图像
>> J = ind2gray(I1,map);%索引图像转换成灰度图像
>> K = im2bw(I1,map,0.4);图像分割
>> figure,
>> subplot(131),imshow(I1);
>> subplot(132),imshow(J);
>> subplot(133),imshow(K);

在这里插入图片描述

Otsu阈值分割

最大方差法,该算法是在灰度直方图的基础上采用最小二乘法原理推导出来的,基本原理是以最佳的阈值将图像的灰度值分割成为两部分,使两部分之间的方差最大,即具有最大的分离性
设f(x,y)为大小为M×N图像f上(x,y)处的灰度值,灰度等级为L,则f(x,y)∈[0,L-1]。若灰度级i的所有像素个数为fi,则第i级灰度出现的概率为:p(i) = fi/(M×N)
将图像中的像素按灰度级用阈值t划分为两类。即背景C0和目标C1.背景C0的灰度级为0-t-1,目标C1的灰度级为t-L-1。背景C0和目标C1对应的像素分别为:{f(x,y)<t}和{f(x,y)>=t}
在这里插入图片描述
在这里插入图片描述
k的范围为0~L-1,计算不同k值下的类间方差,使得类间方差最大,k即为最优的阈值

level = graythresh(I)
level:最优的阈值

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> T = graythresh(I);
>> J = im2bw(I,T);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

在这里插入图片描述

迭代式阈值分割

迭代阈值分割的步骤如下:
1、设定参数T0,并选择一个初始的估计阈值T1
2、用阈值T1分割图像。将图像分成两部分:G1是灰度值大于T1的像素组成,G2是小于或等于T1的像素组成
3、计算G1和G2中所有像素的平均灰度值μ1和μ2,以及新的阈值T2 = (μ1+μ2)/2
4、如果|T2-T1|<T0,则T2为最优阈值,否则T2赋值给T1,并重复步骤2~4,直到最优

>> I = imread('E:\persional\matlab\images\house.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);

在这里插入图片描述

区域分割技术

区域生长法

区域生长的基本思想是将具有相似性质的像素集合起来构成区域,其可以包括平均灰度值、纹理和颜色等信息。

分水岭分割

把图像看成一幅地形图,灰度值对应地形的高度值,高灰度值对应山峰,低灰度值对应山谷。水总是朝低势流动,知道低洼处,所有的水都会处于不同的盆地,盆地之间的山脊称为分水岭,分水岭分割相当于是一个自适应的多阈值分割算法

L = watershed(I)
L = watershed(I,conn)
L:标记矩阵,分水岭为0,第几个水盆就是几
conn:连通区域

>> I = imread('E:\persional\matlab\images\ba.tif');
>> J = watershed(I,8);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_56260304/article/details/127508588
今日推荐