阈值分割与区域分割

本文主要包括如下内容 算法

  • 阈值分割技术
  • 基于区域的图像分割技术
  • 本章的典型案例
    • 基于LoG和Canny算子的精确边缘检测
    • 基于Hough变换的直线检测
    • 图像的四叉树分解

阈值分割

咱们曾在3.5节学习过灰度阈值变换的相关知识, 利用灰度阈值变换分割图像就称为阈值分割, 它是一种基本的图像分割方法。
阙值分割的基本思想是肯定一个阈值, 而后把每一个像素点的灰度值和阈值相比较,根据比较的结果把该像素划分为两类:前景或者背景,阈值分割能够分红如下3步: markdown

  • 肯定阈值.
  • 将阈值和像素比较,.
  • 把像素归类

其中第1步阈值最重要。阈值的选择将直接影响分割的准确性以及由此产生的图像描述,分析的正确性。函数

阈值分割方法

阈值分割经常使用的方法通常有如下几种。 学习

实验法
实验法是经过人眼的观察, 对已知某些特征的图像, 只要试验不一样的阈值, 而后看是否知足已知特征便可。这种方法的不足在于适用范围窄,
使用前必须了解图像的某些特征, 譬如平均灰度等,并且分割后图像质量的好坏受主观局限性很大。 ui

根据直方图谷底肯定阈值
若是图像的前景物体内部和背景区域的灰度值分布都比较均匀, 那么这个图像的灰度直方图将具备明显双峰, 此时能够选择两峰之间的谷底做为阈值。
其表达式为:

注意:因为直方图是各灰度的像素统计,其峰值和谷底特性不必定表明目标和背景.所以,若是没有图像其余方面的知识,只靠直方图进行图像分割不必定准确 .spa

迭代选择阈值法
迭代式阈值选择方法的基本思想是:开始选择一个阈值做为初始估计值,而后按照某种规则不断地更新这一估计值,直到知足给定的条件为止。这个过程的关键在于选择怎么样的 迭代规则。一个好的迭代规则必须既可以快速收敛,又可以在每个迭代过程当中产生优于上次迭代的结果。下面是一种迭代选择阈值算法:
(1)选择一个T的初始估计值。
(2)利用阈值T把图像分为两个区域R1, 和R2
(3)对区域R1和R2中的全部像素计算平均灰度值μ1和μ2
(4)计算新的阈值:
3d

T=12(u1+u2)

(5)重复步骤2-4, 直到逐次迭代所得的T值小于事先定义的参数T。

最小均方偏差法
最小均方偏差法也是经常使用的阈值分割法之一。这种方法一般以图像中的灰度为模式特征,假设各模式的灰度是独立分布的随机变量,并假设图像中待分割的模式服从必定的几率分布。通常来讲,采用的是正态分布,即高斯几率分布。
首先假设一幅图像仅包含两个主要的灰度区域前景和背景。令z表示灰度值,p(z)表示灰度值几率密度函数的估计值。假设几率密度函数一个对应于背景的灰度值,另外一个对应于图像中前景即对象的灰度值。则描述图像中总体灰度变换的混合密度函数是:
code

p(z)=P1p1(z)+P2p2(z)

其中 P1 是前景中具备值z的像素出现的几率, P2 是背景中具备值z的像素出现的几率,二者的关系为:
P1+P2=1


最大类间方差法
在对图像进行阈值分割时,选定的分割阈值应使前景区域的平均灰度、背景区域的平均灰度与整幅图像的平均灰度之间差异最大,这种差别用区域的方差来表示。由此,Otsu在1978年提出了最大方差法。该算法在判决分析最小二乘法原理的基础上推导得出,计算过程简单是一种稳定、经常使用的算法。

让T在[O,L-1]范围内依次取值, 使类间方差最大的T值即是最佳区域分割阈值。
该方法不须要人为设定其余参数,是一种自动选择阈值的方法,并且能获得较好的结果。它不只适用于包含两个区域的单阈值选择,也一样适用于多区域的多阈值选择。对象

Matlab实现

最大类间方差法
Matlab中和阙值变换相关的两个主要函数是im2bw和graythresh。实际上,利用graythresh函数便可实现最大类间方差法。 blog

迭代选择阈值法

function [Ibw, thres] = autothreshold(I)
% 迭代法自动阈值分割
%
% 输入:I - 要进行自动阈值分割的灰度图像
% 输出:Ibw - 分割后的二值图像
% thres - 自动分割采用的阈值

thres = 0.5 * (double(min(I(:))) + double(max(I(:)))); %初始阈值
done = false; %结束标志
while ~done
    g = I >= thres;
    Tnext = 0.5 * (mean(I(g)) + mean(I(~g)));
    done = abs(thres - Tnext) < 0.5;
    thres = Tnext;
end;

Ibw = im2bw(I, thres/255); % 二值化

区域分割

前面所讲的图像分割方法都是基于像素的灰度来进行阈值分割, 本节将讨论以区域为基础的图像分割技术。传统的区域分割方法有区域生长和区域分裂与合井, 其中最基础的是区域生长法。

区域生长及其实现

区域生长是根据事先定义的准则将像素或者子区域聚合成更大区域的过程。其基本思想是从一组生长点开始(生长点能够是单个像素,也能够为某个小区域),将与该生长点性质类似的相邻像素或者区域与生长点合并,造成新的生长点,重复此过程直到不能生长为止。生长点和相邻区域的类似性判据能够是灰度值、纹理、颜色等多种图像信息。

区域生长算法
区域生长通常有3个步骤。
(1)选择合适的生长点。
(2)肯定类似性准则即生长准则。
(3)肯定生长中止条件。
通常来讲, 在无像素或者区域知足加入生长区域的条件时, 区域生长就会中止。

上述方法比较的是单个像素与其邻域的灰度特征以实现区域生长,也有一种混合型区域生长把图像分割成若干小区域,比较相邻小区域的类似性,若是类似则合并。在实际中,区 域生长时常常还要考虑到生长的”历史”,还要根据区域的尺寸、形状等图像的全局性质来决定区域的合并。

matlab实现

function J = regionGrow(I)
% 区域生长,须要以交互方式设定初始种子点,具体方法为鼠标单击图像中一点后,按下回车键
%
% 输入:I - 原图像
% 输出:J - 输出图像

if isinteger(I)
    I=im2double(I);
end
figure,imshow(I),title('原始图像')
[M,N]=size(I);
[y,x]=getpts;             %得到区域生长起始点
x1=round(x);            %横坐标取整
y1=round(y);            %纵坐标取整
seed=I(x1,y1);           %将生长起始点灰度值存入seed中
J=zeros(M,N);          %做一个全零与原图像等大的图像矩阵J,做为输出图像矩阵
J(x1,y1)=1;             %将J中与所取点相对应位置的点设置为白
sum=seed;              %储存符合区域生长条件的点的灰度值的和
suit=1;                 %储存符合区域生长条件的点的个数
count=1;               %记录每次判断一点周围八点符合条件的新点的数目
threshold=0.15;         %阈值,注意须要和double类型存储的图像相符合
while count>0
    s=0;                   %记录判断一点周围八点时,符合条件的新点的灰度值之和
     count=0;
     for i=1:M
       for j=1:N
         if J(i,j)==1
          if (i-1)>0 & (i+1)<(M+1) & (j-1)>0 & (j+1)<(N+1)  %判断此点是否为图像边界上的点
           for u= -1:1                               %判断点周围八点是否符合阈值条件
            for v= -1:1
              if  J(i+u,j+v)==0 & abs(I(i+u,j+v)-seed)<=threshold& 1/(1+1/15*abs(I(i+u,j+v)-seed))>0.8
                           J(i+u,j+v)=1;
                    %判断是否还没有标记,而且为符合阈值条件的点
                    %符合以上两条件即将其在J中与之位置对应的点设置为白
                 count=count+1;
                 s=s+I(i+u,j+v);                      %此点的灰度之加入s中
              end
            end
           end
          end
         end
       end
     end
    suit=suit+count;                                   %将n加入符合点数计数器中
    sum=sum+s;                                     %将s加入符合点的灰度值总合中
    seed=sum/suit;                                    %计算新的灰度平均值
end


选择不一样的生长点,结果不一样。

区域分裂与合并

区域生长是从一组生长点开始的,另外一种方法是在开始时将图像分割为一系列任意不相交的区域, 而后将它们合并或者拆分以知足限制条件, 这就是区域分裂与合并。 经过分裂, 能够将不一样特征的区域分离开, 而经过合并, 能够将相同特征的区域合并起来。

区域分裂与合并算法


图像先分裂为如图9.22Ca)所示;第二次分裂时,如图(b)所示,因为左下角区域知足 P(Ri)=TRUE ,则不进行分裂操做;第三次分裂时,如图(c)所示,仅仅右边的突出部分 P(Ri)=FALSE , 须要进行分裂操做,其他不变,完成后,分裂中止;最后,对两个相邻区域 实行合并,一直获得最后的结果,如图(d)所示。
区域分裂与合并对分割复杂的场景图像比较有效,若是引入应用领域知识,则能够更好地提升分割效果。

区域分裂的Matlab实现
在Matlab中, 和区域分裂相关的3个主要函数分别是qtdecomp、qtgetblk和qtsetblk。

(1) qtdecomp函数
Matlab的IPT函数qtdecomp能够进行四叉树分解。该函数首先将图像划分红相等大4的4块,而后对每个块进行一致性检查。若是该块不符合一致性标准, 则将该块继续分为4块; 不然不对其进行进一步的分割。这个过程将会一直重复直至每个块都符合一致性标
准, 分解的结果可能会包含许多大小不一样的块。
qtdecomp函数的经常使用调用形式为:
S = qtdecomp(I,threshold,[mindim,maxdim])

threshold是分割成的子块中容许的阈值,默认值为0.如杲子块中最大元素和最小元 素的差值小于该阈值就认为知足一致性条件.对于double型矩阵,threshold将直接做为阈值;而对于uinit8和uintl6类型的矩阵,threshold将被乘以255和65535以做为实际阈值.对于图像而言,threshold的取值范围是0到1.

[mindim maxdim]是尺度阈值.mindim参数能够屏蔽函数对尺度上小于mindim的子块的处理,而不论这个子块是否知足一致性条件;若是参数形式为[mindim maxdim], 则表示不产生小于mindim尺度的子块,也不保留大于maxdim尺度的子块,此时 maxdim/mindim必须是2的整数次幂

注意: qtdecomp函数主要适用于边长是2的整数次幂的正方形图像, 如128x128,512x512, 此时分解可一直进行至子块大小为1x1。对于长宽不是2的整数次幂的图像, 分解可能没法进行到底. 例如, 对于96x96
的图像, 将首先分解为48x48, 而后是24x24, 12*12, 6*6, 最后是3x3, 没法再继续分解. 此时必须指定mindim参数为3或是2的整数次幕与3的乘积.

(2) qtgetblk函数
在获得稀疏矩阵S后, 利用IPT函数qtgetblk可进一步得到四叉树分解后全部指定大小的子块像素及位置信息。经常使用调用形式为:
[vals,r,c]=qtgetblk(I,S,dim)
稀疏矩阵S是通过qtdecomp函数处理的输出结果.
dim是指定子块的大小

vals是dim*dim*k的三维矩阵,包含I中全部符合条件的子块数据。其中k为符合 条件的dim*dim的大小的子块的个数,vals(:.:,i)表示符合条件的第i个子块的内容.
r和c均为列向量,分别表示图像I中符合条件子块左上角的纵坐标(行索引)和横坐标(列索引).

(3) qtsetblk函数
在将图像划分为子块后, 还须要使用函数qtsetblk将四叉树分解所获得的子块中符合条件的部分所有替换为指定的子块。函数语法为:
J = qtsetblk(I,S,dim,vals)
S是I通过qtdecomp函数处理的结果.
dim是指定的子块大小.
vals是dim*dim*k的三维矩阵,包含了用来替换原有子块的新子块信息.其中K应为图像I中大小为dim*dim的子块的总数,vals(:,:,i)表示要替换的第i个子块.

I1 = imread('rice.png');

S = qtdecomp(I1,0.2);
S2 = full(S);

figure;
subplot(1,2,1),imshow(I1);
subplot(1,2,2),imshow(S2);

ct = zeros(6,1);
for ii = 1:6
    [vals{ii},r,c]=qtgetblk(I1,S2,2^(ii-1));
    ct(ii) = size(vals(ii),3);
end

小结 图像分割问题是一个十分困难的问题。由于分割后的图像是系统目标的一个函数, 因此根本不存在理想的或正确的分割。 物体及其组成部件的二维表现形式受到光照条件、透视畸变、观察点变化、遮挡等的影响。此外, 物体及其组成部件与背景之间在视觉上可能没法区分。所以, 人们没法预测可以从图像中抽取出哪些与物体识别相关的初始信息。 惟一能够确定的是,这一过程将在本质上具备不可靠性。某些有用的信息可以被抽取出,且同时也会出现许多错误。所以,在任何应用领域中都不存在最优解。分割结果的好坏或者正确与否, 目前尚未一个统一的评价判断标准, 大都从分割的视觉效果和实际的应用场景来判断。

相关文章
相关标签/搜索