1、方法:通过从图像中的某个采样窗口取出奇数个数据进行排序,用排序后的中值取代要处理的数据。3、复合拉普拉斯掩模:从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮,因为图像中的边缘就是那些灰度发生跳变的区域,所以拉普拉斯锐化模板在边缘检测中很有用。4、Sobel算子:主要用于作边缘检测,Sobel算子对于像素的位置影响做了加权,可以降低边缘模糊程度。四、运行结果原图:结果图:五、课程设计总结这次通过c语言编写程序对图像进行滤波,去噪滤波、空域增强,了解了图像处理的原理和过程。其中,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图
2、像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点;中值滤波对消除椒盐噪声非常有效,在图像处理中,常用于保护边缘信息,是经典的平滑噪声的方法;拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域Sobel算子则用于边缘检测。通过努力顺利完成了这次课程设计,学会了用c语言进行图像处理,在过程中遇到问题再解决使我成长了不少,收获了很多。六、源程序代码/BMPRW.H#ifndef BMPRW_H#define BMPRW_Htypedef struct unsigned long bfSize; unsigned short bfReserv
3、ed1; unsigned short bfReserved2; unsigned long bfOffBits;ClBitMapFileHeader; unsigned long biSize; long biWidth; long biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned long biCompression; unsigned long biSizeImage; long biXPelsPerMeter; long biYPelsPerMeter; unsigned long biClrU
4、sed; unsigned long biClrImportant;ClBitMapInfoHeader; unsigned char rgbBlue; unsigned char rgbGreen; unsigned char rgbRed; unsigned char rgbReserved;ClRgbQuad; int width; int height; int channels; unsigned char * imageData;ClImage;ClImage *clLoadImage(char * path);bool clSaveImage(char * path,ClImag
5、e * bmpImg);#endif/pretreatment.cpp#includeint main() long bmpwidth,bmpheight; FILE *fp; fp=fopen(FIVEANGL.bmp,rb); fseek(fp,18L,SEEK_SET); fread(&bmpwidth,4,1,fp);bmpheight,4,1,fp); fclose(fp); printf(n%s width is %ld,height is %ld,bmpwidth,bmpheight); getchar(); return 0;/multimedia.cppstdlib.h#in
6、cludeBMPRW.hClImage * clLoadImage(char * path) ClImage * bmpImg; FILE * pFile; unsigned short fileType; ClBitMapFileHeader bmpFileHeader; ClBitMapInfoHeader bmpInfoHeader; int channels=1; int width=0; int height=0; int step=0; int offset=0; unsigned char pixVal; ClRgbQuad * quad; int i,j,k; bmpImg=(
7、ClImage *)malloc(sizeof(ClImage); pFile=fopen(path, if(!pFile) free(bmpImg); return NULL; fileType,sizeof(unsigned short),1,pFile); if(fileType=0x4D42) fread(&bmpFileHeader,sizeof(ClBitMapFileHeader),1,pFile);bmpInfoHeader,sizeof(ClBitMapInfoHeader),1,pFile); if(bmpInfoHeader.biBitCount=8) printf(该文
8、件有调色板,即该位图为非真彩色nn channels=1; width=bmpInfoHeader.biWidth; height=bmpInfoHeader.biHeight; offset=(channels*width)%4; if(offset!=0) offset=4-offset; bmpImg-width=width;height=height;channels=1;imageData=(unsigned char *)malloc(sizeof(unsigned char)*width*height); step=channels*width; quad=(ClRgbQuad
9、*)malloc(sizeof(ClRgbQuad)*256); fread(quad,sizeof(ClRgbQuad),256,pFile); free(quad); for(i=0;iheight;i+) for(j=0;jimageData(height-1-i)*step+j=pixVal; if(offset! for(j=0;offset; fread(& else if(bmpInfoHeader.biBitCount=24)该位图为真彩色nn channels=3;channels=3;imageData=(unsigned char *)malloc(sizeof(unsi
10、gned char)*width*3*height); for(k=0;kimageData(height-1-i)*step+j*3+k=pixVal; return bmpImg;bool clSaveImage(char * path,ClImage *bmpImg) FILE *pFile; int step; int offset; unsigned char pixVal=0; int i,j;wb return false; fileType =0x4D42; fwrite(& if(bmpImg-channels=3) step=bmpImg-channels*bmpImg-
11、offset=step%4; if(offset!=4) step+=4-offset; bmpFileHeader.bfSize=bmpImg-height*step+54; bmpFileHeader.bfReserved1=0; bmpFileHeader.bfReserved2=0; bmpFileHeader.bfOffBits=54; fwrite(& bmpInfoHeader.biSize=40; bmpInfoHeader.biWidth=bmpImg- bmpInfoHeader.biHeight=bmpImg- bmpInfoHeader.biPlanes=1; bmpI
12、nfoHeader.biBitCount=24; bmpInfoHeader.biCompression=0; bmpInfoHeader.biSizeImage=bmpImg-height*step; bmpInfoHeader.biXPelsPerMeter=0; bmpInfoHeader.biYPelsPerMeter=0; bmpInfoHeader.biClrUsed=0; bmpInfoHeader.biClrImportant=0; for(i=bmpImg-height-1;i-1;i-) for(j=0;bmpImg- pixVal=bmpImg-imageDatai*bm
13、pImg-width*3+j*3; fwrite(&width*3+j*3+1;width*3+j*3+2; pixVal=0; fwrite(& else if(bmpImg-channels=1) bmpFileHeader.bfSize=54+256*4+bmpImg- bmpFileHeader.bfOffBits=54+256*4; bmpInfoHeader.biBitCount=8; bmpInfoHeader.biClrUsed=256; bmpInfoHeader.biClrImportant=256; quad=(ClRgbQuad *)malloc(sizeof(ClRg
14、bQuad)*256); for(i=0;256; quadi.rgbBlue=i; quadi.rgbGreen=i; quadi.rgbRed=i; quadi.rgbReserved=0; fwrite(quad,sizeof(ClRgbQuad),256,pFile); free(quad);width+j; fclose(pFile); return true;void Junzhi(ClImage *img,int h,int w) int a500500=0; for(i=0;h; for(j=0;w; aij=img-imageDatai*w*3+j*3; for(i=1;h-
15、1; for(j=1;w-1; for(k=0; img-imageData(i+k)*w*3+j*3+k=(ai-1j-1+ai-1j+ai-1j+1+aij-1+aij+aij+1+ai+1j-1+ai+1j+ai+1j+1)/9;模板一n bool flag=clSaveImage(D:material1 电路图.bmp,img); if(flag) printf(save ok.nn for(j=2;imageData(i+k)*w*3+j*3+k=(ai-1j-1+2*ai-1j+ai-1j+1+2*aij-1+4*aij+2*aij+1+ai+1j-1+2*ai+1j+ai+1j+
16、1)/16;模板二n bool flag0=clSaveImage(material2 电路图.bmp if(flag0)void Zhongzhi(ClImage * img1,int h,int w) int b9=0,a500500=0; int i,j,k,m,n,temp; aij=img1- b0=ai-1j-1; b1=ai-1j; b2=ai-1j+1; b3=aij-1; b4=aij; b5=aij+1; b6=ai+1j-1; b7=ai+1j; b8=ai+1j+1; for(m=0;m8;m+) for(n=m+1;nbn) temp=bm; bm=bn; bn=temp; img1-imageData(i+k)*w*3+j*3+k=b4;中值n bool flag1=clSaveImage(material3 电路板.bmp,img1); if(flag1)void Sobel(ClImage * img2,int h,int w) int a550470=0; aij=img2-