Hello Mat

 找回密码
 立即注册
查看: 3451|回复: 0

排序滤波

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-3-19 21:18:29 | 显示全部楼层 |阅读模式
     排序滤波是一种非线性平滑滤波器,排序滤波能够保护图像边缘,并且也能很好的实现滤波功能。MATLAB自带图像工具箱提供了排序滤波函数ordfilt2(),也方便了用户的调用。
    排序滤波的定义:把像素点周围邻域内的所有像素值按从大到小的顺序排列,然后选择某一特定位置的像素值作为滤波像素值。中值滤波就是一种典型的排序滤波,它将中间值作为像素点的灰度值(若邻域窗口中有偶数个像素点,则取两个中间值的平均值作为滤波值)。
  1. function A = ord_filt2(im,order,domain)

  2. if ~isa(im,'double')   % 是否为double类型
  3.     A = double(im)/255;
  4. end

  5. domainSize = size(domain);  % 维数
  6. center = floor((domainSize + 1) / 2);
  7. [r,c] = find(domain);
  8. r = r - center(1);  % 以中心分开
  9. c = c - center(2);  % 以中心分开
  10. padSize = max(max(abs(r)), max(abs(c))); % 求距离中心点最大长度
  11. A = padarray(A, padSize * [1 1], 0, 'both');  % 周围全部用0填充,向左右增2列0,上下增两行0
  12. % A =
  13. %      1     3     4
  14. %      2     3     4
  15. %      3     4     5
  16. % B = padarray(A, 2 * [1 1], 0, 'both')
  17. %      0     0     0     0     0     0     0
  18. %      0     0     0     0     0     0     0
  19. %      0     0     1     3     4     0     0
  20. %      0     0     2     3     4     0     0
  21. %      0     0     3     4     5     0     0
  22. %      0     0     0     0     0     0     0
  23. %      0     0     0     0     0     0     0

  24. Ma = size(A,1);  % 行
  25. offsets = c*Ma + r;
  26. % 确保offsets有效
  27. if ~isreal(offsets) || any(floor(offsets) ~= offsets) || any(~isfinite(offsets))
  28.     error(message('offsets无效'))
  29. end

  30. % 排序
  31.   B = ord_filt2(A, order, offsets);
  32. end
复制代码

im1 = ordfilt2(im, 1, true(5));  % 应用排序滤波


算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-27 23:02 , Processed in 0.198473 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表