关于24位彩色图转换为8位灰度图的程序代码问题,程序如下:

BYTE r,g,b;
//灰度位图数据处理
LPBYTE lpGradeBmpData = (LPBYTE)(lpGradeBmp+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
for(int i=0;i<lHeight;i++)//进行颜色变化
for(int j = 0;j<lWidth;i++)
{
b = m_lpData[i*uLineByte+3*j];
g = m_lpData[i*uLineByte+3*j+1];
r = m_lpData[i*uLineByte+3*j+2];
lpGradeBmpData[i*uGradeBmpLineByte+j] = (BYTE)(0.299*r+0.587*g+0.114*b);
}//如何实现的?
程序中变量声明:LPBYTE m_lpData;//位图数据指针
UINT uLineByte = this->GetLineByte();
GetLineByte()//获得每行像素所占字节数
此段代码为颜色转换,没看懂,那位高手解答一下啊,非常感谢!

LPBYTE lpGradeBmpData = (LPBYTE)(lpGradeBmp+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
这一句是让lpGradeBmpData 指向位图的数据区,这样就可以一个一个的图像数据进行操作了追问

我的意思是下面的代码,就是颜色转换那块的代码啥意思

追答

因为我觉得下面这几句没什么讲的,一眼就明白了啊

for(int i=0;i<lHeight;i++)//进行颜色变化
for(int j = 0;j<lWidth;i++)
{
b = m_lpData[i*uLineByte+3*j];//这三句获取图像的rgb分量,i,j计算出应该处理图像中的哪一个像素(由于图像的像素是连续排列的,所以可以逐个获取)
g = m_lpData[i*uLineByte+3*j+1];
r = m_lpData[i*uLineByte+3*j+2];
lpGradeBmpData[i*uGradeBmpLineByte+j] = (BYTE)(0.299*r+0.587*g+0.114*b);//计算灰度值,按照这个公式计算,有不同的方法,一般是使用这个方法的,并把计算得到的值放在灰的图像的数据区
}//如何实现的?

追问

感谢你的热心回答,我的理解是处理的时候是一个个像素处理的吧,主要是 m_lpData[i*uLineByte+3*j+1]里面的内容不太理解。UINT uLineByte = GetLineByte()//获得每行像素所占字节数。为什么要乘以一行像素的字节数啊。

追答

由于像素是按一维数组进行排列的,在
for(int i=0;i<lHeight;i++)//进行颜色变化
for(int j = 0;j<lWidth;i++)
这个嵌套循环中,i代表当前处理的数据的行,j代表当前处理数据在一行中的第几个,这样为了获取这个像素距离指针开始位置的偏移量,需要行数乘以一行像素的字节数
不知道你明白了没
00000
00000
00000
假设上面的是一个图像的数据区,然后保存在一维指针里面,在内存中就是这样的
000000000000000
假设开始的位置为pos,现在为了得到第二行第三个的位置,可以这样计算得到:
pos+1*5+3
i*uLineByte+3*j+1这里之所以要乘以3,是因为彩色图像中,一个像素要用三个字节存储
不知道明白了没

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-25

RGB=imread('img.bmp','bmp'); %读入彩色图片
figure(1),imshow(RGB),title('彩色图'); %显示彩色图片
I=rgb2gray(RGB); %彩色转化成灰度图
figure(2),imshow(I),title('灰度图'); %显示灰度图
相似回答