二值化算法Word文档下载推荐.docx
《二值化算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《二值化算法Word文档下载推荐.docx(10页珍藏版)》请在冰点文库上搜索。
![二值化算法Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/a78a5101-ac73-43c2-8c7f-564a9f23c1e5/a78a5101-ac73-43c2-8c7f-564a9f23c1e51.gif)
该函数采用大津法进行阈值分割
二值化
***************************************************************************/
WINAPI
OSTUThreshold(LPSTR
lpDIBBits,
lWidth,
lHeight)
{
//
指向源图像像素指针
lpSrc;
指向缓存图像指针
lpDst;
指向缓存图像像素指针
lpNewDIBBits;
HLOCAL
hNewDIBBits;
循环变量
int
i,
j,
t;
用于计算两个区域的中间变量
long
lP1,
lS1,
lP2,
lS2;
像素值
unsigned
char
pixel;
灰度直方图数组
lHistogram[256];
阈值,
最大灰度值和最小灰度值,
两个区域的平均灰度值
iThreshold,
iNewThreshold,
iMaxGrayValue,
iMinGrayValue,
iMean1GrayValue,
iMean2GrayValue;
前景点数占图像比例,
背景点数占图像比例
double
w0,w1;
方差
G,
tempG;
图像每行占字节数
lLineBytes;
暂时分配内存,
以保存新图像
hNewDIBBits
=
LocalAlloc(LHND,
lHeight);
if
(hNewDIBBits
==
NULL)
//分配内存失败
return
FALSE;
}
锁定内存
lpNewDIBBits
(char
*)
LocalLock(hNewDIBBits);
初始化新分配的内存,
设定初始值为255
lpDst
memset(lpDst,
(BYTE)255,
lLineBytes
WIDTHBYTES(lWidth
8);
for(i=
0;
i
<
256;
i++)
lHistogram[i]
获得灰度直方图,灰度最大值和灰度最小值
iMaxGrayValue
iMinGrayValue
255;
for(i
lWidth;
for(j
j
lHeight;
j++)
lpSrc
+
i;
pixel
(unsigned
char)
*lpSrc;
lHistogram[pixel]++;
修改最大灰度值和最小灰度值
(iMinGrayValue
>
pixel)
(iMaxGrayValue
遍历t,
选取最佳阈值
for(t
iMinGrayValue;
t
;
t++)
iNewThreshold
lP1
lS1
lP2
lS2
求前景,背景两个区域的平均灰度值,
点数所占比例
=
iNewThreshold;
+=
lHistogram[i];
iMean1GrayValue
(lP1/lS1);
w0
(double)
(lS1)
/
(lWidth
1;
iMaxGrayValue;
iMean2GrayValue
(lP2/lS2);
w1
1
w0;
计算类间方差
G
(iMean1GrayValue
iMean2GrayValue)
iMean2GrayValue);
(G
tempG)
tempG
G;
iThreshold
根据阈值将图像二值化
(pixel
iThreshold)
*lpDst
char)0;
else
复制图像
memcpy(lpDIBBits,
lpNewDIBBits,
释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
返回
TRUE;
}
/*************************************************************************
*
*函数名称:
*
ThresholdDIB()
*参数:
LPSTRlpDIBBits
-指向源DIB图像指针
-源图像宽度(象素数)
-源图像高度(象素数)
*返回值:
-运算成功返回TRUE,否则返回FALSE。
*说明:
*该函数用迭代法对图像进行阈值分割运算。
*
************************************************************************/
BOOLWINAPIThresholdDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight)
{
//指向源图像的指针
LPSTRlpSrc;
//指向缓存图像的指针
LPSTRlpDst;
//指向缓存DIB图像的指针
LPSTRlpNewDIBBits;
HLOCALhNewDIBBits;
//循环变量
longi;
longj;
//像素值
unsignedcharpixel;
//直方图数组
longlHistogram[256];
//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsignedchariThreshold,iNewThreshold,iMaxGrayValue,iMinGrayValue,iMean1GrayValue,iMean2GrayValue;
//用于计算区域灰度平均值的中间变量
longlP1,lP2,lS1,lS2;
//迭代次数
intiIterationTimes;
//图像每行的字节数
LONGlLineBytes;
//暂时分配内存,以保存新图像
hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);
if(hNewDIBBits==NULL)
//分配内存失败
returnFALSE;
}
//锁定内存
lpNewDIBBits=(char*)LocalLock(hNewDIBBits);
//初始化新分配的内存,设定初始值为255
lpDst=(char*)lpNewDIBBits;
memset(lpDst,(BYTE)255,lWidth*lHeight);
//计算图像每行的字节数
lLineBytes=WIDTHBYTES(lWidth*8);
for(i=0;
i<
i++)
lHistogram[i]=0;
//获得直方图
iMaxGrayValue=0;
iMinGrayValue=255;
i<
lWidth;
for(j=0;
j<
lHeight;
j++)
{
//指向源图像倒数第j行,第i个象素的指针
lpSrc=(char*)lpDIBBits+lLineBytes*j+i;
pixel=(unsignedchar)*lpSrc;
//修改最大,最小灰度值
if(iMinGrayValue>
pixel)
iMinGrayValue=pixel;
if(iMaxGrayValue<
iMaxGrayValue=pixel;
//迭代求最佳阈值
iNewThreshold=(iMinGrayValue+iMaxGrayValue)/2;
iThreshold=0;
for(iIterationTimes=0;
iThreshold!
=iNewThreshold&
&
iIterationTimes<
100;
iIterationTimes++)
iThreshold=iNewThreshold;
lP1=0;
lP2=0;
lS1=0;
lS2=0;
//求两个区域的灰度平均值
for(i=iMinGrayValue;
iThreshold;
lP1+=lHistogram[i]*i;
lS1+=lHistogram[i];
iMean1GrayValue=(unsignedchar)(lP1/lS1);
for(i=iThreshold+1;
lP2+=lHistogram[i]*i;
lS2+=lHistogram[i];
iMean2GrayValue=(unsignedchar)(lP2/lS2);
iNewThreshold=
(iMean1GrayValue+iMean2GrayValue)/2;
//根据阈值将图像二值化
//指向目标图像倒数第j行,第i个象素的指针
lpDst=(char*)lpNewDIBBits+lLineBytes*j+i;
if(pixel<
=iThreshold)
*lpDst=(unsignedchar)0;
else
*lpDst=(unsignedchar)255;
//复制图像
memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);
//释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
//返回
returnTRUE;
///////////////////////////////////////////////////////////////
图像的二值化原理和实现
1、图像的二值化的基本原理
图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。
即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。
为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。
所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。
如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。
如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。
动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。
2、图像的二值化的程序实现
通过Delphi刻度控件调整阀值,实现动态控制,程序如下:
procedureTForm1.Button1Click(Sender:
TObject);
var
p:
PByteArray;
Gray,x,y:
integer;
begin
TestBMP:
=TBitmap.Create;
changedbmp:
=tbitmap.Create;
testbmp.Assign(image1.Picture);
fory:
=0totestbmp.Height-1do
begin
=testbmp.ScanLine[y];
forx:
=0totestbmp.Width-1do
//首先将图像灰度化
gray:
=round(p[x*3+2]*0.3+p[x*3+1]*0.59+p[x*3]*0.11);
ifgray>
TrackBar1.Positionthen//按阀值进行二值化
p[x*3]:
=255;
p[x*3+1]:
p[x*3+2]:
end
b