matlab 使用小波变换和方差性质处理带状噪声

该文介绍了两种去除图像中带状噪声的方法:一是利用小波变换的特性分解并重构图像,特别是去除竖直分量以减轻竖线影响;二是通过计算像素方差来定位噪声区域,并用相邻正常像素值替换。方差法在细节保留上优于小波变换法,但方差阈值的选择依赖于经验和试错。
摘要由CSDN通过智能技术生成

本文对slena.jpg进行了单层和多层的分解与重构,利用方差或小波变换的性质对带状噪声进行了去除。实验处理的图片为slena.jpg

代码如下:

  1. 基于小波变换性质的带状噪声去除

通过小波变换分离出竖直分量,移除后即可减缓竖线影响,但是会丢失大量细节,当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

实验结果:

其他:

对于小波变换的垂直分量,可以不完全去除,而对其进行滤波处理,可以减少细节丢失。

方差具体值的选取比较依赖于经验和试错,普适性较差。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值