二值化算法Word文档下载推荐.docx

上传人:b****2 文档编号:4771852 上传时间:2023-05-04 格式:DOCX 页数:10 大小:24KB
下载 相关 举报
二值化算法Word文档下载推荐.docx_第1页
第1页 / 共10页
二值化算法Word文档下载推荐.docx_第2页
第2页 / 共10页
二值化算法Word文档下载推荐.docx_第3页
第3页 / 共10页
二值化算法Word文档下载推荐.docx_第4页
第4页 / 共10页
二值化算法Word文档下载推荐.docx_第5页
第5页 / 共10页
二值化算法Word文档下载推荐.docx_第6页
第6页 / 共10页
二值化算法Word文档下载推荐.docx_第7页
第7页 / 共10页
二值化算法Word文档下载推荐.docx_第8页
第8页 / 共10页
二值化算法Word文档下载推荐.docx_第9页
第9页 / 共10页
二值化算法Word文档下载推荐.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

二值化算法Word文档下载推荐.docx

《二值化算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《二值化算法Word文档下载推荐.docx(10页珍藏版)》请在冰点文库上搜索。

二值化算法Word文档下载推荐.docx

该函数采用大津法进行阈值分割 

二值化 

***************************************************************************/ 

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;

<

256;

i++) 

lHistogram[i] 

获得灰度直方图,灰度最大值和灰度最小值 

iMaxGrayValue 

iMinGrayValue 

255;

for(i 

lWidth;

for(j 

lHeight;

j++) 

lpSrc 

i;

pixel 

(unsigned 

char) 

*lpSrc;

lHistogram[pixel]++;

修改最大灰度值和最小灰度值 

(iMinGrayValue 

>

pixel) 

(iMaxGrayValue 

遍历t, 

选取最佳阈值 

for(t 

iMinGrayValue;

;

t++) 

iNewThreshold 

lP1 

lS1 

lP2 

lS2 

求前景,背景两个区域的平均灰度值, 

点数所占比例 

iNewThreshold;

+= 

lHistogram[i];

iMean1GrayValue 

(lP1/lS1);

w0 

(double) 

(lS1) 

(lWidth 

1;

iMaxGrayValue;

iMean2GrayValue 

(lP2/lS2);

w1 

w0;

计算类间方差 

(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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2