二值化方法研究

1 otsu方法参考我的另一篇博文: OTSU算法学习 OTSU公式证明

2 sauvola方法, 参考我的另一篇博文: sauvola二值化算法研究

3 Bersen方法

Bersen方法感觉有些粗糙, 只是考虑目标点附近区域的像素灰度值的最大值和最小值, 阈值是最大值和最小值的均值.下面是它的matlab实现,出自这篇博文【二值化】Bernsen算法.如果用C语言实现要用积分图的方法.


%局部阈值操作Bersen算法

clc

clear

I = imread(‘card8.bmp‘);

w =1;%矩阵大小为2*w+1

T =0;%阈值大小

max =0;

min =0;

[m,n]= size(I);

T = zeros(m -2*w,n -2*w);

%根据bersen算法计算每个像素点的阈值

for i =(w +1):(m - w)

for j =(w +1):(n - w)

max = uint8(I(i,j));

min = uint8(I(i,j));

for k =-w:w

for l =-w:w

if max < uint8(I(i + k,j + l))

max = uint8(I(i + k,j + l));

end

if min > uint8(I(i + k,j + l))

min = uint8(I(i + k,j + l));

end

end

end

T(i,j)=0.5*(max + min);

end

end

for i =(w +1):(m - w)

for j =(w +1):(n - w)

if I(i,j)> T(i,j)

I(i,j)= uint8(255);

else

I(i,j)= uint8(0);

end

end

end

imshow(I);

下图是这个方法的效果

上图中对于图像右侧的效果很差.

4 niblack算法

Niblack二值化算法是比较简单的局部阈值方法,阈值的计算公式是T = m + k*v,其中m为以该像素点为中心的区域的平均灰度值,v是该区域的标准差,k是一个系数. sauvola二值化算法的计算公式是T = mean*(1 + k*((std / 128) - 1)). Niblack和sauvola方法类似.下面贴matlab实现的代码和效果图.不做进一步分析了.


I = imread(‘2.bmp‘);

%I = rgb2gray(I);

w =  2;%

max =0;

min =0;

[m,n]= size(I);

T = zeros(m ,n );

%

for i =(w +1):(m - w)

for j =(w +1):(n - w)

sum =0;

for k =-w:w

for l =-w:w

sum = sum + uint32(I(i + k,j + l));

end

end

average = double(sum)/((2*w+1)*(2*w+1));

s =0;

for k =-w:w

for l =-w:w

s = s +   (uint32(I(i + k,j + l))- average)*(uint32(I(i + k,j + l))- average);

end

end

s= sqrt(double(s)/((2*w+1)*(2*w+1)));

T(i,j)= average +0.2*s;

end

end

for i =  1:m

for j =1:n

if I(i,j)> T(i,j)

I(i,j)= uint8(255);

else

I(i,j)= uint8(0);

end

end

end

imshow(I);

5 循环阈值算法

代码的实现和k均值聚类算法类似,但是累积值在循环中没有清空,具体原因不知道.只是把代码贴和效果到下面.


clc

clear

I = imread(‘2.bmp‘);

%I = rgb2gray(G);

%l = rgb2gray(h);%转换成灰度图像,得到灰度值

%imhist(img);%得到灰度直方图

%disp(img);%显示各像素的灰度值

%循环阈值选择方法

gray1 =0;%一部分图像的灰度值之和

gray2 =0;%另一部分图像的灰度值之和

u1 =0;%一部分图像的平均灰度值

u2 =0;%另一部分的平均灰度值

k =0;%一部分图像的像素个数

r =0;%另一部分图像的像素个数

x =0;%阈值和

T =0;%图像的阈值

[m,n]= size(I)%获取图像大小

%获取平均阈值

for i =1:m

for j =1:n

x = x + uint32(I(i,j));

end

end

T = x/(m*n);%初始阈值

T1 =0;

while T ~= T1

T1 = T;

for i =1:m

for j =1:n

if I(i,j)< T

gray1 = gray1 + uint32(I(i,j));

k = k +1;

else

gray2 = gray2 + uint32(I(i,j));

r = r +1;

end

end

end

u1 = gray1/k;

u2 = gray2/r;

T =(u1 + u2)/2;%新的阈值

end

%BW = im2bw(g,T);%转换成二值图像

T %输出最后选择的阈值

%显示区域,把不在阈值范围内的点的灰度值置为255

for i =1:m

for j =1:n

if I(i,j)> T

I(i,j)= uint32(255);

else

I(i,j)= uint32(0);

end

end

end

%se = strel(‘disk‘,1);

%h = imclose(I,se);

%h = imdilate(I,se);

%y = imerode(h,se);

%h = medfilt2(I,[3,3];

%imshow(y);

imshow(I);

总结: 实际应用中实现上首先要用积分图技术来实现提速,其次要综合考虑全局阈值方法和局部阈值方法,以全局阈值为基础,考虑局部均值,二值化等.这个局部不能太小,太小了就会有噪点.

本文参考了博文图像二值化算法总结,这里感谢cxf7394373.

时间: 2024-11-16 14:20:27

二值化方法研究的相关文章

图像处理之常见二值化方法汇总

图像处理之常见二值化方法汇总 图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多.越 精准的方法计算量也越大.本文主要介绍四种常见的二值处理方法,通常情况下可以满 足大多数图像处理的需要.主要本文讨论的方法仅针对RGB色彩空间. 方法一: 该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的 将像素值设为0(黑色),值大于等于127的像素值设为255(白色).该方法的好处是计算 量少速度快.缺点更多首先阈值为127没有任何理由可以解释,其次完全不

二值化方法总结

1.im2bw(Image, threshold_value) 2.最大类件方差(ostu): matlab:im2bw(image, graythresh(image)) 3.bernsen算法 较原始的Bernsen: 这个算法的中心思想是:设当前像素为P,计算以P为中心的大小为(2w+1)*(2w+1)窗口内的所有像素的最大值M与最小值N,两者的均值T, if(M-N)> S  则当前点P的阈值为T. else 当前窗口所在区域的灰度级差别较小,那么窗口在目标区或在背景区,若T>T'则当

[转载+原创]Emgu CV on C# (四) —— Emgu CV on 二值化

重点介绍了二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数)  1.概述 图像二值化是图像处理中的一项基本技术,也是很多图像处理技术的预处理过程. 图像的预处理在进行图像二值化操作前要对图像进行预处理,包括彩色图像灰化和增强.由于选取阈值需要参照直方图,因此在图像进行处理后,我们再获取图像的直方图以帮助选取阈值.整个流程如下所示: 读取图像→灰度图像→图像增强→图像直方图→二值化处理 2.数学原理(转载,基本可以不

二值法方法综述及matlab程序

在某些图像处理当中一个关键步是二值法,二值化一方面能够去除冗余信息,另一方面也会使有效信息丢失.所以有效的二值化算法是后续的处理的基础.比如对于想要最大限度的保留下面图的中文字,以便后续的定位处理. 二值化算法包括全局二值化和局部二值化, 全局二值化具有速度快但效果相对差的特点, 局部二值化算法具有速度慢效果好的特点. 原图 全局阈值              方法一:直接采用im2bw ;手动阈值 方法二:迭代法求阈值 迭代式阈值选取的基本思路是:首先根据图像中物体的灰度分布情况,选取一个近似

二值化方法:Minimum Error Thresholding

Kittler二值化方法,是一种经典的基于直方图的二值化方法.由Kittler在1986年在论文“Minimum Error Thresholding”提出. 参考了ImageShop提供的C#版本(http://www.cnblogs.com/Imageshop/p/3307308.html),做了简单修改得到了C++版本的,代码如下: /*灰度图像的二值化方法*/ class CxThreshold { public: static int CalcKittlerMinError(int*

atitit.验证码识别step4--------图形二值化 灰度化

atitit.验证码识别step4--------图形二值化 灰度化 1. 常见二值化的方法原理总结 1 1.1. 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于127的像素值设为255(白色). 1 1.2. 方法二:最常见的二值处理方法是计算像素的平均值K, 2 1.3. 方法三:使用直方图方法来寻找二值化阈值, 2 1.4. 方法四:使用近似一维Means方法寻找二值化阈值,(推荐) 3 2. 使用类库imagei

记录一个优秀的图像二值化代码

#region 二值化02 public Bitmap binaryzation(Bitmap srcBitmap, Bitmap dstBitmap) { int threshold = 0; Byte[,] BinaryArray = ToBinaryArray(srcBitmap, out threshold); dstBitmap = BinaryArrayToBinaryBitmap(BinaryArray); return dstBitmap; } /// <summary> //

二值化

https://zh.wikipedia.org/wiki/二值化 二值化是图像分割的一种方法.在二值化图象的时候把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化. 根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值. 比较常用的二值化方法则有:双峰法.P参数法.迭代法和OTSU法等.

图像基本变换---图像二值化(包含OSTU/迭代法/统计法/双峰法/P分位法/最大熵法)

OSTU法图像二值化 [算法说明] Ostu法又叫做最大类间方差法,是一种常用的图像分割算法.基本算法思想是根据初始阈值把图像分为两类,然后计算两类之间的方差,更新阈值,重新计算类间方差,当满足类间方差最大时的阈值,即为所求最佳阈值,具体过程如下: 1,初始化一阈值Th,将图像f(x,y)分为A,B两类: 2,分别计算A,B两类像素集合的均值ua和ub,公式如下: 其中,Na和Nb分别表示集合A,B中的像素个数. 3,计算A,B两类的类间方差,公式如下: 4,将Th从0到255循环,分别计算A,