使用全局阈值进行灰度图像二值化

Posted cramyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用全局阈值进行灰度图像二值化相关的知识,希望对你有一定的参考价值。

1.原理

        选取阈值的一种方法就是图像直方图的视觉检测。选择 T 的另一个方法是反复实验,选取不同的阈值,直到观测者觉得产生了较好的结果为止,这在交互环境下特别有效。例如,这种方法允许 使用者通过 widget(图形控制)改变阈值,就像游标一样,可以立即看见结果。
        通常,在图像处理中首选的方法是使用一种能基于图像数据自动地选择阈值的算法,为了 自动选阈值。

2.迭代实现全局阈值处理

迭代过程:

(1) 针对全局阈值选择初始估计值 T。

(2) 用 T 分割图像。这会产生两组像素:G1 由所有灰度值大于 T 的像素组成,G2 由所有灰 度值小于等于 T 的像素组成。

(3) 分别计算 G1、G2 区域内的平均灰度值 m1 和 m2。 

(4) 计算出新的阈值:

(5) 重复步骤(2)~(4),直到在连续的重复中,T 的差异比预先设定的参数△T 小为止。 (6) 使用函数im2bw分割图像:
    g = im2bw(f, T/den)
其中,den 是整数(例如一幅 8 比特图像的 255),是 T/den 比率为 1 的数值范围内的最大 值,正如函数 im2bw 要求的那样。
        在速度成为重要问题时,参数△T 用于控制迭代次数。通常,△T 越大,算法执行的迭代 次数越少。这可以得到证明,假如初始阈值在图像中的最大和最小灰度值之间选择(平均图像灰 度对 T 来说是不错的选择),那么算法在有限的步数内收敛。根据分割,在涉及物体和背景的直方图模式之间有相当清楚的谷的情况下,算法会工作得很好。

参考书上的内容,我在MATLAB上实现了这个部分的全局阈值处理,

迭代实现全局阈值处理部分代码:

%全局阈值
T=0.5*(min(f(:))+max(f(:)));
done=false;
while ~done
	g=f>T;
	Tnext=0.5*(mean(f(g))+mean(f(~g)));
	done = abs(T-Tnext)<0.1;
	T=Tnext;
end
r=im2bw(f,T);

3.Otsu’s实现全局阈值处理

        OTSU 法最早是由日本学者大津在 1979 年提出的,又叫最大类间方差法,是图像分割中自动阈值 选取的最佳算法。其基本的思想是在图像灰度差异的基础上,自动选取合适的阈值,将图像分为背景和目标两个部分。在执行 OTSU 算法时,选取的阈值应该尽可能增大,目标和背景的灰度差别才能更 有效地提取出裂纹区域。而衡量两部分差别的标准就是最大类间方差,通过划分后得到两类的类间方差最大值来确定最佳的阈值。

        利用 OTSU 算法将待分割图像 f( x) 中的大面积背景去除,留下图像中想要的部分,这样在提图像纹边缘的时候,只需要分割出区域的边缘即可。

        在matlab里有一个函数便可以完成最大类间方差.

Matlab中的graythresh函数

graythresh(image)函数输入是一副图像,在我做的图像的变化检测方向就是输入差异图(两幅图像对应位置做差或者做比,或者做对数比),输出就是阈值。在这个函数中,是使用最大类间方差法找到图片的一个合适的阈值(threshold)。再利用im2bw(将灰度图像转换为二值图像)函数,将找到的阈值输入,就可以把原图变为一个二值图。

因此大大减少了代码量。

参考书上的内容,我在MATLAB上实现了这个部分的全局阈值处理:

% Otsu’s实现全局阈值处理
[Th,SM]=graythresh(f);%阈值
s=im2bw(f,Th);

其中[T,SM]=graythresh(f)


        在这里,f 是输入图像,T 是产生的阈值并被规一化到[0,1]中,SM 是可分性度量。正如前 面说明的那样,函数 im2bw 用来分割图像。
        这个 Otsu’s实现全局阈值处理与上一种迭代实现基本全局阈值处理算法得到的阈值几乎相同,因此可能是相同的分割结果。

4.运行结果

 5.完整代码

clear all;
f=imread('图片4.png');
subplot(221);imshow(f);
title('原始图像');
f=rgb2gray(f);%转换为灰度图像
f=im2double(f);%数据类型转换
 
%全局阈值
T=0.5*(min(f(:))+max(f(:)));
done=false;
while ~done
    g=f>T;
    Tnext=0.5*(mean(f(g))+mean(f(~g)));
    done = abs(T-Tnext)<0.1;
    T=Tnext;
end
 
 
r=im2bw(f,T);
subplot(222);imhist(f);title('直方图');
 
subplot(223);imshow(r);
title('迭代法全局阈值分割');
 
 
% Otsu’s实现全局阈值处理
[Th,SM]=graythresh(f);%阈值
s=im2bw(f,Th);
subplot(224);imshow(s);
title('全局阈值Otsu法阈值分割');

以上是关于使用全局阈值进行灰度图像二值化的主要内容,如果未能解决你的问题,请参考以下文章

为啥工业相机进行数据图像处理的时候常常要进行灰度化和二值化

matlab 图像处理 二值化

图像的二值化处理的阈值是指啥?求vc下的代码实现!?

图像二值化处理Java

opencv python:图像二值化

阈值处理