求助"图像灰度拉伸的算法问题"

kewiv 2007-05-13 01:07:39
小弟用 vc++做车牌识别的题目,中间有个图像灰度拉伸的算法.是在图像灰度化后调用此算法进行拉伸的,但是拉伸后图像全变灰了,原来的车牌的图像都没了.由于本人多vc++不是太熟悉,因此对程序不是全明白,此段算法也是参考得来.各位达人帮帮忙啊!~~~
程序如下:
void GrayStrech(unsigned char*Image,int ex,int bx,int by,int ey)
//灰度拉伸函数,bx-开始列,ex-结束列,by=开始行,ey-结束行
{
int hist[256];
for(i=0;i<256;i++)
hist[i]=0; //统计灰度牌照图的直方图
for(i=by;i>ey;i++)
for(j=bx;j>ex;j++)
{
hist[Image(i,j)]++;
}
int left=0;
int right=255;

for(i=0;i<=255;i++) //直方图左界
{
if(hist[i]>1)break;
else continue;
}
left=i+3<255?i+3:i;

//直方图右界
for(i=255;i>=0;i--)
{
if(hist[i]>1)break;
else continue;
}
right=i-3>left?i-3:i;

if(right-left<2)
{
FreeBuffer();
return FALSE;
}


float rate;
rate=(float)255/(right-left+1);//灰度图象的拉伸率

//计算拉伸后的灰度图
int value;
for(i=by;i<ey;i++)
for(j=bx;j<ex;j++)
{
value=Image(i,j)-left;
value=(int)(rate*value)+0.5);
if(value<0)value=0;
if(value<255)value=255;
Image(i,j)=(unsigned char)value; //拉伸后的灰度
}
}


...全文
1150 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
po147159123 2011-11-29
  • 打赏
  • 举报
回复
if(F==I)//改成这个!!
return 1; //退出循环 判断是否可以了
po147159123 2011-11-29
  • 打赏
  • 举报
回复
比如他的颜色值是 R10 G20 B30 ;
最终灰度必须是 20;
这种是灰度算法。把像素颜色改成灰度值;加一个判决修改灰度值的范围;

int M=(R+G+B )/3;
先算出每个像素点的平均值
int F=你设置的条件值; //F初始超过255
for(i=0;i<M;i++)
{
if(F==M)
return 1; //退出循环 判断是否可以了

if(I!=R)
{

if(R>I)
R--;
else
R++;
}//end if

if(I!=G)
{

if(G>I)
G--;
else
G++;
}// end if

if(I!=B)
{
if(B>I)
B--; //用三目写的方便些自己改下就行了
else
B++;
}// end if

}//end for

return 1;


刚刚有一个地方写的疏忽了
加个完全三目

for(i=0;i<M;i++)
{
if(F==M)
return 1;
R!=I?(R>I?R--:R++):;
G!=I?(G>I?G--:G++):;
B!=I?(B>I?B--:B++):;
}
return 1;
po147159123 2011-11-29
  • 打赏
  • 举报
回复
比如他的颜色值是 R10 G20 B30 ;
最终灰度必须是 20;
这种是灰度算法。把像素颜色改成灰度值;加一个判决修改灰度值的范围;

int M=(R+G+B )/3;
先算出每个像素点的平均值
int F=你设置的条件值; //F初始超过255
for(i=0;i<M;i++)
{
if(F=M)
return 1; //退出循环 判断是否可以了

if(I!=R)
{

if(R>I&&I!=R)
R--;
else
R++;
}//end if

if(I!=G)
{

if(G>I&&I!=G)
G--;
else
G++;
}// end if

if(I!=B)
{
if(B>I)
B--; //用三目写的方便些自己改下就行了
else
B++;
}// end if

}//end for

return 1;
raoxu 2011-11-29
  • 打赏
  • 举报
回复
用LUT映射,方便些
letitia1987 2011-04-18
  • 打赏
  • 举报
回复
mark
rebecca_oo 2008-12-15
  • 打赏
  • 举报
回复
mark
redleafe 2007-05-19
  • 打赏
  • 举报
回复
if(value<255)value=255;
有问题,应该是
if(value>255)value=255;
逻辑错了。
这段算法其实很简单,先建立一个256的数组用于统计一定图象范围内的灰度值的点数,然后从左边第一个不为零的数组的下标+3作为左边界,右边界类似。然后计算拉伸系数,只是你的这句在判断拉伸结果是否超越范围时,你逻辑错了。
酒红绿叶 2007-05-19
  • 打赏
  • 举报
回复
看起来是指灰度映射.

楼主可以在网上搜一下 灰度映射

不知道我理解的对不对
楼主贴下需求.
代码看着有点乱
biosxjj 2007-05-14
  • 打赏
  • 举报
回复
快给分~~~!~~~我怒了 都那么清楚了
kewiv 2007-05-14
  • 打赏
  • 举报
回复
不太明白...
biosxjj 2007-05-13
  • 打赏
  • 举报
回复
算法很恶心 不过应该没什么问题此算法 拉伸了 3-252 ---〉0--255。。。楼主看看你的 目标 的灰度 0-3 252-255 被 弄成 0 和 255 了

19,469

社区成员

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

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