基于直方图的二值化算法Word下载.docx
- 文档编号:17219952
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:29
- 大小:520.74KB
基于直方图的二值化算法Word下载.docx
《基于直方图的二值化算法Word下载.docx》由会员分享,可在线阅读,更多相关《基于直方图的二值化算法Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
Sum+=Y*HistGram[Y];
}
returnSum/Amount;
二、百分比阈值(P-Tile法)
1、描述
Doyle于1962年提出的P-Tile(即P分位数法)可以说是最古老的一种阈值选取方法。
该方法根据先验概率来设定阈值,使得二值化后的目标或背景像素比例等于先验概率,该方法简单高效,但是对于先验概率难于估计的图像却无能为力。
2、该原理比较简单,直接以代码实现。
///<
summary>
///百分比阈值
/summary>
paramname="
HistGram"
>
灰度图像的直方图<
/param>
Tile"
背景在图像中所占的面积百分比<
returns>
<
/returns>
publicstaticintGetPTileThreshold(int[]HistGram,intTile=50)
intY,Amount=0,Sum=0;
for(Y=0;
Y++)Amount+=HistGram[Y];
//像素总数
Sum=Sum+HistGram[Y];
if(Sum>
=Amount*Tile/100)returnY;
return-1;
三、基于谷底最小值的阈值
1、描述:
此方法实用于具有明显双峰直方图的图像,其寻找双峰的谷底作为阈值,但是该方法不一定能获得阈值,对于那些具有平坦的直方图或单峰图像,该方法不合适。
2、实现过程:
该函数的实现是一个迭代的过程,每次处理前对直方图数据进行判断,看其是否已经是一个双峰的直方图,如果不是,则对直方图数据进行半径为1(窗口大小为3)的平滑,如果迭代了一定的数量比如1000次后仍未获得一个双峰的直方图,则函数执行失败,如成功获得,则最终阈值取两个双峰之间的谷底值作为阈值。
注意在编码过程中,平滑的处理需要当前像素之前的信息,因此需要对平滑前的数据进行一个备份。
另外,首数据类型精度限制,不应用整形的直方图数据,必须转换为浮点类型数据来进行处理,否则得不到正确的结果。
该算法相关参考论文如下:
J.M.S.PrewittandM.L.Mendelsohn,"
Theanalysisofcellimages,"
innnalsoftheNewYorkAcademyofSciences,vol.128,pp.1035-1053,1966.
C.A.Glasbey,"
Ananalysisofhistogram-basedthresholdingalgorithms,"
CVGIP:
GraphicalModelsandImageProcessing,vol.55,pp.532-537,1993.
publicstaticintGetMinimumThreshold(int[]HistGram)
intY,Iter=0;
double[]HistGramC=newdouble[256];
//基于精度问题,一定要用浮点数来处理,否则得不到正确的结果
double[]HistGramCC=newdouble[256];
//求均值的过程会破坏前面的数据,因此需要两份数据
HistGramC[Y]=HistGram[Y];
HistGramCC[Y]=HistGram[Y];
//通过三点求均值来平滑直方图
while(IsDimodal(HistGramCC)==false)//判断是否已经是双峰的图像了
HistGramCC[0]=(HistGramC[0]+HistGramC[0]+HistGramC[1])/3;
//第一点
for(Y=1;
255;
HistGramCC[Y]=(HistGramC[Y-1]+HistGramC[Y]+HistGramC[Y+1])/3;
//中间的点
HistGramCC[255]=(HistGramC[254]+HistGramC[255]+HistGramC[255])/3;
//最后一点
System.Buffer.BlockCopy(HistGramCC,0,HistGramC,0,256*sizeof(double));
Iter++;
if(Iter>
=1000)return-1;
//直方图无法平滑为双峰的,返回错误代码
//阈值极为两峰之间的最小值
boolPeakfound=false;
if(HistGramCC[Y-1]<
HistGramCC[Y]&
&
HistGramCC[Y+1]<
HistGramCC[Y])Peakfound=true;
if(Peakfound==true&
HistGramCC[Y-1]>
=HistGramCC[Y]&
HistGramCC[Y+1]>
=HistGramCC[Y])
returnY-1;
其中IsDimodal函数为判断直方图是否是双峰的函数,代码如下:
privatestaticboolIsDimodal(double[]HistGram)//检测直方图是否为双峰的
//对直方图的峰进行计数,只有峰数位2才为双峰
intCount=0;
for(intY=1;
if(HistGram[Y-1]<
HistGram[Y]&
HistGram[Y+1]<
HistGram[Y])
Count++;
if(Count>
2)returnfalse;
if(Count==2)
returntrue;
else
returnfalse;
4、效果:
原图
二值图
原始直方图 平滑后的直方图
对于这种有较明显的双峰的图像,该算法还是能取得不错的效果的。
四、基于双峰平均值的阈值
1、描述:
该算法和基于谷底最小值的阈值方法类似,只是最后一步不是取得双峰之间的谷底值,而是取双峰的平均值作为阈值。
2、参考代码:
publicstaticintGetIntermodesThreshold(int[]HistGram)
intY,Iter=0,Index;
//备份数据,为下一次迭代做准备
=10000)return-1;
//似乎直方图无法平滑为双峰的,返回错误代码
//阈值为两峰值的平均值
int[]Peak=newint[2];
for(Y=1,Index=0;
HistGramCC[Y])Peak[Index++]=Y-1;
return((Peak[0]+Peak[1])/2);
3、效果:
原图
五、迭代最佳阈值
1、描述:
该算法先假定一个阈值,然后计算在该阈值下的前景和背景的中心值,当前景和背景中心值得平均值和假定的阈值相同时,则迭代中止,并以此值为阈值进行二值化。
2、实现过程:
(1)求出图象的最大灰度值和最小灰度值,分别记为gl和gu,令初始阈值为:
(2)根据阈值T0将图象分割为前景和背景,分别求出两者的平均灰度值Ab和Af:
(3)令
如果Tk=Tk+1,则取Tk为所求得的阈值,否则,转2继续迭代。
3、参考代码:
publicstaticintGetIterativeBestThreshold(int[]HistGram)
intX,Iter=0;
intMeanValueOne,MeanValueTwo,SumOne,SumTwo,SumIntegralOne,SumIntegralTwo;
intMinValue,MaxValue;
intThreshold,NewThreshold;
for(MinValue=0;
MinValue<
256&
HistGram[MinValue]==0;
MinValue++);
for(MaxValue=255;
MaxValue>
MinValue&
MaxValue--);
if(MaxValue==MinValue)returnMaxValue;
//图像中只有一个颜色
if(MinValue+1==MaxValue)returnMinValue;
//图像中只有二个颜色
Threshold=MinValue;
NewThreshold=(MaxValue+MinValue)>
1;
while(Threshold!
=NewThreshold)//当前后两次迭代的获得阈值相同时,结束迭代
SumOne=0;
SumIntegralOne=0;
SumTwo=0;
SumIntegralTwo=0;
Threshold=NewThreshold;
for(X=MinValue;
X<
=Threshold;
X++)//根据阈值将图像分割成目标和背景两部分,求出两部分的平均灰度值
SumIntegralOne+=HistGram[X]*X;
SumOne+=HistGram[X];
MeanValueOne=SumIntegralOne/SumOne;
for(X=Threshold+1;
=MaxValue;
X++)
SumIntegralTwo+=HistGram[X]*X;
SumTwo+=HistGram[X];
MeanValueTwo=SumIntegralTwo/SumTwo;
NewThreshold=(MeanValueOne+MeanValueTwo)>
//求出新的阈值
returnThreshold;
原图
直方图
六、OSTU大律法
该算法是1979年由日本大津提出的,主要是思想是取某个阈值,使得前景和背景两类的类间方差最大,matlab中的graythresh即是以该算法为原理执行的。
2、原理:
关于该算法的原理,网络上有很多,这里为了篇幅有限,不加以赘述。
publicstaticintGetOSTUThreshold(int[]HistGram)
intX,Y,Amount=0;
intPixelBack=0,PixelFore=0,PixelIntegralBack=0,PixelIntegralFore=0,PixelIntegral=0;
doubleOmegaBack,OmegaFore,MicroBack,MicroFore,SigmaB,Sigma;
//类间方差;
intThreshold=0;
for(Y=MinValue;
PixelIntegral=0;
Y++)PixelIntegral+=HistGram[Y]*Y;
SigmaB=-1;
MaxValue;
PixelBack=PixelBack+HistGram[Y];
PixelFore=Amount-PixelBack;
OmegaBack=(double)PixelBack/Amount;
OmegaFore=(double)PixelFore/Amount;
PixelIntegralBack+=HistGram[Y]*Y;
PixelIntegralFore=PixelIntegral-PixelIntegralBack;
MicroBack=(double)PixelIntegralBack/PixelBack;
MicroFore=(double)PixelIntegralFore/PixelFore;
Sigma=OmegaBack*OmegaFore*(MicroBack-MicroFore)*(MicroBack-MicroFore);
if(Sigma>
SigmaB)
SigmaB=Sigma;
Threshold=Y;
该算法对于那些具有平坦的直方图的图像具有一定的适应能力。
七、一维最大熵
该算法把信息论中熵的概念引入到图像中,通过计算阈值分割后两部分熵的和来判断阈值是否为最佳阈值。
2、算法原理
这方面的文章也比较多,留给读者自行去查找相关资料。
publicstaticintGet1DMaxEntropyThreshold(int[]HistGram)
intX,Y,Amount=0;
double[]HistGramD=newdouble[256];
doubleSumIntegral,EntropyBack,EntropyFore,MaxEntropy;
intMinValue=255,MaxValue=0;
Y++)HistGramD[Y]=(double)HistGram[Y]/Amount+1e-17;
MaxEntropy=double.MinValue;
;
for(Y=MinValue+1;
SumIntegral=0;
=Y;
X++)SumIntegral+=HistGramD[X];
EntropyBack=0;
X++)EntropyBack+=(-HistGramD[X]/SumIntegral*Math.Log(HistGramD[X]/SumIntegral));
EntropyFore=0;
for(X=Y+1;
X++)EntropyFore+=(-HistGramD[X]/(1-SumIntegral)*Math.Log(HistGramD[X]/(1-SumIntegral)));
if(MaxEntropy<
EntropyBack+EntropyFore)
MaxEntropy=EntropyBack+EntropyFore;
八、力矩保持法
1、描述:
该算法通过选择恰当的阈值从而使得二值后的图像和原始的灰度图像具有三个相同的初始力矩值。
2、原理:
参考论文:
W.Tsai,“Moment-preservingthresholding:
anewapproach,”Comput.VisionGraphicsImage
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 直方图 二值化 算法