图像信息处理实验五

来源:互联网 发布:win7模仿mac主题2017 编辑:程序博客网 时间:2024/06/18 18:48

要求:

1.Image mean filtering

2.Laplacian image enhancement

#include <stdio.h>#include <Windows.h>//线性均值滤波void imf(char* a, char* b){BITMAPFILEHEADER fileHeader;// 位图头文件BITMAPINFOHEADER infoHeader;// 位图信息头FILE* pFile = fopen(a, "rb");if (pFile == NULL){printf("打开文件失败\n");exit(-1);}// 读取头信息fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);   //读取文件头fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);   //读取信息头WORD bitCount = infoHeader.biBitCount;//色彩的位数if (bitCount == 16){exit(-1);}int Clr = 0;RGBQUAD *QUAD = NULL;if (bitCount < 16){Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;if (Clr>256)Clr = 0;}// 读取调色板int i = 0, j = 0;if (Clr > 0){QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);for (i = 0; i < Clr; i++){QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue);  //灰度图像三个都是y}}LONG pW = infoHeader.biWidth;     //图像数据的宽度LONG pH = infoHeader.biHeight;    //图像数据的高度int pSize = ((pW * bitCount)>>3)*pH;  //图像数据大小BYTE* P = (BYTE*)malloc(pSize);   //申请空间保存图像数据int LineSize = ((pW * bitCount)>> 3);  //行数据大小fread(P, pSize, 1, pFile);     //存入图像数据//先转grey图像if (Clr == 0){for (i = 0; i < pH; i++)//行{if (bitCount == 24){for (j = 0; j < pW*3; j = j + 3)// 列{int n = i*LineSize + j;P[n] = P[n + 1] = P[n + 2] = (BYTE)(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]); //分别是r,g,b分量}}}}    //均值滤波        for (i = 1; i < pH - 1; i++)//行{for (j = 3; j < (pW - 1) * 3; j = j + 3)// 列{//int n = i*LineSize + j;P[i*LineSize + j] = P[i*LineSize + j + 1] = P[i*LineSize + j + 2] = (BYTE)((P[i*LineSize+j]+P[i*LineSize+j+3]+P[i*LineSize+j-3]+P[(i-1)*LineSize+j]+P[(i-1)*LineSize+j+3]+P[(i-1)*LineSize+j-3]+P[(i+1)*LineSize+j-3]+P[(i+1)*LineSize+j+3]+P[(i+1)*LineSize+j])/9);  //等于9个像素点的均值}}FILE* dFile = fopen(b, "wb");//创建目标文件fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile);   //写入文件头fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile);  //写入文件信息头if (QUAD){fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);}//写入图像数据fwrite(P, pSize, 1, dFile);fclose(dFile);if (QUAD){free(QUAD);QUAD = NULL;}if (P){free(P);P = NULL;}}void lie(char* a, char* b){BITMAPFILEHEADER fileHeader;// 位图头文件BITMAPINFOHEADER infoHeader;// 位图信息头FILE* pFile = fopen(a, "rb");if (pFile == NULL){printf("打开文件失败\n");exit(-1);}// 读取头信息fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);   //读取文件头fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);   //读取信息头WORD bitCount = infoHeader.biBitCount;//色彩的位数if (bitCount == 16){exit(-1);}int Clr = 0;RGBQUAD *QUAD = NULL;if (bitCount < 16){Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;if (Clr>256)Clr = 0;}// 读取调色板int i = 0, j = 0;if (Clr > 0){QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);for (i = 0; i < Clr; i++){QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue);  //灰度图像三个都是y}}LONG pW = infoHeader.biWidth;     //图像数据的宽度LONG pH = infoHeader.biHeight;    //图像数据的高度int pSize = ((pW * bitCount)>>3)*pH;  //图像数据大小BYTE* P = (BYTE*)malloc(pSize);   //申请空间保存图像数据int LineSize = ((pW * bitCount)>> 3);  //行数据大小fread(P, pSize, 1, pFile);     //存入图像数据//先转grey图像if (Clr == 0){for (i = 0; i < pH; i++)//行{if (bitCount == 24){for (j = 0; j < pW*3; j = j + 3)// 列{int n = i*LineSize + j;P[n] = P[n + 1] = P[n + 2] = (BYTE)(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]); //分别是r,g,b分量}}}}    //拉普拉斯    int w; //和        for (i = 1; i < pH - 1; i++)//行{for (j = 3; j < (pW - 1) * 3; j = j + 3)// 列{//int n = i*LineSize + j;w=P[i*LineSize+j+3]+P[i*LineSize+j-3]+P[(i-1)*LineSize+j]+P[(i-1)*LineSize+j+3]+P[(i-1)*LineSize+j-3]+P[(i+1)*LineSize+j-3]+P[(i+1)*LineSize+j+3]+P[(i+1)*LineSize+j]-P[i*LineSize+j]*8;w*=0.1;//权重正负分类if(w>=0){                    //                    if(P[i*LineSize+j]+w>255)                        P[i*LineSize+j]=P[i*LineSize+j+1]=P[i*LineSize+j+2]=(BYTE)(255);                    else if(P[i*LineSize+j]+w<0)                        P[i*LineSize+j]=P[i*LineSize+j+1]=P[i*LineSize+j+2]=(BYTE)(0);                    else                        P[i*LineSize+j]=P[i*LineSize+j+1]=P[i*LineSize+j+2]=(BYTE)(P[i*LineSize+j]+w);}                else{                    if(P[i*LineSize+j]-w>255)                        P[i*LineSize+j]=P[i*LineSize+j+1]=P[i*LineSize+j+2]=(BYTE)(255);                    else if(P[i*LineSize+j]-w<0)                        P[i*LineSize+j]=P[i*LineSize+j+1]=P[i*LineSize+j+2]=(BYTE)(0);                    else                        P[i*LineSize+j]=P[i*LineSize+j+1]=P[i*LineSize+j+2]=(BYTE)(P[i*LineSize+j]-w);                }}}FILE* dFile = fopen(b, "wb");//创建目标文件fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile);   //写入文件头fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile);  //写入文件信息头if (QUAD){fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);}//写入图像数据fwrite(P, pSize, 1, dFile);fclose(dFile);if (QUAD){free(QUAD);QUAD = NULL;}if (P){free(P);P = NULL;}}int main(){imf("a.bmp", "imfa.bmp");    lie("a.bmp", "liea.bmp");return 0;}