如何用DIB绘制8位的灰度图像?绘出的灰度图像为啥出现蓝色和红色?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用DIB绘制8位的灰度图像?绘出的灰度图像为啥出现蓝色和红色?相关的知识,希望对你有一定的参考价值。
程序片段:
m_bmpInfoHeader1.biSize = sizeof(BITMAPINFOHEADER);
m_bmpInfoHeader1.biPlanes = 1;
m_bmpInfoHeader1.biBitCount = 8;
m_bmpInfoHeader1.biHeight = 720;
m_bmpInfoHeader1.biWidth = 1280;
m_bmpInfoHeader1.biClrImportant = 0;
m_bmpInfoHeader1.biClrUsed = 256;
m_bmpInfoHeader1.biCompression = BI_RGB;
m_bmpInfoHeader1.biSizeImage = 0;
m_bmpInfoHeader1.biXPelsPerMeter = 0;
m_bmpInfoHeader1.biYPelsPerMeter = 0;
使用一下语句绘图:
DrawDibDraw=(ghdd,hDC,0,0,1280,720,&m_bmpInfoHeader1,pPtrPicData1,0,0,1280, 720,0);
这样绘出的图像会出现蓝色和红色,不知道是什么原因?用DrawDibDraw绘8位灰度图像是不是需要建立颜色表和调色板?另外,使用24位绘图正常。
(我猜想之所以这样处理,是出于节省内存的考虑。因为对于24位位图,它能表示的颜色数很多,如果要建一个颜色表,这个颜色表本身的开销就不小,还不如不要颜色表,颜色数据区的数值就表示BGR值,但对于诸如1、4、8位的位图,它们所能展现的颜色数是非常有限的,如果还用24位位图的处理方法:每个像素点的颜色值占3个字节表示BGR值,那么当图像尺寸很大时,还不如建一个颜色表,把这张位图用到的各种颜色事先定义,而在颜色数据区分别用1bit、4bit、1byte来存储该像素点的颜色在颜色表中的索引值。)
所以你的程序对于24位位图测试成功,对8位位图等则不会成功。
颜色表中RGBQUAD描述每一种颜色项。对于1、4、8、24位位图,需要的RGBQUAD结构体的数量分别为:2、16、256、0。
typedef struct tagRGBQUAD
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
RGBQUAD; // 占用四个字节
其实,从位图文件头BITMAPFILEHEADER的成员bfOffBits可以计算出来所需RGBQUAD的个数。对于8位位图,这个成员的值为1078。则RGBQUAD的个数是: (1078 - 54) / 4 = 256。 参考技术A 8位?不管是灰度还是彩色都需要建立调色板。
如何用matlab做图片的灰度直方图
在matlab中对图片制作灰度直方图
参考技术A 或者在 matlab下边输入 help imhistedit histeq
%%%灰度图象的直方图数据%%%
clc
clear
fn='rice.tif';
I=imread (fn);
J=I;
%计算灰度图象的直方图数据
L=256; %灰度级
Ps = zeros(L,1); %统计直方图结果数据
nk=zeros(L,1);
[row,col]=size(I);
n=row*col; %总像素个数
for i = 1:row
for j = 1:col
num = double(I(i,j))+1; %获取像素点灰度级
nk(num) = nk(num)+1; %统计nk
end
end
%计算直方图概率估计
for i=1:L
Ps(i)=nk(i)/n;
end
figure;
subplot(3,1,1);imshow(J),title('原图');
subplot(3,1,2),plot(nk),title('直方图(nk)');
subplot(3,1,3),plot(Ps),title('直方图(Ps)');
%figure(4),imhist(hist);
%p=imhist(hist); %生成直方图函数,返回灰度图象直方图数据
%figure(5),plot(p);
以上是关于如何用DIB绘制8位的灰度图像?绘出的灰度图像为啥出现蓝色和红色?的主要内容,如果未能解决你的问题,请参考以下文章