您好,欢迎来到乌哈旅游。
搜索
您的当前位置:首页C语言实现BMP图像处理(彩色图转灰度图)

C语言实现BMP图像处理(彩色图转灰度图)

来源:乌哈旅游
C语⾔实现BMP图像处理(彩⾊图转灰度图)

我们知道真彩图不带调⾊板,每个象素⽤ 3 个字节,表⽰ R、G、B 三个分量。所以处理很简单,根据 R、G、B 的值求出 Y 值后,将 R、G、B 值都赋值成 Y,写⼊新图即可。 在YUV 的颜⾊表⽰⽅法中,Y 分量的物理含义就是亮度,它含了灰度图(grayscale)的所有信息,只⽤ Y 分量就完全能够表⽰出⼀幅灰度图来。YUV 和RGB 之间有着如下的对应关系:

再来看看带调⾊板的彩⾊图,我们知道位图中的数据只是对应调⾊板中的⼀个索引值,我们只需要将调⾊板中的彩⾊变成灰度,形成新调⾊板,⽽位图数据不⽤动,就可以了。

以上解释来⾃于:《数字图像处理编程⼊门》,代码参考:

#include#include

int main(int argc, char* argv[]){

int bmpHeight; int bmpWidth;

unsigned char *pBmpBuf; RGBQUAD *pColorTable; int biBitCount;

//读取bmp⽂件

FILE *fp = fopen(\"./02.bmp\ if (fp == 0) return 0;

fseek(fp, sizeof(BITMAPFILEHEADER), 0);

BITMAPINFOHEADER head; fread(&head, 40, 1, fp);

bmpHeight = head.biHeight; bmpWidth = head.biWidth; biBitCount = head.biBitCount;

fseek(fp, sizeof(RGBQUAD), 1);

int LineByte = (bmpWidth*biBitCount / 8 + 3) / 4 * 4;//保证每⼀⾏字节数都为4的整数倍 pBmpBuf = new unsigned char[LineByte*bmpHeight]; fread(pBmpBuf, LineByte*bmpHeight, 1, fp); fclose(fp);

//将24位真彩图灰度化并保存

FILE *fp1 = fopen(\"gray.bmp\ if (fp1 == 0) return 0;

int LineByte1 = (bmpWidth * 8 / 8 + 3) / 4 * 4;

//修改⽂件头,其中有两项需要修改,分别为bfSize和bfOffBits BITMAPFILEHEADER bfhead; bfhead.bfType = 0x4D42;

bfhead.bfSize = 14 + 40 + 256 * sizeof(RGBQUAD)+LineByte1*bmpHeight;//修改⽂件⼤⼩ bfhead.bfReserved1 = 0; bfhead.bfReserved2 = 0;

bfhead.bfOffBits = 14 + 40 + 256 * sizeof(RGBQUAD);//修改偏移字节数 fwrite(&bfhead, 14, 1, fp1); //将修改后的⽂件头存⼊fp1;

//修改信息头,其中有两项需要修改,1个位biBitCount:真彩图为24 ,应改成8;另⼀个是biSizeImage:由于每像素所占位数的变化,所以位图数据的⼤⼩发⽣变化 BITMAPINFOHEADER head1;

head1.biBitCount = 8; //将每像素的位数改为8 head1.biClrImportant = 0; head1.biCompression = 0; head1.biClrUsed = 0;

head1.biHeight = bmpHeight; head1.biWidth = bmpWidth; head1.biPlanes = 1; head1.biSize = 40;

head1.biSizeImage = LineByte1*bmpHeight;//修改位图数据的⼤⼩ head1.biXPelsPerMeter = 0; head1.biYPelsPerMeter = 0;

fwrite(&head1, 40, 1, fp1); //将修改后的信息头存⼊fp1;

pColorTable = new RGBQUAD[256]; for (int i = 0; i < 256; i++){ pColorTable[i].rgbRed = i; pColorTable[i].rgbGreen = i;

pColorTable[i].rgbBlue = i; //是颜⾊表⾥的B、G、R分量都相等,且等于索引值

}

fwrite(pColorTable, sizeof(RGBQUAD), 256, fp1); //将颜⾊表写⼊fp1;

//写位图数据

unsigned char *pBmpBuf1;

pBmpBuf1 = new unsigned char[LineByte1*bmpHeight]; for (int i = 0; i < bmpHeight; i++){ for (int j = 0; jpb1 = pBmpBuf + i*LineByte + j * 3;

int y = *(pb1)*0.299 + *(pb1 + 1)*0.587 + *(pb1 + 2)*0.114; //将每⼀个像素都按公式y=B*0.299+G*0.587+R*0.114进⾏转化 pb2 = pBmpBuf1 + i*LineByte1 + j; *pb2 = y; } }

fwrite(pBmpBuf1, LineByte1*bmpHeight, 1, fp1);

fclose(fp1);

system(\"pause\"); return 0;}

实验结果分析:

实验结果分析:真彩⾊图不带调⾊板,⽽灰度图的调⾊板为256级。所以在修改调⾊板时需要将RGB三个分量修改为256级,根据YUV颜⾊空间中Y分量计算。

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- wuhaninfo.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务