Matlab-代码实现图像平滑去噪


图像平滑的主要目的是消除噪声模糊图像去除小的细节弥合目标间的缝隙。从信号频谱角度来看,信号缓满变化的部分在频域表现为低频,而迅速变化的部分表现为高频,如图像的边缘、跳跃以及噪声等灰度变化剧烈的部分代表图像的高频分量,而灰度变化缓慢的区域代表图像的低频分量。因此,可以在空间域或频率域通过低通滤波来减弱或消除高频分量而不影响低频分量以实现图像平滑。

一、图像噪声

噪声可以理解为“妨碍人们感觉器官对所接收的信源信息理解的因素”。图像在获取、存储、处理和传输过程中,会受到电气系统和外界干扰而存在一定程度的噪声。图像噪声使得图像模糊,甚至淹没图像特征,造成分析困难。噪声也可以理解为不可预测的随机误差,可以看作是随机过程,因而可以借用概率论与数理统计的方法来描述,如概率分布函数、概率密度函数、均值、方差和相关函数等。

噪声可以按照如下方式分类:

(1)按照产生原因,图像噪声可分为外部噪声内部噪声。由外部干扰引起的噪声为外部噪声,如外部电气设备产生的电磁波干扰、天体放电产生的脉冲干扰等。由系统电气设备内部引起的噪声为内部噪声,如内部电路的相互干扰。
(2)按照统计特性,图像噪声可分为平稳噪声非平稳噪声。统计特性不随时间变化的噪声称为平稳噪声,统计特性随时间变化的噪声称为非平稳噪声。
(3)按照蝠度分布,图像噪声可以分为高斯噪声椒盐噪声等。幅度分布服从高斯分布的噪声称为高斯噪声。椒盐噪声也称为脉冲噪声,由随机分布的白点(盐噪声)和黑点(胡椒噪声)组成。
(4)按照噪声频谱,图像噪声可以分为白噪声1/f噪声等。功率谱密度在频域内均匀分布的噪声称为白噪声。功率谱密度与频率成反比的噪声称为1/f噪声或粉红噪声。
(5)按噪声和信号之间的关系,图像噪声可分为加性噪声乘性噪声。假定信号为S(t),噪声为n(t),如果混合叠加波形是S(t)+n(t)形式,则称其为加性噪声;如果叠加波形为S(t)[1+n(t)]形式,则称其为乘性噪声。加性噪声与信号强度不相关,而乘性噪声则与信号强度有关。为了分析处理方便,往往将乘性噪声近似认为加性噪声,而且总是假定信号和噪声是互相独立的。

二、代码实现图像平滑去噪

实现均值滤波的函数:

function G = avefilter(F, k)
% F 是待处理的图像
% k 是模版的大小,奇数
[m, n] = size(F);

% 转换数据类型,便于计算
G = uint16(zeros(m, n));Ft = uint16(F); M = uint16(ones(k, k));
h = (k+1)/2;

for i = 1:m
    for j = 1:n
        if((i < h)|| (j < h)|| (i > m-h+1)|| (j > n-h+1))	%不能被模版处理的区域
            G(i, j) = Ft(i, j); continue;	%像素值不变
        end
        %取同样大小的图像块,中间的像素是待处理的像素
		T = Ft(i-(k-1)/2: i+(k-1)/2, j-(k-1)/2: j+(k-1)/2); 
        T = T.*M;			%和模版相乘
        G(i, j) = sum(T(:))/k^2;	%结果求和并计算平均值
    end
end
G = uint8(G);		%结果转换成8-bit图像的数据类型

调用函数消除噪声:

%% 均值滤波
clear;
g = imread('gull.jpg');
gg = imnoise(g, 'gaussian');  %添加高斯噪声

subplot(2,2,1), imshow(gg); title("高斯噪声");

j = 2;

for i = 3:4:11
    G = avefilter(gg, i);
    subplot(2,2,j), imshow(G); 
    title([num2str(i), '\ast', num2str(i), '均值滤波']);
    j = j+1;
end

结果显示:

实现中值滤波的函数:

function G = medianfilter(F, k)
% F 是待处理的图像
% k 是模版的大小,奇数
[m, n] = size(F);

% 转换数据类型,便于计算
G = uint16(zeros(m, n)); Ft = uint16(F); M = uint16(ones(k, k));
h = (k+1)/2;

for i = 1:m
    for j = 1:n
        if((i < h)|| (j < h)|| (i > m-h+1)|| (j > n-h+1))	%不能被模版处理的区域
            G(i, j) = Ft(i, j); continue;               	%像素值不变
        end
        % 取同样大小的图像块,中间的像素是待处理的像素
		T = Ft(i-(k-1)/2: i+(k-1)/2, j-(k-1)/2: j+(k-1)/2); 
        T = T(:);               %将矩阵转换为一维向量
        G(i, j) = median(T);    %求中值并赋值给中间像素
    end
end
G = uint8(G);		%结果转换成8-bit图像的数据类型

调用函数消除噪声:

%% 中值滤波
clear;
g = imread('gull.jpg');
gg = imnoise(g, 'salt & pepper', 0.05); %添加椒盐噪声

subplot(2,2,1), imshow(gg); title("椒盐噪声");

j = 2;

for i = 3:4:11
    G = medfilter(gg, i);
    subplot(2,2,j), imshow(G); 
    title([num2str(i), '\ast', num2str(i), '中值滤波']);
    j = j+1;
end

结果显示: