关于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('灰度图'); %显示灰度图

关于24位彩色图转换为8位灰度图的程序代码问题,程序如下:
LPBYTE lpGradeBmpData = (LPBYTE)(lpGradeBmp+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);这一句是让lpGradeBmpData 指向位图的数据区,这样就可以一个一个的图像数据进行操作了

32位真彩色BMP转换为8位灰度图,求源代码,C\/C++都行,关键是颜色分量如何...
颜色是用 RGB来描述的,当RGB相等时就是灰色,所以彩色转换成灰色,就是使 RGB 三个分量都等于(R+G+B)\/3,所有像素点都这样处理过后,图片就成灰色的了。

ps怎么把图片转为灰度图雕刻ps如何把图片转成灰度图
1. 打开图片:在PS中,点击菜单栏中的"文件",然后选择"打开"来打开需要转换的图片。2. 转为灰度图:在打开的图片文件上,点击菜单栏中的"图像",然后选择"调整",再选择"转换为灰度"。这将把彩色图片转换为灰度图。3. 调整图像对比度:为了使图像更适合雕刻,您可以进一步调整图像的对比度。点击...

arcgis怎么将彩色图转换成灰度图?
选择栅格鼠标右键->properties->打开Layer Properties对话框->选择Symbology选项卡->在Show面板处选择Stretched即可。

在MATLAB里如何将JPG格式的彩色图片转化为灰度图?
MyYuanLaiPic = imread('e:\/image\/matlab\/darkMouse.jpg');%读取RGB格式的图像 MyFirstGrayPic = rgb2gray(MyYuanLaiPic);%用已有的函数进行RGB到灰度图像的转换 [rows , cols , colors] = size(MyYuanLaiPic);%得到原来图像的矩阵的参数 MidGrayPic = zeros(rows , cols);%用得到的参数...

彩色图片转黑白、灰度扫描打印效果工具,在线可用且免费
操作过程如下:首先,通过浏览器访问工具网站,选择“图片转黑白灰”功能。该功能支持四种转换效果:黑白(二值图)、灰度(黑白灰)、色彩增强、亮度提升。选择需要的图片,点击“修改为”选项,选择相应效果后,预览图片并下载或删除。黑白转换仅保留黑白色调,灰度图则更自然丰富,色彩增强模式突出色彩对比...

如何将真彩色图转换为各种灰度图
,表示黑和白。将彩色转换为灰度时候,按照公式计算出对应的值,该值实际上是亮度的级别;亮度从 0 到 255 ;由于不同的位有不同的亮度级别,所以 Y 的具体取值如下:Y = Y\/ (1<<(8- 转换的位数 ));最后一点需要注意,得到 Y 值存放方式是不同的;分别用对应的位数来存储对应的 Y 值。

怎么用c++实现彩图到灰度图转化(双峰法,迭代法都行)并设计一个有一定...
slider, 0 ); waitKey(0); return 0;}上面的代码只实现了一部分功能,可以把彩色图转化为灰度图和旋转图片。只能从源码中修改图片路径来输入图片。代码是调用opencv库来实现的。运行时的界面 把Become gray移到最右边就变成了灰度图像 Rotate degree是旋转图片,下面的是旋转104度的结果 ...

python学习笔记4-PIL.Image.open()读取图像
在使用PIL.Image.open()读取图像时,若默认读取为P模式,可通过convert()函数将图像转换为所需模式,如转换为L(灰度图)或RGB(真彩色)。其中,L模式为8位像素灰度图,P模式为8位像素调色板模式,RGB模式为三通道真彩色,而RGBA模式则在RGB基础上添加透明通道。在图像处理中,单通道图像上的调色板...

如何用MATLAB把bmp格式变成灰度图像
\\x0d\\x0a假设你需将名为face1.bmp的彩色图转换为face2.bmp的灰度图,代码如下:\\x0d\\x0aimageName=strcat('face1.bmp');%获取图像名称\\x0d\\x0aI=imread(imageName);%读取彩色图像\\x0d\\x0aJ=rgb2gray(I);%转换为灰度图\\x0d\\x0afigure(1);%窗口显示灰度图\\x0d\\x0aimshow(J);...

相似回答