紧急求救(100分)

cherishahu 2003-05-16 10:07:09
我的作业是将一个bmp图象进行二值化,谁有这样的现成的算法?
(完整的作业是对一个车号进行识别,我要做的就是读入一个bmp图象,然后输出一个经过二值化的bmp图象,给的算法是最大类间方差法,小弟我高数基础较差,难以求解)
我的信箱是cherish_ahu@etang.com,哪位大侠有现成的算法请发给我!
...全文
22 11 打赏 收藏 转发到动态 举报
写回复
用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嘛
不是太难!
我有程序。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧