图像分割是从图像处理进到图像分析的关键步骤,是把图像分成各具特性的区域并提取出感兴趣目标的技术和过程。也是进一步图像理解的基础。例如车牌识别,就是把图像分解成构成的部件和对象的过程,把焦点放在汽车牌照上。
图像分割是将像素分类的过程(聚类),分类的依据可建立在:
❑像素间的相似性:如相同的灰度值,相同颜色等
❑非连续性:边界,边缘
不连续性是基于亮度的不连续变化分割图像,如图像的边缘。根据制定的准则将图像分割为相似的区域,如阈值处理、区域生长、区域分离和聚合。下面主要介绍三种区域分割技术:阈值分割法,基于区域的分割,基于边缘的分割。
设原始图像为 f ( x , y ) f(x,y) f(x,y),灰度阈值为 T T T,阈值运算得到的二值图像 g ( x , y ) g(x,y) g(x,y)。则有
g ( x , y ) = { 1 , f ( x , y ) > T 0 , f ( x , y ) ≤ T g(x,y)=\begin{cases} 1 \ , \ f(x,y)>T\\ 0 \ , \ f(x,y)\le T \end{cases} g(x,y)={1 , f(x,y)>T0 , f(x,y)≤T
也有多阈值分割图像,确定一系列阈值,如
g ( x , y ) = k , T k < f ( x , y ) ≤ T k + 1 , k = 0 , 1 , 2 , . . . , K g(x,y)=k,T_k
基于阈值的分割是最古老的分割技术,计算简单。适用于目标与背景有较强对比的景物:图像中组成感兴趣对象的灰度值是均匀的,并且和背景的灰度值不一样。不适合于由许多不同纹理组成一块块区域的图像。
原理:假定物体和背景分别处于不同灰度级,图像的灰度分布曲线近似用两个正态分布概率密度函数分别代表目标和背景的直方图,出现两个分离的峰值。依据最小误差理论等准则求出两个峰间的波谷,其灰度值即分割的阈值。
确定最佳全局阈值的常用方法有:P-tile-thresholding法、直方图分析法、最小误差法、最大类间方差法、迭代阈值法等。下面主要介绍直方图分析法(极小值点阈值选取)、最小误差法(最有阈值法)、最大类间方差法(Otsu法、大津法、自动阈值法)
(1)直方图分析法(极小值点阈值选取)
主要思想是观察图像的直方图,若目标物体内部具有均匀一致的灰度值,并分布在另一个灰度值的均匀背景上,其灰度直方图将有明显双峰。双峰情况下选择两峰之间的谷点作为门限值。该方法简单,但不适用于两峰值相差极大,有宽且平谷底的图像。
若噪声干扰使谷的位置难以判定或者结果不稳定可靠,则可以对直方图进行平滑或曲线拟合。
(2)基于最小误差的最优阈值选取
最优阈值是指使图像中目标和背景分割错误最小的值。暗目标物体的分布函数为 p 1 ( z ) p_1(z) p1(z),权重 θ \theta θ;亮的背景的分布函数 p 2 ( z ) p_2(z) p2(z),权重 1 − θ 1-\theta 1−θ。所以总的灰度级分布概率密度函数: p ( z ) = θ p 1 ( z ) + ( 1 − θ ) p 2 ( z ) p(z)=\theta p_1(z)+(1-\theta)p_2(z) p(z)=θp1(z)+(1−θ)p2(z)。设 Z t Z_t Zt为分割阈值,则总的错误概率为 E ( Z t ) = ( 1 − θ ) ∫ − ∞ Z t p 2 ( z ) d Z + θ ∫ Z t ∞ p 1 ( z ) d Z E(Z_t)=(1-\theta)\int_{-\infty}^{Z_t}p_2(z)dZ+\theta\int_{Z_t}^{\infty}p_1(z)dZ E(Zt)=(1−θ)∫−∞Ztp2(z)dZ+θ∫Zt∞p1(z)dZ。最佳阈值就是使 E ( Z t ) E(Z_t) E(Zt)为最小值时的值,故有 θ p 1 ( Z t ) = ( 1 − θ ) p 2 ( Z t ) \theta p_1(Z_t)=(1-\theta)p_2(Z_t) θp1(Zt)=(1−θ)p2(Zt)。
这种方法不适用于直方图中双峰值差别很大,或双峰间的谷宽广而平坦的情况,以及单峰直方图的情况。
(3)最大类间方差法(Otsu法,大津法,自动阈值法)
Otsu(1979年)被认为是阈值自动选取方法的最优方法,属于基于最小误差的最佳阈值选取方法。基本思想是先设定一个阈值K,将图像分成两组;然后变动K使得两组类间方差最大。该方法计算简单,在一定条件下不受图像对比度与亮度变化的影响,因而在一些实时图像处理系统中得到了广泛的应用。
具体算法:
◼ M × N M\times N M×N大小的图像 f ( x , y ) f(x,y) f(x,y),灰度级取值 [ 0 , L − 1 ] [0,L-1] [0,L−1]。记 p ( k ) p(k) p(k)为灰度值k的频率,则有:
p ( k ) = 1 M N ∑ f ( i , j ) = k 1 p(k)=\frac{1}{MN}\sum_{f(i,j)=k}1 p(k)=MN1f(i,j)=k∑1
◼设用灰度值t为阈值分割出的目标与背景,则有:
目标部分比例: w 0 ( t ) = ∑ 0 ≤ i ≤ t p ( i ) w_0(t)=\sum_{0\le i\le t}p(i) w0(t)=∑0≤i≤tp(i);
背景部分比例: w 1 ( t ) = ∑ t < i ≤ L − 1 p ( i ) w_1(t)=\sum_{tw1(t)=∑t<i≤L−1p(i);
目标均值: μ 0 ( t ) = ∑ 0 ≤ i ≤ t i p ( i ) / w o ( t ) \mu_0(t)=\sum_{0\le i\le t}ip(i)/w_o(t) μ0(t)=∑0≤i≤tip(i)/wo(t);
背景均值: μ 1 ( t ) = ∑ t i p ( i ) / w 1 ( t ) \mu_1(t)=\sum_{t}ip(i)/w_1(t) μ1(t)=∑tip(i)/w1(t);
总均值: μ = w 0 ( t ) μ 0 ( t ) + w 1 ( t ) μ 1 ( t ) \mu=w_0(t)\mu_0(t)+w_1(t)\mu_1(t) μ=w0(t)μ0(t)+w1(t)μ1(t);
类间方差: g = w 0 ( t ) ( μ 0 ( t ) − μ 2 ) + w 1 ( t ) ( μ 1 ( t ) − μ 2 ) g=w_0(t)(\mu_0(t)-\mu^2)+w_1(t)(\mu_1(t)-\mu^2) g=w0(t)(μ0(t)−μ2)+w1(t)(μ1(t)−μ2);
◼图像最佳阈值G
G = M a x ( g ) = M a x [ w 0 ( t ) ( μ 0 ( t ) − μ 2 ) + w 1 ( t ) ( μ 1 ( t ) − μ 2 ) ] G=Max(g)=Max[w_0(t)(\mu_0(t)-\mu^2)+w_1(t)(\mu_1(t)-\mu^2)] G=Max(g)=Max[w0(t)(μ0(t)−μ2)+w1(t)(μ1(t)−μ2)]
方差越大说明构成图像的目标和背景的差别越大,所以取到G是意味着错分概率最小。
I=imread(‘rice.png’); %读取图像
subplot(121),
imshow(I);
title('原始图像')
level=graythresh(I);
BW=im2bw(I,level); %最大类间方差法分割图像
subplot(122),
imshow(BW)
title('自动阈值法分割图像')
disp(strcat('graythresh 计算灰度值:',num2str(uint8(level*255))))
(全局各种方法的结合版)
全局阈值法无法解决目标与背景的灰度范围过度重叠的情况(该情况通常有不均匀的光照所引起),不同区域的物体、背景对比度不一致,难以采用统一的阈值分割,解决办法是根据图像的局部特征分别采用不同的阈值进行分割。
自适应阈值方法的基本步骤
① 将整幅图像分成一系列互相之间有50%重叠的子图像;
② 做出每个子图像的直方图;
③ 检测各个子图像的直方图是否为双峰,如果是,则采用
最佳阈值法确定一个阈值,否则就不进行处理;
④ 根据对直方图为双峰的子图像得到的阈值通过插值得到所有子图像的阈值
上面所提到的阈值的分割有以下缺点:没有或很少考虑空间关系;对噪声敏感;对灰度差异不明显以及不同目标灰度值有重叠的图像分割效果差。基于区域的分割方法利用图像的空间性质,认为分割出来的属于同一区域的像素应具有相似的性质。基于区域的图像分割是根据图像的灰度、纹理、颜色和图像像素统计特征的均匀性等图像的空间局部特征,把图像中的像素划归到各个物体或区域中,进而将图像分割成若干个不同区域的一种分割方法。传统的区域分割法有区域生长法和区域分裂合并法。
◼图像中属于某个区域的像素点必须加以标注
◼在同一区域的像素点必须相连通
◼区域之间不能重叠
◼在区域Ri中每一个像素点必须遵从某种规则P(Ri)
◼两个不同的区域Ri,Rj具有的规则不同
基本思想:
1.以一组生长点开始,搜索其邻域,比较相邻区域与生长点特征的相似性,若它们足够相似,则作为同一区域合并,形成新的生长点
2.以此方式将特征相似的区域不断合并、直到不能合并为止,最后形成特征不同的各区域
以像素灰度为特征进行简单区域生长的步骤:
① 对图像进行扫描,找出尚没有归属的像素。当寻找不到这样的像素时结束操作。
② 把这个像素灰度同其周围(4-邻域或8-邻域)不属于任何一个区域的像素进行比较,若灰度差值小于某一阈值,则将它们合并为同一个区域,并对合并的像素赋予标记。
③ 从新合并的像素开始,反复进行② 的操作。
④ 反复进行② 、③ 的操作,直到区域不能再合并为止。
⑤ 返回①操作,寻找能作为新区域出发点的像素。
区域生长法的三个关键条件的确定:
(1)选择和确定一组能正确代表所需区域的种子像素
(2) 确定在生长过程中能将相邻像素合并进来的相似性准则
(3) 确定终止生长过程的条件或规则
区域分裂原理:将图像分割成越来越小的区域直至每个区域中的像素点具有相似的数值。
❑ 优点:不再需要前面所说的种子像素。
❑ 明显的缺点:会使分割后的区域具有不连续的边界。
❑ 分裂+区域合并:从整个图像出发,根据图像和各区域的不均匀性,把图像或区域分裂成新的子区域;根据毗邻区域的均匀性,把毗邻的子区域合并成新的较大区域。
最常用方法:四叉树分解法
区域合并的规则: P ( R i ∪ R j ) = T U R E P(R_i\cup R_j)=TURE P(Ri∪Rj)=TURE,则可以将两个相邻的区域Ri和Rj进行合并。合并时通常在一个区域中所要考虑的参数不只一个,可以采用统计测试的方式。
基本的分裂合并算法步骤
① 对任何区域Ri,如果 P(Ri)= FALSE,就将每个区域都分裂为4个相连的不重叠区域;
② 对相邻的两个区域 Ri和 Rj ,如果满足 P ( R i ∪ R j ) = T U R E P(R_i\cup R_j)=TURE P(Ri∪Rj)=TURE ,则进行合并。(合并的两个区域可以大小不同,即不在同一层)
③ 当再也没有可以进行合并或分裂的区域,则分割操作停止。
边缘检测是基于边界分割方法的最基本的处理。
边缘检测的方法有传统空域微分算子(Roberts,Prewitt,Sobel,Laplacian);拟合曲面;小波多尺度边缘检测;基于数学形态学的边缘检测。(详见空域图像增强,图像形态学)下面介绍两个算子:LOG和Canny算子。
Marr和Hildreth将Gaussian滤波器和Laplacian边缘检测结合在一起,形成了LOG(Laplacian—Gaussian)算法。算法基本过程:
1.用一个2-D的高斯平滑模板与源图像卷积,平滑
2.计算卷积后图像的拉普拉斯值
3.检测拉普拉斯图像中的过零点作为边缘点
高斯卷积函数定义为:
G σ ( x , y ) = 1 2 π σ 2 e x p ( − x 2 + y 2 2 σ 2 ) G_{\sigma}(x,y)=\frac{1}{\sqrt{2\pi \sigma^2}}exp(-\frac{x^2+y^2}{2\sigma^2}) Gσ(x,y)=2πσ21exp(−2σ2x2+y2)
原始图像与高斯卷积后的拉普拉斯算子定义为:
Δ [ G σ ( x , y ) ∗ f ( x , y ) ] = [ Δ G σ ( x , y ) ] ∗ f ( x , y ) = L O G ∗ F ( x , y ) \Delta[G_\sigma(x,y)*f(x,y)]=[\Delta G_\sigma(x,y)]*f(x,y)=LOG*F(x,y) Δ[Gσ(x,y)∗f(x,y)]=[ΔGσ(x,y)]∗f(x,y)=LOG∗F(x,y)
所以LOG算子定义为:
L O G = Δ G σ ( x , y ) = x 2 + y 2 − 2 σ 2 σ 4 e x p ( − x 2 + y 2 2 σ 2 ) LOG=\Delta G_\sigma(x,y)=\frac{x^2+y^2-2\sigma^2}{\sigma^4}exp(-\frac{x^2+y^2}{2\sigma^2}) LOG=ΔGσ(x,y)=σ4x2+y2−2σ2exp(−2σ2x2+y2)
算法基本过程:
1.计算图像梯度(幅值大小与梯度方向)
2.梯度非极大值抑制NMS(Non-Maxima Suppression)
3.双阈值提取边缘点
Canny(坎尼)算子具体实现步骤:
◼ 用2D高斯滤波模板进行卷积以平滑图像。
◼ 利用微分算子,计算梯度的幅值和方向。
◼ 对梯度幅值进行非极大值抑制。
其过程为找出图像梯度中的局部极大值点,把其它非局部极大值点置零以得到细化的边缘
◼ 用双阈值算法检测和连接边缘。
使用两个阈值T1和T2 (T1 凡是大于T2的一定是边缘;小于T1的一定不是边缘; 如果检测结果介于T1和T2之间,其邻接像素中若有超过T2的边缘像素,则该像素就是边缘,否则就不是边缘。 Canny算子的优点有参数较少,计算效率高,得到的边缘连续完整。但需要注意参数选择时Gauss滤波的尺度与双阈值的选择。 ◼ Roberts算子: ❑ 利用局部差分算子寻找边缘,边缘定位精度较高,但容易丢失一部分边缘。 ❑ 图像没有经过平滑处理,不具备能抑制噪声能力。 ❑ 对具有陡峭边缘且含噪声少的图像效果较好。 ◼ Sobel算子和Prewitt算子: ❑ 都是对图像先做加权平滑处理,然后再做微分运算。 ❑ 所不同的是平滑部分的权值有些差异,因此对噪声具有一定的抑制能力,但不能完全排除检测结果中出现的虚假边缘。 ❑ 边缘定位效果不错,但检测出的边缘容易出现多像素宽度。 ◼ Laplacian算子: ❑ 不依赖于边缘方向的二阶微分算子 ❑ 对图像中的阶跃型边缘点定位准确 ❑ 对噪声非常敏感,使噪声成分得到加强 ❑ 容易丢失一部分边缘的方向信息,造成一些不连续的检测边缘,同时抗噪声能力比较差。 ◼ LOG算子: ❑ 克服了Laplacian算子抗噪声能力比较差的缺点 ❑ 抑制噪声的同时也可能将原有的比较尖锐的边缘平滑掉,造成这些尖锐边缘无法检被测到。 ❑ 高斯函数中方差参数的选择很关键,对图像边缘检测效果有很大的影响。 高斯滤波器为低通滤波器,方差参数越大,通频带越窄,对较高频率的噪声的抑制作用越大,避免了虚假边缘的检出,同时信号的边缘也被平滑了,造成某些边缘点的丢失。反之,方差参数越小,通频带越宽,可以检测到的图像更高频率的细节,但对噪声的抑制能力相对下降,容易出现虚假边缘。 ◼ Canny算子: ❑ 同样采用高斯函数对图像作平滑处理,因此具有较强的抑制噪声能力 ❑ 该算子也会将一些高频边缘平滑掉,造成边缘丢失。 ❑ Canny算子采用用双阈值算法检测和连接边缘,采用的多尺度检测和方向性搜索较LOG算子要好。 小结:目前没有一种统一的方法能解决所有边缘检测问题(抑噪,定位,计算复杂度……),而且边缘敏感性自身与抗噪能力相矛盾。 图像存在噪声时,边缘像素往往是孤立的,或分小段连续。此时就需要封闭边界,即连接边缘像素。所使用的方法是利用边缘像素具有一定的相似性,如像素(s,t)在像素(x,y)的邻域,且他们的梯度幅度和方向满足: Hough变换是1962年由Hough提出来的,用于检测图像中直线、圆、抛物线、椭圆等形状能够用一定函数关系描述的曲线。其基本思想就是点–线的对偶性。 具体算法: ① 取 ( ρ , θ ) (\rho,\theta) (ρ,θ)合理的范围,并网格化,形成一个二维数组,称为累加数组,数组的每个值对应 ρ θ \rho\theta ρθ空间的一个矩形块。 ② 累加数组的每个元素置0。 ③ x y xy xy 空间上的每一点,做Hough变换,对应的 ρ θ \rho\theta ρθ 空间曲线经过的每个网格,其数组值加1。 ④ 找出数组中的局部极大值,其 ( ρ , θ ) (\rho,\theta) (ρ,θ)值就是要检测的直线。 Hough变换的优缺点有:鲁棒性,对噪声不敏感,但运算量大。要对 xy 空间上的每一点在参数空间做曲线。且只能得到直线方程,起点、终点还需要用其它方法。 HOUGH变换在二值图像中检测直线的Matlab实现步骤为: 1.利用hough函数执行霍夫变换,得到霍夫矩阵; 2.houghpeaks函数在霍夫矩阵中寻找峰值点; 3.houghlines函数得到二值图像中的直线信息。 图像的轮廓(边界)跟踪(boundary tracking)与边缘检测是密切相关的,因为轮廓跟踪实质上就是沿着图像的外部边缘“走”一圈。轮廓跟踪也称边缘点连接,是基于梯度的图像分割方法。 实际处理: ❑ 容易受到噪声的影响而偏离物体边界; ❑ 通常需要在跟踪前对梯度(边缘)图像进行平滑、形态学等处理去除噪声点、毛刺、空洞等不需要的部分; ❑ 再通过细化、边缘连接和跟踪等方法获得物体的轮廓边界。4.1.3 算子比较
I=imread('rice.png');
BW1=edge(I,'Roberts'); % Roberts算子
BW2=edge(I,'Sobel'); % Sobel算子
BW3=edge(I,'Prewitt'); % Prewitt算子
BW4=edge(I,'LOG'); % LOG算子
BW5=edge(I,'Canny'); % Canny算子
subplot(2,3,1),imshow(I),title('原图像')
subplot(2,3,2),imshow(BW1),title('Roberts ')
subplot(2,3,3),imshow(BW2),title(' Sobel ')
subplot(2,3,4),imshow(BW3),title(' Prewitt ')
subplot(2,3,5),imshow(BW4),title(' LOG ')
subplot(2,3,6),imshow(BW5),title('Canny ')
4.2 边界闭合
∣ ∇ f ( x , y ) − ∇ f ( s , t ) ∣ ≤ T ∣ φ ( x , y ) − φ ( s , t ) ∣ ≤ A |\nabla f(x,y)-\nabla f(s,t)|\le T\\ |\varphi(x,y)-\varphi(s,t)|\le A ∣∇f(x,y)−∇f(s,t)∣≤T∣φ(x,y)−φ(s,t)∣≤A
即可将像素(s,t)与像素(x,y)相连接。4.3 Hough变换
I = imread('camema.jpg');
subplot(1,3,1);imshow(I);title('原始图像');
BW = edge(I,'sobel'); % 用sobel算子提取图像中的边缘
[H,T,R] = hough(BW); % 对图像进行Hough变换
subplot(1,3,2);imshow(H,[],'XData',T,'YData',R, 'InitialMagnification','fit');
title('hough变换'); hold on;
P = houghpeaks(H,2,'threshold',ceil(0.6*max(H(:)))); % 寻找极值点
x = T(P(:,2)); y = R(P(:,1)); plot(x,y,'s','color','white');
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); % 找出对应的直线边缘
subplot(1,3,3);imshow(I), title('检测线段');hold on
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
end
4.4 边界跟踪
I = imread('rice.png');
figure,subplot(1,3,1);imshow(I);title('原始图像')
BW = im2bw(I,graythresh(I)); % 将灰度图像转换为二值图像
subplot(1,3,2);imshow(BW);title('二值图像')
connectivity = 8; num_points = 180;
contour = bwtraceboundary(BW, [9, 38], 'N', connectivity, num_points); % 提取边界
subplot(1,3,3); imshow(I); hold on;
plot(contour(:,2),contour(:,1),'g','LineWidth',2); title('结果图像')