在实时图像采集中, 不可避免的会引入噪声, 尤其是干扰噪声和椒盐噪声, 噪声的存在严重影响边缘检测的效果, 中值滤波是一种基于排序统计理论的非线性平滑计数, 能有效平滑噪声, 且能有效保护图像的边缘信息, 所以被广泛用于数字图像处理的边缘提取, 其基本原理是把数字图像或数字序列中的一点的值用该点邻域内所有的点排序后的中值来代替.
中值滤波对椒盐噪声有良好的滤除作用, 特别是在滤除噪声的同时, 能够保护信号的边缘, 使之不被模糊. 这些优良特性是线性滤波方法所不具有的. 而且, 中值滤波的算法比较简单, 也易于用硬件实现. 这篇我们先用 MATLAB 来实现中值滤波.
中值滤波方法是, 对待处理的当前像素, 选择一个模板 3x3,5x5 或其他, 这里选择 3x3 矩阵, 该模板为其邻近的若干个像素组成, 对模板的像素由小到大进行排序, 再用模板的中值来替代原像素的值的方法.
排序算法示意图
当我们使用 3x3 窗口后获取领域中的 9 个像素, 就需要对 9 个像素值进行排序, 为了提高排序效率, 排序算法思想如图所示.
(1)对窗内的每行像素按降序排序, 得到最大值, 中间值和最小值.
(2)把三行的最小值即第三列相比较, 取其中的最大值.
(3)把三行的最大值即第一列相比较, 取其中的最小值.
(4)把三行的中间值即第二列相比较, 再取一次中间值.
(5)把前面的到的三个值再做一次排序, 获得的中值即该窗口的中值.
sort 排序函数
sort(A)若 A 可以使矩阵或行列向量, 默认都是对 A 进行升序排列.
sort(A)是默认的升序, 而 sort(A,'descend')是降序排序.
sort(A)若 A 是矩阵, 默认对 A 的各列进行升序排列
sort(A,dim)
dim=1 时相当于 sort(A)
dim=2 时表示对矩阵 A 中的各行元素升序排列
sort(A, dim, 'descend')则对矩阵的每行进行降序排列
MATLAB 代码实现
- Median Filter
- %RGB_YCbCr
- clc;
- clear all;
- close all;
- RGB_data = imread('lena.jpg');%
- R_data = RGB_data(:,:,1);
- G_data = RGB_data(:,:,2);
- B_data = RGB_data(:,:,3);
- %imshow(RGB_data);
- [ROW,COL, DIM] = size(RGB_data);
- Y_data = zeros(ROW,COL);
- Cb_data = zeros(ROW,COL);
- Cr_data = zeros(ROW,COL);
- Gray_data = RGB_data;
- for r = 1:ROW
- for c = 1:COL
- Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
- Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
- Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
- end
- end
- Gray_data(:,:,1)=Y_data;
- Gray_data(:,:,2)=Y_data;
- Gray_data(:,:,3)=Y_data;
- figure;
- imshow(Gray_data);
- %Median Filter
- imgn = imnoise(Gray_data,'salt & pepper',0.02);
- figure;
- imshow(imgn);
- for r = 2:ROW-1
- for c = 2:COL-1
- median3x3 =[imgn(r-1,c-1) imgn(r-1,c) imgn(r-1,c+1)
- imgn(r,c-1) imgn(r,c) imgn(r,c+1)
- imgn(r+1,c-1) imgn(r+1,c) imgn(r+1,c+1)];
- sort1 = sort(median3x3, 2, 'descend');
- sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');
- sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');
- sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');
- mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');
- Median_Img(r,c) = mid_num(2);
- end
- end
- figure;
- imshow(Median_Img);
处理前后比较
Gray lena
加入椒盐噪声后的 lena
对加入椒盐噪声后进行中值滤波的 lena
可以看出, 中值滤波对椒盐噪声的滤除效果真是非常的好. 光看我处理后图图片可能看不出太明显对比, 有兴趣的朋友可以自己尝试下. 这里 MTALAB 的排序部分基本是是按照排序算法一步步来的, 完全符合 FPGA 实现的思路, 所以说掌握算法的基础原理和 Verilog 自己就可以尝试用 FPGA 实现了.
这里需要强调的一下是这样的滤波对图像的边缘没有进行处理, 这是因为我们在求取均值或中值时, 生成的 3x3 矩阵, 第一行的像素并没有处理, 同样的图像最外层边缘的像素都没有处理, 不过这个对整体影响不大, 所以后面再弄, 下一篇来实现 Sobel 边缘检测.
来源: https://www.cnblogs.com/ninghechuan/p/9527915.html