如何用C语言实现对图像的二值化(注意是C语言不是VC)?要找C语言获得图像像素点的函数,二值化是很简单的过程,即颜色大于128的赋值255 , 小于等于128的赋值0
如何用C语言实现对图像的二值化?/*************************************************************************
*该函数用于对图像进行阈值分割运算
*参数:
*LPSTRlpDIBBits-指向源DIB图像指针
*LONGlWidth-源图像宽度(象素数)
*LONGlHeight-源图像高度(象素数)
************************************************************************/
BOOLImageChangeProc::ThresholdDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight)
{
//指向源图像的指针
LPSTR lpSrc;
//指向缓存图像的指针
LPSTR lpDst;
//指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
HLOCALhNewDIBBits;
//循环变量
longi;
longj;
unsignedcharpixel;
longlHistogram[256];
//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsignedcharThreshold,NewThreshold,MaxGrayValue,MinGrayValue,Temp1GrayValue,Temp2GrayValue;
//用于计算区域灰度平均值的中间变量
longlP1,lP2,lS1,lS2;
//迭代次数
intIterationTimes;
LONGlLineBytes;
hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);
if(hNewDIBBits==NULL)
{
//分配内存失败
returnFALSE;
}
//锁定内存
lpNewDIBBits=(char*)LocalLock(hNewDIBBits);
//初始化新分配的内存
lpDst=(char*)lpNewDIBBits;
memset(lpDst,(BYTE)255,lWidth*lHeight);
lLineBytes=WIDTHBYTES(lWidth*8);
for(i=0;i256;i)
{
lHistogram[i]=0;
}
//获得直方图
MaxGrayValue=https://www.04ip.com/post/0;
MinGrayValue=https://www.04ip.com/post/255;
【c语言图像二值化函数 c#图像二值化】for(i=0;ilWidth;i)
{
for(j=0;jlHeight;j)
{
lpSrc=https://www.04ip.com/post/(char*)lpDIBBitslLineBytes*ji;
pixel=(unsignedchar)*lpSrc;
lHistogram[pixel];
//修改最大,最小灰度值
if(MinGrayValuepixel)
{
MinGrayValue=https://www.04ip.com/post/pixel;
}
if(MaxGrayValuepixel)
{
MaxGrayValue=https://www.04ip.com/post/pixel;
}
}
}
//迭代求最佳阈值
NewThreshold=(MinGrayValueMaxGrayValue)/2;
Threshold=0;
for(IterationTimes=0;Threshold!=NewThresholdIterationTimes1000;IterationTimes)
{
Threshold=NewThreshold;
lP1=0;
lP2=0;
lS1=0;
lS2=0;
//求两个区域的灰度平均值
for(i=MinGrayValue;i=Threshold;i)
{
lP1=lHistogram[i]*i;
lS1=lHistogram[i];
}
for(i=Threshold 1;iMaxGrayValue;i)
{
lP2=lHistogram[i]*i;
lS2=lHistogram[i];
}
if(lS1==0||lS2==0)
{
//释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
returnFALSE;
}
Temp1GrayValue=https://www.04ip.com/post/(unsignedchar)(lP1/lS1);
Temp2GrayValue=https://www.04ip.com/post/(unsignedchar)(lP2/lS2);
NewThreshold=(Temp1GrayValueTemp2GrayValue)/2;
}
//根据阈值将图像二值化
for(i=0;ilWidth;i)
{
for(j=0;jlHeight;j)
{
lpSrc=https://www.04ip.com/post/(char*)lpDIBBitslLineBytes*ji;
lpDst=(char*)lpNewDIBBitslLineBytes*ji;
pixel=(unsignedchar)*lpSrc;
if(pixel=Threshold)
{
*lpDst=(unsignedchar)0;
}
else
{
*lpDst=(unsignedchar)255;
}
}
}
//复制图像
memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);
//释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
//返回
returnTRUE;
}
参考:
图像二值化 C语言程序的解读只要知道*(twovalimagewidth*indexhindexw) 表示什么就行了 。
你没给注释,所以我认为twovalimage是某图面第1像素灰度的地址,
*(twovalimagewidth*indexhindexw)就表示
第indexh 1行,indexw 1列的像素的灰度
=*(selimagewidth*indexhindexw)同理
求取阈值过程
for(indexh=0; indexhheight; indexh)
for(indexw=0; indexwwidth; indexw)
{
if(*(twovalimagewidth*indexhindexw)val2)
val2 =*(twovalimagewidth*indexhindexw);//val2:minvalue
if(*(twovalimagewidth*indexhindexw)val1)
val1 =*(twovalimagewidth*indexhindexw);//val1:maxvalue
}
表示在高为height,宽为width的灰度途中寻找最小灰度与最大灰度,分别保存至val2与val1
不懂val1 = val1 - (val1 - val2)/3的目的
如何用C语言对真彩色图像进行二值化?用点(x,y)的颜色值减去点(x 1,y 1)的像素颜色值 , 求出差,根据差值可设定阈值进行相应处理 。
关于c语言图像二值化函数和c#图像二值化的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 关于网络推广毕业设计,网络推广论文题目
- c语言编程数组求中位数,数组中位数 c语言
- 汾酒文化景区如何宣传营销,山西汾酒广告策划案
- 电脑竞速类游戏,电脑竞速类游戏有哪些
- 如何重启oracle集群 oracle10g重启命令
- 微信如何看公众号文章内容,如何看微信公众号的粉丝数量
- java人资系统项目代码,基于java的人力资源管理系统
- php新增数据做重复检验 php查重算法
- flutter修改自身属性,flutter修改包名