在上一篇文章主要讲解了如何将一张彩色图片处理为灰度图
从零开始写一个图像处理程序(BMP彩色图转灰度图)_星空_MAX的博客-CSDN博客
这次将讲如何将灰度图中的通道提取出来
图像格式读取:
依旧通过
#include<windows.h>
BITMAPINFOHEADER bihead;
bihead.biHeight //图像的高
bihead.biWidth //图像中宽
读出图像的长和宽
上次处理的灰度图中由于每一个点存储的值变为了0-255的灰度值,所以每一的比特数据发生了改变
int LineByte=(bihead.biWidth*8/8+3)/4*4;
定义int去存储cahnnel数据
int *channel=new int[bihead.biHeight*bihead.biWidth];
注意,有可能会造成return 3221225477 (0xC0000005),即访问越界
注意:
由于C语言没有下标越界报错,造成return 3221225477 (0xC0000005),即访问越界的错误
于是定义为unsigned char(8位)去存储channel
unsigned char *channel=new unsigned char[bihead.biHeight*bihead.biWidth];
这样不会报错,并可以正确输出通道值:
但是为了更安全,我们可以使用C++的vector容器去存储数据
为了省空间依旧用unsigned char定义元素类型
//定义像素个数的vector大小,并初始化为0
std::vector<unsigned char>channel(bihead.biHeight*bihead.biWidth,0);
全部代码:
#include<stdio.h>
#include<windows.h>
#include<vector>
int main()
{
BITMAPINFOHEADER bihead;
unsigned char *pBmpBuf;
FILE *fp=fopen("newcat.bmp","rb");
if(fp==0)
return 0;
fread(&bihead,40,1,fp); //将信息头读入内存
int LineByte=(bihead.biWidth*8/8+3)/4*4; //保证每行字节数为4的整数倍
pBmpBuf=new unsigned char[LineByte*bihead.biHeight]; //为数据区分配内存空间
fread(pBmpBuf,LineByte*bihead.biHeight,1,fp); //将bmp数据区读入内存
fclose(fp);
std::vector<unsigned char>channel(bihead.biHeight*bihead.biWidth,0);
for(int i=0;i<bihead.biHeight;i++)
for(int j=0;j<bihead.biWidth;j++)
{
unsigned char *pb;
pb=pBmpBuf+i*LineByte+j;
channel.push_back(*pb);
}
printf("\nWidth:%d, Height: %d,biBitCount:%d\n",bihead.biWidth,bihead.biHeight,bihead.biBitCount);
fclose(fp);
return 0;
}
以上代码将所有像素点的信息读入channel中;