排序滤波是一种非线性平滑滤波器,排序滤波能够保护图像边缘,并且也能很好的实现滤波功能。MATLAB自带图像工具箱提供了排序滤波函数ordfilt2(),也方便了用户的调用。 排序滤波的定义:把像素点周围邻域内的所有像素值按从大到小的顺序排列,然后选择某一特定位置的像素值作为滤波像素值。中值滤波就是一种典型的排序滤波,它将中间值作为像素点的灰度值(若邻域窗口中有偶数个像素点,则取两个中间值的平均值作为滤波值)。 - function A = ord_filt2(im,order,domain)
- if ~isa(im,'double') % 是否为double类型
- A = double(im)/255;
- end
- domainSize = size(domain); % 维数
- center = floor((domainSize + 1) / 2);
- [r,c] = find(domain);
- r = r - center(1); % 以中心分开
- c = c - center(2); % 以中心分开
- padSize = max(max(abs(r)), max(abs(c))); % 求距离中心点最大长度
- A = padarray(A, padSize * [1 1], 0, 'both'); % 周围全部用0填充,向左右增2列0,上下增两行0
- % A =
- % 1 3 4
- % 2 3 4
- % 3 4 5
- % B = padarray(A, 2 * [1 1], 0, 'both')
- % 0 0 0 0 0 0 0
- % 0 0 0 0 0 0 0
- % 0 0 1 3 4 0 0
- % 0 0 2 3 4 0 0
- % 0 0 3 4 5 0 0
- % 0 0 0 0 0 0 0
- % 0 0 0 0 0 0 0
- Ma = size(A,1); % 行
- offsets = c*Ma + r;
- % 确保offsets有效
- if ~isreal(offsets) || any(floor(offsets) ~= offsets) || any(~isfinite(offsets))
- error(message('offsets无效'))
- end
- % 排序
- B = ord_filt2(A, order, offsets);
- end
复制代码
im1 = ordfilt2(im, 1, true(5)); % 应用排序滤波
|