本文对slena.jpg进行了单层和多层的分解与重构,利用方差或小波变换的性质对带状噪声进行了去除。实验处理的图片为slena.jpg
代码如下:
基于小波变换性质的带状噪声去除
通过小波变换分离出竖直分量,移除后即可减缓竖线影响,但是会丢失大量细节,当N较大时,会使得图像模糊不清
function U()
clear;
clc;
Wavelet_decomposition_Banded_nois_removal()
% 用小波变换处理带状噪声
function Wavelet_decomposition_Banded_nois_removal()
[X,map] = imread('slena.jpg'); % 读取文件
% [X,map] = imread('football.jpg');
figure('Name','小波变换'); % 开一个叫小波变换的窗口
subplot(2,2,1);imshow(X);title('slena.jpg原图'); % 显示原图
N=3;
wname = 'sym5';
X_1=Wavelet_decomposition(X(:,:,1),N,wname);
X_2=Wavelet_decomposition(X(:,:,2),N,wname);
X_3=Wavelet_decomposition(X(:,:,3),N,wname);
subplot(2,2,2),imshow(cat(3,X_1,X_2,X_3),[]),title(wname);
wname = 'db1';
X_1=Wavelet_decomposition(X(:,:,1),N,wname);
X_2=Wavelet_decomposition(X(:,:,2),N,wname);
X_3=Wavelet_decomposition(X(:,:,3),N,wname);
subplot(2,2,3),imshow(cat(3,X_1,X_2,X_3),[]),title(wname);
wname = 'haar';
X_1=Wavelet_decomposition(X(:,:,1),N,wname);
X_2=Wavelet_decomposition(X(:,:,2),N,wname);
X_3=Wavelet_decomposition(X(:,:,3),N,wname);
subplot(2,2,4),imshow(cat(3,X_1,X_2,X_3),[]),title(wname);
end
% 对RGB每个片的单独处理
function img = Wavelet_decomposition(X,N,wname)
[C,S] = wavedec2(X, N, wname); % 小波分解
CA = appcoef2(C,S, wname,N); % 提取直通分量
for i = N:-1:1
CH = detcoef2('h',C,S,i); % 提取水平分量
% CV = detcoef2('v',C,S,i); % 提取垂直分量
CV = [];
CD = detcoef2('d',C,S,i); % 提取对角分量
CA = idwt2(CA,CH,CV,CD,wname);
% CA = idwt2([],[],CV,[],wname);
end
img = uint8(CA);
return
end
实验结果:
2.基于方差的带状噪声去除
通过对图片的分析,我们可以看出,图像中的带状噪声部分,像素值差异明显比正常部分要小,所以我们可以通过方差来确定噪声具体位置,并用左右相邻正常像素值来代替它,这样丢失的细节相比上一种更少。
function U()
clear;
clc;
Banded_nois_removal()
% 基于方差实现的带状噪声处理
function Banded_nois_removal()
[X,map] = imread('slena.jpg'); % 读取文件
figure('Name','基于方差的带状噪声处理'); % 开一个叫带状噪声处理的窗口
subplot(1,2,1);imshow(X);title('slena.jpg原图'); % 显示原图
wname = 'haar';
X_1=Variance(X(:,:,1),wname);
X_2=Variance(X(:,:,2),wname);
X_3=Variance(X(:,:,3),wname);
subplot(1,2,2),imshow(cat(3,X_1,X_2,X_3),[]),title('方差处理');
end
function X = Variance(X,wname)
[cA,cH,cV,cD]=dwt2(X,wname);
A=idwt2(cA,[],[],[],wname);
H=idwt2([],cH,[],[],wname);
V=idwt2([],[],cV,[],wname);
D=idwt2([],[],[],cD,wname);
[x,y]=size(cA);
img = zeros(x,y);
v_cA = var(cA); % 算出方差
v1=0;
v2=0;
for j =1:y
if v_cA(j)<5000 % 方差太小,应该是竖线
% 左右找找方差大的列,取它俩平均值
v1=0;
v2=0;
for i = j+1:y
if v_cA(i)>700
v2 = i;
break;
end
end
for i = j-1:-1:1
if v_cA(i)>700
v1 = i;
break;
end
end
if v1==0
v1 = v2;
end
if v2==0
v2=v1;
end
for i = 1:x
img(i,j)=(cA(i,v1)+cA(i,v2))/2;
end
else
for i = 1:x
img(i,j)=cA(i,j);
end
end
end
% img =medfilt2(img); % 中值滤波
% h = 1/16.*[1 2 1 ;2 4 2 ;1 2 1];
% img = filter2(h,img); % 高斯滤波
X=uint8(idwt2(img,cH,[],cD,wname));
end
实验结果:
其他:
对于小波变换的垂直分量,可以不完全去除,而对其进行滤波处理,可以减少细节丢失。
方差具体值的选取比较依赖于经验和试错,普适性较差。