数字图像处理2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)