[关闭]
@shaobaobaoer 2018-10-27T15:28:39.000000Z 字数 1401 阅读 969

《数字图像处理》实验三 中值滤波

数字图像处理 matlab 中值滤波


************************************************************************
> File Name: 《数字图像处理》实验三 中值滤波
> Author: 罗天涵
> Student-Id: 16121141
> Mail: luotianhan@126.com
************************************************************************

实验要求

编写程序,对图象进行中值滤波,并与实现相同功能的 Matlab 函数进行运算速度比较.

实验准备

中值滤波函数 medfilt2

函数用法

B = medfilt2(A,[m n])

中值滤波的计算过程

中值滤波是将周围像素和中心像素排序以后,取中值。可以看如下的例子

此处输入图片的描述

对于元素 125,其周围元素为

  1. 124 126 126
  2. 120 150 125
  3. 115 119 123

将内容排序得到长度为9的行向量。

  1. 115,119,120,123,124,125,126,127,150

则中间元素a[4]为124。此时将 150 替换为 124。对于外部的框框,需要用0填充。然后计算中值。对于 上述矩阵通过中值滤波后得到的内容是

  1. 0 124 0
  2. 119 124 123
  3. 0 119 0

MATLAB 代码实现

由于matlab 不是很会用。所以先记录一些小技巧。

矩阵扩展

在中值滤波中,需要扩展外圈。一番学习之后,我写了个这样的padding fuction。

我们用 算法的角度思考一下。这个矩阵向上与向下扩展的数目应该是

  1. padding(1,:) = zeros([1 2+w])
  2. for i = 2: 3+1
  3. padding(i,:) = [zeros(1) test(i-1,:) zeros(1)]
  4. end
  5. padding(3+2,:) = zeros([1 2+w])

更加复杂的矩阵扩展

算法实现

实验数据

正确性校验

  1. test =
  2. 124 126 126
  3. 120 150 125
  4. 115 119 123
  5. >> zhongzhi(test)
  6. ans =
  7. 0 124 0
  8. 119 124 123
  9. 0 119 0
  10. >> medfilt2(test)
  11. ans =
  12. 0 124 0
  13. 119 124 123
  14. 0 119 0
  15. % 读取一张图片
  16. >> test2 = imread('proxy.png');
  17. >> test2 = rgb2gray(test2);
  18. >> test2_system = medfilt2(test2);
  19. >> test2_myfunc = zhongzhi(test2);
  20. >> all(test2_myfunc == test2_system_double);
  21. >> 可以发现数据都是1,验证成功

时间校验

matlab 推荐的程序时间运行函数如下所示

  1. >> tic
  2. %代码块
  3. toc
  4. %disp(['运行时间: ',num2str(toc)]);

事实证明,自己写的函数运行速度感人.
test 是一张大小为 2509KB 的rgb PNG 图片。转化成灰度图像后其他大小为 2967 * 3968 的矩阵

  1. >> size(test)
  2. ans =
  3. 2976 3968
  4. >> tic
  5. medfilt2(test);
  6. toc
  7. disp(['运行时间: ',num2str(toc)]);
  8. 运行时间: 0.14249
  9. >> tic
  10. zhongzhi(test);
  11. toc
  12. disp(['运行时间: ',num2str(toc)]);
  13. 运行时间: 99.2464
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注