1、作业:对 lean.raw 文件,采用中值滤波和均值滤波,完成图象去噪 中值滤波: /* * * 函数名称: * MedianFilter() * * 参数 : * LPSTR lpDIBBits - 指向源 DIB 图像指针 * LONG lWidth - 源图像宽度(象素数) * LONG lHeight - 源图像高度(象素数) * int iFilterH - 滤波器的高度 * int iFilterW - 滤波器的宽度 * int iFilterMX - 滤波器的中心元素 X 坐标 * int iFilterMY - 滤波器的中心元素 Y 坐标 * * 返回值 : * BOOL -
2、成功返回 TRUE,否则返回 FALSE。 * * 说明 : * 该函数对 DIB 图像进行中值滤波。 * */ BOOL WINAPI MedianFilter(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, int iFilterH, int iFilterW, int iFilterMX, int iFilterMY) / 指向源图像的指针 unsigned char* lpSrc; / 指向要复制区域的指针 unsigned char* lpDst; / 指向复制图像的指针 LPSTR lpNewDIBBits; HLOCAL hNewDIBBi
3、ts; / 指向滤波器数组的指针 unsigned char * aValue; HLOCAL hArray; / 循环变量 LONG i; LONG j; LONG k; LONG l; / 图像每行的字节数 LONG lLineBytes; / 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); / 暂时分配内存,以保存新图像 hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight); / 判断是否内存分配失败 if (hNewDIBBits = NULL) / 分配内存失败 return FALS
4、E; / 锁定内存 lpNewDIBBits = (char * )LocalLock(hNewDIBBits); / 初始化图像为原始图像 memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * lHeight); / 暂时分配内存,以保存滤波器数组 hArray = LocalAlloc(LHND, iFilterH * iFilterW); / 判断是否内存分配失败 if (hArray = NULL) / 释放内存 LocalUnlock(hNewDIBBits); LocalFree(hNewDIBBits); / 分配内存失败return FALS
5、E; / 锁定内存 aValue = (unsigned char * )LocalLock(hArray); / 开始中值滤波 / 行(除去边缘几行) for(i = iFilterMY; i bArrayi + 1) / 互换 bTemp = bArrayi; bArrayi = bArrayi + 1; bArrayi + 1 = bTemp; / 计算中值 if (iFilterLen else / 数组有偶数个元素,返回中间两个元素平均值 bTemp = (bArrayiFilterLen / 2 + bArrayiFilterLen / 2 + 1) / 2; / 返回中值 ret
6、urn bTemp; / 9 / 中值滤波算法处理 10 / 11 / 原始图片 12 / 是否是彩色位图 13 / 过滤半径 14 public Bitmap ColorfulBitmapMedianFilterFunction(Bitmap srcBmp, int windowRadius,bool IsColorfulBitmap) 15 16 if (windowRadius 72 / 对矩阵 M 进行中值滤波 73 / 74 / 矩阵 M 75 / 过滤半径 76 / 结果矩阵 77 private byte, MedianFilterFunction(byte, m, int wi
7、ndowRadius) 78 79 int width = m.GetLength(0); 80 int height = m.GetLength(1); 81 82 byte, lightArray = new bytewidth, height; 83 84 /开始滤波 85 for (int i = 0; i width - 1) rectWindow.Width = width - 1 -rectWindow.Left; 94 if (rectWindow.Bottom height - 1) rectWindow.Height = height - 1 -rectWindow.Top
8、; 95 /将窗口中的颜色取到列表中 96 List windowPixelColorList = new List(); 97 for (int oi = rectWindow.Left; oi = rectWindow.Right - 1; oi+) 98 99 for (int oj = rectWindow.Top; oj = rectWindow.Bottom - 1; oj+) 100 101 windowPixelColorList.Add(moi, oj); 102 103 104 /排序 105 windowPixelColorList.Sort(); 106 /取中值 10
9、7 byte middleValue = 0; 108 if (windowRadius * windowRadius) % 2 = 0) 109 110 /如果是偶数 111 middleValue = Convert.ToByte(windowPixelColorListwindowPixelColorList.Count / 2 + windowPixelColorListwindowPixelColorList.Count / 2 - 1) / 2); 112 113 else 114 115 /如果是奇数 116 middleValue = windowPixelColorList(
10、windowPixelColorList.Count - 1) / 2;117 118 /设置为中值 119 lightArrayi, j = middleValue;120 121 122 return lightArray; 123 MATLAB 算法实现的方法一个均值滤波的例子: I=imread(cameraman.tif);%读入图像 J=imnoise(I,salt %给图像添加椒盐噪声 K=imnoise(I,gaussian,0,0.005);%给图像添加均值为 0,方差为 0.005 的高斯噪声subplot(231),imshow(I) title(原图像) subplot
11、(232),imshow(J) title(添加椒盐噪声图像) subplot(233),imshow(K) title(添加高斯噪声图像) subplot(234),imshow(I) title(原图像) K1=filter2(fspecial(average,3),J)/255;%使用 33 模板均值滤波 subplot(235),imshow(K1)title(3*3 椒盐噪声均值滤波 ) K2=filter2(fspecial(average,3),K)/255;%使用 33 模板均值滤波 subplot(236),imshow(K2)title(3*3 高斯噪声均值滤波 )一个中值
12、滤波的例子: I=imread(cameraman.tif);%读入图像 J=imnoise(I,salt %给图像添加椒盐噪声 K=imnoise(I,gaussian,0,0.005);%给图像添加均值为 0,方差为 0.005 的高斯噪声 subplot(231),imshow(I) title(原图像) subplot(232),imshow(J) title(添加椒盐噪声图像) subplot(233),imshow(K) title(添加高斯噪声图像) subplot(234),imshow(I) title(原图像) K1=medfilt2(J,3,3);%使用 33 模板中值滤
13、波 subplot(235),imshow(K1) title(3*3 椒盐噪声中值滤波) K2=medfilt2(K,3,3);%使用 33 模板中值滤波 subplot(236),imshow(K2) title(3*3 高斯噪声中值滤波)3、均值滤波与中值滤波的对比 I=imread(cameraman.tif);%读入图像 J=imnoise(I,salt %给图像添加椒盐噪声 K=imnoise(I,gaussian,0,0.005);%给图像添加均值为 0,方差为 0.005 的高斯噪声subplot(331),imshow(I) title(原图像) subplot(332),i
14、mshow(J) title(添加椒盐噪声图像) subplot(333),imshow(K) title(添加高斯噪声图像) subplot(334),imshow(I) title(原图像) K1=filter2(fspecial(average,3),J)/255;%使用 33 模板均值滤波 subplot(335),imshow(K1)title(3*3 椒盐噪声均值滤波 ) K2=filter2(fspecial(average,3),K)/255;%使用 33 模板均值滤波 subplot(336),imshow(K2)title(3*3 高斯噪声均值滤波 ) subplot(337),imshow(I) title(原图像) K3=medfilt2(J,3,3);%使用 33 模板中值滤波 subplot(338),imshow(K3) title(3*3 椒盐噪声中值滤波) K4=medfilt2(K,3,3);%使用 33 模板中值滤波 subplot(339),imshow(K4) title(3*3 高斯噪声中值滤波)