数字图像处理2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用C/C++进行图像处理

本系列仅针对BMP格式的图像

实现的功能包括读,存,二值化,缩放,反色,均值滤波,中值滤波,增强,腐蚀,膨胀功能:二值化

(运行本程序需要参考“数字图像处理1”)

源码:

/*函数功能:彩色图像转化为灰度图象

输入参数:RGBQUAD** dataOfBmp_src --- 原图像所有像素(以行为序)对应的

RGBAlpha 四元素结构体指针;

RGBQUAD** dataOfBmp_dst --- 转化为灰度图象后的图像所有像素(以行为序)对应的RGBAlpha 四元素结构体指针;

BYTE** dataOfBmp_gray --- 转化为灰度图象后的图像所有像素(以行为序)对应的灰度值;

DWORD width, DWORD height --- 原图像和输出图像的宽度和高度

(以像素为单位)

输出值:没有

*/

void RGB2Gray(RGBQUAD** dataOfBmp_src, RGBQUAD** dataOfBmp_dst, BYTE** dataOfBmp_gray, DWORD width, DWORD height)

{

double gray;

for(DWORD i=0;i

{

for(DWORD j=0;j

{

gray = 0.299*dataOfBmp_src[i][j].rgbRed+0.587*dataOfBmp_src[i][j].rgbGreen+0.114*dataOfBmp_src[i ][j].rgbBlue;

dataOfBmp_gray[i][j] = (BYTE)gray;

dataOfBmp_dst[i][j].rgbRed = (BYTE)gray;

dataOfBmp_dst[i][j].rgbGreen = (BYTE)gray;

dataOfBmp_dst[i][j].rgbBlue = (BYTE)gray;

}

}

}

主函数:

void main()

{

BITMAPFILEHEADER bitHead;

BITMAPINFOHEADER bitInfoHead;

int i, j;

FILE* pfile;

char strFile[50];

printf("please input the .bmp source file name:\n");

scanf("%s",strFile);

pfile = fopen(strFile,"rb");//打开文件

if(pfile!=NULL)

{

printf("file %s open success.\n", strFile);

//读取位图文件头信息

fread(&bitHead,1,sizeof(BITMAPFILEHEADER),pfile);

if(bitHead.bfType != 0x4d42)

{

printf("file is not .bmp file!");

return;

}

showBmpHead(&bitHead);

printf("\n\n");

//读取位图信息头信息

fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile);

showBmpInforHead(&bitInfoHead);

printf("\n");

}

else

{

printf("file open fail!\n");

return;

}

RGBQUAD* pRgb=NULL;

if(bitInfoHead.biBitCount < 24)//有调色板

{

//读取调色盘结信息

long nPlantNum = bitInfoHead.biClrUsed;

if(!nPlantNum)

nPlantNum = long(pow(2,double(bitInfoHead.biBitCount))); // Mix color Plant Number;

pRgb=new RGBQUAD[nPlantNum*sizeof(RGBQUAD)];

memset(pRgb,0,nPlantNum*sizeof(RGBQUAD));

int num = fread(pRgb,4,nPlantNum,pfile);

printf("Color Plate Number: %d\n",nPlantNum);

printf("颜色板信息:\n");

showRgbQuan(pRgb, nPlantNum);

}

int width = bitInfoHead.biWidth;

int height = bitInfoHead.biHeight;

//分配内存空间把源图存入内存

int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为32的倍数

long nData = height*l_width;

BYTE *pColorData= new BYTE[nData];

memset(pColorData,0,nData);

//把位图数据信息读到数组里

fread(pColorData,1,nData,pfile);

//将位图数据转化为RGB数据

RGBQUAD** dataOfBmp_src=NULL; //用于保存各像素对应的RGB数据

dataOfBmp_src = new RGBQUAD*[height];

for(i=0; i < height;i++)

dataOfBmp_src[i] =new RGBQUAD[width];

if(bitInfoHead.biBitCount<24)//有调色板,即位图为非真彩色

{

int k;

if(bitInfoHead.biBitCount <= 8 && !bitInfoHead.biCompression)

{

int pnum = 8/bitInfoHead.biBitCount;

int mbnum = 8-bitInfoHead.biBitCount;

for(int i=0;i

{

int k0 = (height-i-1)*l_width;//k:取得该像素颜色数据在实际数据数组中的序号

for(int j=0;j

{

BYTE mixIndex= 0;

k = k0+(j/pnum);

mixIndex = pColorData[k];

//mixIndex:提取当前像素的颜色的在颜色表中的索引值

if(bitInfoHead.biBitCount < 8)

相关文档
最新文档