图像分割是将一幅数字图像分割成不同区域,在同一区域内具有在一定的准测下可认为是相同的性质,如灰度、颜色、纹理等,而任何相邻区域之间其性质具有明显的区别,主要包括边缘分割技术、阈值分割技术和区域分割技术
边缘分割技术
利用物体和背景在某种图像特性上的差异来实现的。
图像中的线段
将图像点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);
#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:连通区域文章来源:https://www.toymoban.com/news/detail-439599.html
>> I = imread('E:\persional\matlab\images\ba.tif');
>> J = watershed(I,8);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);
文章来源地址https://www.toymoban.com/news/detail-439599.html
到了这里,关于图像分割(matlab)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!