Hello Mat

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

自适应中值滤波

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2017-3-19 21:20:49 | 显示全部楼层 |阅读模式
  1. function Z = adapmedian_filter(X, Smax)
  2. % 函数对输入图像进行邻域窗口大小可变的自适应中值滤波
  3. %  函数输入
  4. %        X:输人二维图像矩阵
  5. %        smax:中值滤波邻域窗口的最大值,必须是大于1的奇数
  6. %  函数输出
  7. %        Z:输出图像矩阵,数据类型与输人相同
  8. % smax必须是大于1的奇数
  9. if (Smax<=1) | (Smax/2 == round(Smax/2)) | (Smax ~= round(Smax))
  10.     error('smax必须是大于1的奇数')
  11. end
  12. if size(X,3)~=1
  13.     error('图像应该为2维矩阵')
  14. end
  15. if ~isa(X,'double')
  16.     X = double(X)/255;  % 数据类型
  17. end
  18. [M, N] = size(X);
  19. % 初始化
  20. Z = X;  Z(:)=0;
  21. LevelA = false(size(X));   % 初始化,同X的 全0逻辑矩阵
  22. % 开始滤波
  23. for k=3:2:Smax
  24.     Zmin = ordfilt2(X,1,ones(k,k),'symmetric' );    % 排序滤波
  25.     Zmax = ordfilt2(X,k*k,ones(k,k), 'symmetric');  % 排序滤波
  26.     Zmed = medfilt2(X,[k,k], 'symmetric');         % 中值滤波
  27.     % 判断是否进入B层
  28.     LevelB = (Zmed>Zmin)&(Zmax>Zmed)&LevelA;  % 判断A层
  29.     ZB = (X > Zmin) & (Zmax > X);
  30.     outputZxy = LevelB & ZB;     % 交运算
  31.     outputZmed = LevelB & ~ZB;  % 交运算
  32.     Z(outputZxy) = X(outputZxy);            % 赋值
  33.     Z(outputZmed) = Zmed(outputZmed);     % 赋值
  34.     LevelA = LevelA  | LevelB; % 非运算
  35.     if all(LevelA(:))
  36.         break;   % 停止
  37.     end
  38. end
  39. Z(~LevelA) = Zmed(~LevelA); % 赋值
  40. Z = im2uint8(Z);  % 类型转化
  41. end
复制代码
im1 = adapmedian_filter( im,3 );  % 应用自适应中值滤波

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 23:21 , Processed in 0.199385 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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