本文属于原创,转载请注明出处。
实验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);
%获取输入图像的索引图