[Help]如何将读入内存中的位图,灰度化处理?[高分求教]

larntin2002 2005-04-08 10:45:47
现在我获取了:已经读入内存中位图的BITMAPINFO和HBITMAP,我如何处理一下可以将原来的彩色图通过灰度算法转变之后,在输出到屏幕上?谢谢..
...全文
228 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianliangs37 2005-04-21
  • 打赏
  • 举报
回复
for (row=0;row<height;row++) {
for (col=0;col<widthPix;col++) {
LPBYTE pRed, pGrn, pBlu;
pRed = buf + row * widthPix * 3 + col * 3;
pGrn = buf + row * widthPix * 3 + col * 3 + 1;
pBlu = buf + row * widthPix * 3 + col * 3 + 2;
/* if((int)(*pRed)<40 || (int)(*pGrn)<40 || (int)(*pBlu)<20)
{
*pRed = (BYTE)(0);
*pGrn = (BYTE)(0);
*pBlu = (BYTE)(0);
}*/
// int lum = (int)(.7 * (double)(*pRed) + .1 * (double)(*pGrn) + .2 * (double)(*pBlu));

int lum = (int)(.299 * (double)(*pRed) + .587 * (double)(*pGrn) + .114 * (double)(*pBlu));

*pRed = (BYTE)lum;
*pGrn = (BYTE)lum;
*pBlu = (BYTE)lum;
}
}

这是我曾经用过的一段代码,或许对你有帮助!
gloomyfish 2005-04-20
  • 打赏
  • 举报
回复
灰度化的阈值没有固定的算法,要看实际图象的特性和图象特征
如果不考虑这些,而硬套公式肯定会导致图象部分失真和信息丢失,最要能动态的实现
阈值设置,比较稳妥的~~~~~~~~~
babysun2001 2005-04-13
  • 打赏
  • 举报
回复
TO ALL:
我也有同样的问题:把一幅DIB的位图显示在对话框上后,用LOADIMAGE()得到的是HBITMAP句柄,显然这是DDB(GDI)的句柄.是不是显示的时候系统把DIB的格式转换为DDB呢?对于得到的这个HBITMAP句柄如何对DDB中的数据进行操作,从而显示不同的灰度处理效果呢?
看到有的人用用GetDiBits函数来获得位图的数据,修改完后用SetDiBits来设置原来的位图数据.这不是从DIB来,经过DDB,又回到了DIB,那还不如直接对DIB寻找数据区指针来操作灰度数据.我的看法对不对,请高手指点.谢谢!
skyboyzb 2005-04-13
  • 打赏
  • 举报
回复
我有转换的源代码,最近我也在做这个东西,希望大家一起讨论。
我的MSN:skyboyzb@hotmail.com
QQ:54574216
加我,我们一起讨论吧!
larntin2002 2005-04-11
  • 打赏
  • 举报
回复
谢谢..呵呵
larntin2002 2005-04-11
  • 打赏
  • 举报
回复
TO: elyta(流连忘返)
我去搜过,没有这片文章...如果有网址的话情帖上来
elyta 2005-04-10
  • 打赏
  • 举报
回复
可以参考codeproject上的例子,《Go to sleep! Fade to B/W》吧
勇敢的BK7 2005-04-10
  • 打赏
  • 举报
回复
用GetDiBits函数来获得位图的数据,修改完后用SetDiBits来设置原来的位图数据。
然后重建一个8位同样大小的灰度图像,并转化彩色到灰度就可以拉

转换RGB为灰度值,标准有很多,例如:Gray scale=Y=(222*Red+707*Green+71*Blue)/1000
或者Gray=(R+G+B)/3,Gray = Green,
larntin2002 2005-04-10
  • 打赏
  • 举报
回复
晕...我用了灰度算法把他们的r=g=b,但是还是可以看出彩色,有没有人知道,怎么样才能真真的去掉彩色信息啊?
zoologist 2005-04-08
  • 打赏
  • 举报
回复
r=g=b就是灰色的像素
dirdirdir3 2005-04-08
  • 打赏
  • 举报
回复
用GetDiBits函数来获得位图的数据,修改完后用SetDiBits来设置原来的位图数据。
larntin2002 2005-04-08
  • 打赏
  • 举报
回复
但是我不知道,怎样获取内存中位图的数据,怎样处理他的数据.例如现在读了一幅150*150(pixel)的图,单步调试的时候看到了BITMAPINFO和HBITMAP的信息,但是我怎么样改变内存中的值呢,好让他显示在屏幕上时时灰色的,谢谢
larntin2002 2005-04-08
  • 打赏
  • 举报
回复
COLORREF BASE0::RGB24toGray(DWORD sour)
{
int r,g,b,t; //临时变量
int gMask=0x00ff00; //绿色掩码
int bMask=0x0000ff; //兰色掩码

r=(sour>>16);
g=(sour & gMask) >>8;
b=sour & bMask;
t=(r*3+g*6+b)/10;

return COLORREF((t<<16)|(t<<8)|t);
}
这个时我的灰度化的程序
CloudWater 2005-04-08
  • 打赏
  • 举报
回复
将象素的颜色通过一人阈值灰化不就可以了
larntin2002 2005-04-08
  • 打赏
  • 举报
回复
不要发广告啊
TO:zy3481(远影孤帆)
如果不用调色板,就不能显示灰色的图吗?
larntin2002 2005-04-08
  • 打赏
  • 举报
回复
晕,我还以为有高手指导我呢....
zy3481 2005-04-08
  • 打赏
  • 举报
回复
GetDiBits函数来获得位图的数据
转换RGB为灰度值,标准有很多,例如:Gray scale=Y=(222*Red+707*Green+71*Blue)/1000
或者Gray=(R+G+B)/3,Gray = Green,
之后可用一256色灰度调色板显示
larntin2002 2005-04-08
  • 打赏
  • 举报
回复
TO: zoologist(王朝) ( ) 信誉:100
我也认为你说的对,也是那么做的,但是还是可以看出颜色来,我确实时,把计算出来的值赋给了三个颜色字段
qrlvls 2005-04-08
  • 打赏
  • 举报
回复
http://purec.binghua.com/Article/Class6/Class23/200412/392.html

19,468

社区成员

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

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