C语言实现图像中值滤波与均值滤波
生活随笔
收集整理的這篇文章主要介紹了
C语言实现图像中值滤波与均值滤波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
中值濾波
中值濾波法是一種非線性平滑技術,它將每一像素點的灰度值設置為該點某鄰域窗口內的所有像素點灰度值的中值。中值濾波容易去除孤立點,線的噪聲同時保持圖象的邊緣,對椒鹽噪聲有較好的濾波效果;它能很好的去除二值噪聲,但對高斯噪聲無能為力。
實現代碼(3x3中值濾波):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma pack(1) //全緊湊模式typedef struct {unsigned char bfType[2];unsigned int bfSize;unsigned short bfReserved1;unsigned short bfReserved2;unsigned int bfOffBits;
}bitmapFileHeader;typedef struct {unsigned int biSize;unsigned int biWidth;unsigned int biHeight;unsigned short biPlanes;unsigned short biBitCount;unsigned int biCompression;unsigned int biSizeImage;unsigned int biXPixPerMeter;unsigned int biYPixPerMeter;unsigned int biClrUsed;unsigned int biClrImportant;
}bitmapInfoHeader;typedef struct{unsigned char rgbBlue;unsigned char rgbGreen;unsigned char rgbRed;unsigned char rgbReserved;}rgbQUAD;typedef struct{bitmapFileHeader bfHeader;bitmapInfoHeader biHeader;rgbQUAD palette[256];unsigned char *imgData;
}bmp;unsigned char median(unsigned char num[],int m){int i,j;unsigned char temp;for(i=0;i<m;i++){for(j=i+1;j<m;j++){if(num[j]<num[i]){temp=num[i];num[i]=num[j];num[j]=temp;}}}return num[m/2];
}int main(){FILE *fp;if((fp=fopen("d:\Temp\\test_gray.bmp","rb"))==NULL){perror("can not open file!");return -1;}//讀入彩色bmp圖像文件頭,信息頭和圖像數據bitmapFileHeader bfHeader;fread(&bfHeader,14,1,fp);bitmapInfoHeader biHeader;fread(&biHeader,40,1,fp);int imSize=biHeader.biSizeImage;int width=biHeader.biWidth;int height=biHeader.biHeight;int bitCount=biHeader.biBitCount;int lineBytes=(width*bitCount+31)/32*4;fseek(fp,bfHeader.bfOffBits,SEEK_SET);unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));fread(imageData,imSize*sizeof(unsigned char),1,fp); fclose(fp);bmp b;memcpy(&(b.bfHeader),&bfHeader,sizeof(bfHeader));memcpy(&(b.biHeader),&biHeader,sizeof(biHeader));b.imgData=(unsigned char*)malloc(sizeof(unsigned char)*imSize);memset(b.imgData,0,sizeof(unsigned char)*imSize);for(int i=0;i<256;i++){b.palette[i].rgbBlue=i;b.palette[i].rgbGreen=i;b.palette[i].rgbRed=i;}int i,j,k;unsigned char m=3,n=3;unsigned char *row=(unsigned char*)malloc(m);unsigned char *col=(unsigned char*)malloc(n);int x,y;for(i=0;i<height;i++){for(j=0;j<width;j++){if(j-(m-1)/2>=0&&j+m/2<width&&i-(n-1)/2>=0&&i+n/2<height){for(y=0;y<n;y++){for(x=0;x<m;x++){row[x]=imageData[lineBytes*(i-(n-1)/2+y)+j-(m-1)/2+x];}col[y]=median(row,m);}b.imgData[lineBytes*i+j]=median(col,n);}elsecontinue;//b.imgData[lineBytes*i+j]=imageData[lineBytes*i+j];}}char savePath[]="D:\Temp\\save_test.bmp";FILE *f_save=fopen(savePath,"wb");if(f_save==NULL){perror("can not open file!");return -2;}fwrite(&b.bfHeader,sizeof(bitmapFileHeader),1,f_save);fwrite(&b.biHeader,sizeof(bitmapInfoHeader),1,f_save);fwrite(&b.palette,1024,1,f_save);fwrite(b.imgData,sizeof(unsigned char)*b.biHeader.biSizeImage,1,f_save);fclose(f_save);free(imageData);free(b.imgData);getchar();return 0;
}
代碼效果:
椒鹽噪聲圖像:
中值濾波圖像:
均值濾波
均值濾波是典型的線性濾波算法,它是指在圖像上對目標像素給一個模板,該模板包括了其周圍的臨近像素,再用模板中的全體像素的平均值來代替原來像素值,適用于去除通過掃描得到的圖像中的顆粒噪聲、高斯噪聲。均值濾波本身存在著固有的缺陷,即它不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除噪聲點。
輔助函數:
//求mxn模板中灰值之和
int sum(unsigned char **num, int m, int n){int sum=0;int i,j;for(i=0;i<m;i++){for(j=0;j<n;j++){sum+=num[i][j];}}return sum;
}
實現代碼(3x3均值濾波):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma pack(1) //全緊湊模式typedef struct {unsigned char bfType[2];unsigned int bfSize;unsigned short bfReserved1;unsigned short bfReserved2;unsigned int bfOffBits;
}bitmapFileHeader;typedef struct {unsigned int biSize;unsigned int biWidth;unsigned int biHeight;unsigned short biPlanes;unsigned short biBitCount;unsigned int biCompression;unsigned int biSizeImage;unsigned int biXPixPerMeter;unsigned int biYPixPerMeter;unsigned int biClrUsed;unsigned int biClrImportant;
}bitmapInfoHeader;typedef struct{unsigned char rgbBlue;unsigned char rgbGreen;unsigned char rgbRed;unsigned char rgbReserved;}rgbQUAD;typedef struct{bitmapFileHeader bfHeader;bitmapInfoHeader biHeader;rgbQUAD palette[256];unsigned char *imgData;
}bmp;int sum(unsigned char **num, int m, int n){int sum=0;int i,j;for(i=0;i<m;i++){for(j=0;j<n;j++){sum+=num[i][j];}}return sum;
}int main(){FILE *fp;if((fp=fopen("d:\Temp\\test_gray.bmp","rb"))==NULL){perror("can not open file!");return -1;}//讀入彩色bmp圖像文件頭,信息頭和圖像數據bitmapFileHeader bfHeader;fread(&bfHeader,14,1,fp);bitmapInfoHeader biHeader;fread(&biHeader,40,1,fp);int imSize=biHeader.biSizeImage;int width=biHeader.biWidth;int height=biHeader.biHeight;int bitCount=biHeader.biBitCount;int lineBytes=(width*bitCount+31)/32*4;fseek(fp,bfHeader.bfOffBits,SEEK_SET);unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));fread(imageData,imSize*sizeof(unsigned char),1,fp); fclose(fp);bmp b;memcpy(&(b.bfHeader),&bfHeader,sizeof(bfHeader));memcpy(&(b.biHeader),&biHeader,sizeof(biHeader));b.imgData=(unsigned char*)malloc(sizeof(unsigned char)*imSize);memset(b.imgData,0,sizeof(unsigned char)*imSize);for(int i=0;i<256;i++){b.palette[i].rgbBlue=i;b.palette[i].rgbGreen=i;b.palette[i].rgbRed=i;}int i,j,k;unsigned char m=3,n=3;unsigned char **data=(unsigned char**)malloc(n*sizeof(unsigned char*));for(i=0;i<n;i++)data[i]=(unsigned char*)malloc(m);int x,y;for(i=0;i<height;i++){for(j=0;j<width;j++){if(j-(m-1)/2>=0&&j+m/2<width&&i-(n-1)/2>=0&&i+n/2<height){for(y=0;y<n;y++){for(x=0;x<m;x++){data[y][x]=imageData[lineBytes*(i-(n-1)/2+y)+j-(m-1)/2+x];}}b.imgData[lineBytes*i+j]=sum(data,m,n)/(m*n);}elsecontinue;//b.imgData[lineBytes*i+j]=imageData[lineBytes*i+j];}}char savePath[]="D:\Temp\\save_test.bmp";FILE *f_save=fopen(savePath,"wb");if(f_save==NULL){perror("can not open file!");return -2;}fwrite(&b.bfHeader,sizeof(bitmapFileHeader),1,f_save);fwrite(&b.biHeader,sizeof(bitmapInfoHeader),1,f_save);fwrite(&b.palette,1024,1,f_save);fwrite(b.imgData,sizeof(unsigned char)*b.biHeader.biSizeImage,1,f_save);fclose(f_save);free(imageData);free(b.imgData);getchar();return 0;
}
代碼效果:
高斯噪聲圖像:
均值濾波圖像:
總結
以上是生活随笔為你收集整理的C语言实现图像中值滤波与均值滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言实现将彩色bmp图像转化为灰图、灰
- 下一篇: C语言实现bmp图像锐化