Matlab之山东大学数字图像处理实验三(图像滤波)

本文详细介绍了在Matlab中如何实现高斯滤波和快速均值滤波,包括算法原理、代码实现及优化。通过一维高斯滤波加速二维高斯滤波,以及利用积分图实现快速均值滤波,显著提高了处理效率。同时,文章展示了滤波前后的图像对比,分析了边缘处理的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文属于原创,转载请注明出处。

实验3.1:高斯滤波
实现图像的高斯滤波:
通过调整高斯函数的标准差(sigma)来控制平滑程度;
void Gaussian(const MyImage &input, MyImage &output, double sigma);
滤波窗口大小取为[6sigma-1]/22+1,[.]表示取整;
利用二维高斯函数的行列可分离性进行加速;
先对每行进行一维高斯滤波,再对结果的每列进行同样的一维高斯滤波;

实验3.2 快速均值滤波
实现图像的均值滤波
滤波窗口大小通过参数来指定:
void MeanFilter(const MyImage &input, MyImage &output, int window_size);
采用积分图进行加速,实现与滤波窗口大小无关的效率;

实验3.1:高斯滤波
高斯滤波

  • 空间滤波=图像卷积
  • 高斯滤波=以高斯函数为卷积核的图像卷积
  • 在这里插入图片描述
    二维高斯函数的公式如下所示:
    在这里插入图片描述
    根据题目要求,要根据输入的sigma创建二维高斯函数的卷积核,其中窗口大小的计算公式为:[6sigma-1]/22+1
    一开始我并没有注意到题目要求中的利用二维高斯函数的行列可分离性进行加速这一要求,先按照着自己的思路,就是先生成二维高斯函数的卷积核来进行高斯滤波:

生成高斯分布的卷积核的函数如下所示:

function[ kernal ] = getGaussian(sigma)
%用于生成符合高斯分布的卷积核
%   input_img为输入图像,sigma为标准差
%卷积核
n = round(6*sigma-1)/2*2+1;
%归一化的总值
h_sum = 0.0;
%卷积核的值
temp = 0.0;
%n*n的卷积核
kernal = zeros(n);
%卷积核的中心坐标
x = ceil(n/2);
y = ceil(n/2);
%display(x);
%根据高斯公式生成卷积核
for i = 1:n
    for j = 1:n
        distance = (i-x)^2+(j-y)^2;
        temp = exp((-distance)/2*sigma^2)/(2*pi*sigma^2);
        h_sum = h_sum + temp;
        kernal(i,j) = temp; 
    end
end
%display(kernal);
%归一化之后的卷积核
for i = 1:n
    for j = 1:n
        kernal(i,j) = kernal(i,j)/h_sum;
    end
end
%display(kernal);
end

其中要注意的就是要对卷积核进行归一化。

然后就是使用二维高斯滤波的函数:

function gaussian( input_img,sigma )
%   使用二维高斯滤波,效率低,耗时大概是40多倍
%   input_img是输入图像,output_img是输出图像,sigma是标准差
%计算运行时间
close;
tic;
%获取高斯滤波
kernal = getGaussian(sigma);
%获取高斯滤波的长宽
[kx,ky,dimension] = size(kernal);
%获取高斯滤波除中心点外的边界长度
k = floor(kx/2);
%获取输入图像的索引图
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值