社区
图形处理/算法
帖子详情
紧急求救(100分)
cherishahu
2003-05-16 10:07:09
我的作业是将一个bmp图象进行二值化,谁有这样的现成的算法?
(完整的作业是对一个车号进行识别,我要做的就是读入一个bmp图象,然后输出一个经过二值化的bmp图象,给的算法是最大类间方差法,小弟我高数基础较差,难以求解)
我的信箱是cherish_ahu@etang.com,哪位大侠有现成的算法请发给我!
...全文
22
11
打赏
收藏
紧急求救(100分)
我的作业是将一个bmp图象进行二值化,谁有这样的现成的算法? (完整的作业是对一个车号进行识别,我要做的就是读入一个bmp图象,然后输出一个经过二值化的bmp图象,给的算法是最大类间方差法,小弟我高数基础较差,难以求解) 我的信箱是cherish_ahu@etang.com,哪位大侠有现成的算法请发给我!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wrcluomo
2003-05-17
打赏
举报
回复
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
cherishahu
2003-05-17
打赏
举报
回复
编译后WIDTHBYTES不认识,请问这是怎么搞的啊?
wrcluomo
2003-05-17
打赏
举报
回复
没什么了不起。别人要谢我也没办法。
我也认为不值得谢。这也不是我写的。不过我觉得不管事大事小,有人帮了你的忙。说声谢谢总不为过吧。如果认为这样做不对。下次别人问答你问题时你大骂他一顿好了。
zhuzhenghui
2003-05-17
打赏
举报
回复
不就是阈值的算法嘛,有什么了不起
cherishahu
2003-05-17
打赏
举报
回复
谢谢你啊!
tao_ao
2003-05-16
打赏
举报
回复
gz
wrcluomo
2003-05-16
打赏
举报
回复
小猪数字图像上有呀。有BUG,
我改了改。
/*************************************************************************
*
* 函数名称:
* ThresholdDIB()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
*
* 返回值:
* BOOL - 运算成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用于对图像进行阈值分割运算。
*
************************************************************************/
BOOL WINAPI ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
//HGLOCAL hNewDIBBits;
HGLOBAL hNewDIBBits;
//unsigned char *hNewDIBBits;
lWidth= WIDTHBYTES(lWidth * 8);
//循环变量
long i;
long j;
//像素值
unsigned char pixel;
//直方图数组
long lHistogram[256];
//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsigned char iThreshold,iNewThreshold,iMaxGrayValue,iMinGrayValue,iMean1GrayValue,iMean2GrayValue;
//用于计算区域灰度平均值的中间变量
long lP1,lP2,lS1,lS2;
//迭代次数
int iIterationTimes;
// 图像每行的字节数
LONG lLineBytes;
// 暂时分配内存,以保存新图像
//hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
hNewDIBBits = ::GlobalAlloc(LHND, lWidth * lHeight);
//hNewDIBBits=new LPSTR [lWidth * lHeight];
if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
//lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
lpNewDIBBits =(LPSTR )::GlobalLock((HGLOBAL) hNewDIBBits);
// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
}
//获得直方图
iMaxGrayValue = 0;
iMinGrayValue = 255;
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
lHistogram[pixel]++;
//修改最大,最小灰度值
if(iMinGrayValue > pixel)
{
iMinGrayValue = pixel;
}
if(iMaxGrayValue < pixel)
{
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;i < iThreshold;i++)
{
lP1 += lHistogram[i]*i;
lS1 += lHistogram[i];
}
iMean1GrayValue = (unsigned char)(lP1 / lS1);
for (i = iThreshold+1;i < iMaxGrayValue;i++)
{
lP2 += lHistogram[i]*i;
lS2 += lHistogram[i];
}
if(lS2==0)
return false;//lS2作为被除数不能为0
iMean2GrayValue = (unsigned char)(lP2 / lS2);
iNewThreshold = (iMean1GrayValue + iMean2GrayValue)/2;
}
//根据阈值将图像二值化
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
if(pixel <= iThreshold)
{
*lpDst = (unsigned char)0;
}
else
{
*lpDst = (unsigned char)255;
}
}
}
// 复制图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
// 释放内存
::GlobalUnlock((HGLOBAL) hNewDIBBits);
::GlobalFree(hNewDIBBits);
// 返回
return TRUE;
}
cherishahu
2003-05-16
打赏
举报
回复
谁帮帮我呀!
shaolunyuan
2003-05-16
打赏
举报
回复
小猪数字图像上有呀。有BUG,
我改了改。
/*************************************************************************
*
* 函数名称:
* ThresholdDIB()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
*
* 返回值:
* BOOL - 运算成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用于对图像进行阈值分割运算。
*
************************************************************************/
BOOL WINAPI ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
//HGLOCAL hNewDIBBits;
HGLOBAL hNewDIBBits;
//unsigned char *hNewDIBBits;
lWidth= WIDTHBYTES(lWidth * 8);
//循环变量
long i;
long j;
//像素值
unsigned char pixel;
//直方图数组
long lHistogram[256];
//阈值,最大灰度值与最小灰度值,两个区域的平均灰度值
unsigned char iThreshold,iNewThreshold,iMaxGrayValue,iMinGrayValue,iMean1GrayValue,iMean2GrayValue;
//用于计算区域灰度平均值的中间变量
long lP1,lP2,lS1,lS2;
//迭代次数
int iIterationTimes;
// 图像每行的字节数
LONG lLineBytes;
// 暂时分配内存,以保存新图像
//hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
hNewDIBBits = ::GlobalAlloc(LHND, lWidth * lHeight);
//hNewDIBBits=new LPSTR [lWidth * lHeight];
if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
//lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
lpNewDIBBits =(LPSTR )::GlobalLock((HGLOBAL) hNewDIBBits);
// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
}
//获得直方图
iMaxGrayValue = 0;
iMinGrayValue = 255;
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
lHistogram[pixel]++;
//修改最大,最小灰度值
if(iMinGrayValue > pixel)
{
iMinGrayValue = pixel;
}
if(iMaxGrayValue < pixel)
{
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;i < iThreshold;i++)
{
lP1 += lHistogram[i]*i;
lS1 += lHistogram[i];
}
iMean1GrayValue = (unsigned char)(lP1 / lS1);
for (i = iThreshold+1;i < iMaxGrayValue;i++)
{
lP2 += lHistogram[i]*i;
lS2 += lHistogram[i];
}
if(lS2==0)
return false;//lS2作为被除数不能为0
iMean2GrayValue = (unsigned char)(lP2 / lS2);
iNewThreshold = (iMean1GrayValue + iMean2GrayValue)/2;
}
//根据阈值将图像二值化
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
if(pixel <= iThreshold)
{
*lpDst = (unsigned char)0;
}
else
{
*lpDst = (unsigned char)255;
}
}
}
// 复制图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
// 释放内存
::GlobalUnlock((HGLOBAL) hNewDIBBits);
::GlobalFree(hNewDIBBits);
// 返回
return TRUE;
}
wqs6
2003-05-16
打赏
举报
回复
wrcluomo(落木) 的程序可以用
思路很清楚!
wqs6
2003-05-16
打赏
举报
回复
二值化不就是把图像的灰度值置为0和255嘛
不是太难!
我有程序。
电信设备-具有
紧急
求救
功能的移动终端及其
紧急
求救
方法.zip
电信设备-具有
紧急
求救
功能的移动终端及其
紧急
求救
方法.zip
酒店客房SOS
紧急
求救
系统设计方案2.doc
酒店客房SOS
紧急
求救
系统设计方案2.doc
酒店客房SOS
紧急
求救
系统设计方案及对策.doc
酒店客房SOS
紧急
求救
系统设计方案及对策.doc
基于Android的
紧急
求救
App的设计与实现.pdf
基于Android的
紧急
求救
App的设计与实现.pdf
电信设备-多功能街道信息服务与
紧急
求救
装置.zip
电信设备-多功能街道信息服务与
紧急
求救
装置.zip
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章