zoukankan      html  css  js  c++  java
  • 多尺度双边滤波及基于小波变换的非线性扩散

    主题:对车载手势进行基于小波变换和双边滤波的图像去噪


    一、原理

    (1)基于小波变换的非线性扩散

    小波分解→高频子带非线性扩散

    小波分解将图像分解为fa (低频部分)fh fv fd(包含细节信息与噪声信息的高频部分)

    fh(水平高频子带):进行从左至右与从右至左的非线性扩散列操作;

    fv(垂直高频子带): 进行从上至下与从下至上的非线性扩散行操作

    fd(对角高频子带): 进行从左至右与从右至左的非线性扩散列操作以及进行从上至下与从下至上的非线性扩散行操作;

    非线性扩散方程

    (2)多尺度双边滤波

    ①利用高斯核函数定义空间临近度与灰度值相似度

    ②领域空间内与像素(x,y)相似的像素集

     

    σ0 为灰度阈值,N为像素(x,y)的领域空间

    像素集中像素的个数与领域空间之比t

    t=|Q|/|N|

    设立一个比例阈值t0

    若t≤t0,则在计算过程中时,只有N中与其相似的像素参加;

    若t>t0,则在计算过程中,N中所有像素都参与运算

    ④双边滤波计算公式

    二 具体实现

    1.读图并灰度化处理

    clc;
    close all;
    %输入原图
    srcI=imread('1.jpg');
    figure;
    imshow(srcI);
    title('原始图片');
    %判断通道数并决定是否进行灰度化
    srcIsize=size(srcI);
    if numel(srcIsize)>2
        srcI=rgb2gray(srcI);
    end
    srcI=im2double(srcI);
    figure;
    imshow(srcI);
    title('灰度化后的图片');

    2.哈尔平稳小波一尺度的分解

    %小波分解
    [cA,cH,cV,cD]=swt2(srcI,1,'haar');
    figure;
    subplot(2,2,1);
    imshow(cA);
    title('低频图像');
    subplot(2,2,2);
    imshow(cH);
    title('水平高频子带图像');
    subplot(2,2,3);
    imshow(cV);
    title('垂直高频子带图像');
    subplot(2,2,4);
    imshow(cD);
    title('对角高频子带图像');
    

    3.不同方向的非线性扩散

    %非线性扩散
    k=15;
    lamda=0.15;
    t=20;
    %对水平高频子带进行列操作
    dstCH=columchange(cH,k,lamda,t);
    %对垂直高频子带进行行操作
    dstCV=rowchange(cV,k,lamda,t);
    %对对角高频子带进行行与列的操作
    dstCD=change(cD,k,lamda,t);
    figure;
    subplot(2,2,1);
    imshow(cA);
    title('低频图像');
    subplot(2,2,2);
    imshow(dstCH);
    title('水平高频子带非线性扩散后的图像');
    subplot(2,2,3);
    imshow(dstCV);
    title('垂直高频子带非线性扩散后的图像');
    subplot(2,2,4);
    imshow(dstCD);
    title('对角高频子带非线性扩散后的图像');
    

    3.1对图像的列进行两个方向的非线性扩散

    function[dstI]=columchange(srcI,k,lamda,t)
    %% 函数描述:对图像的列进行两个方向的非线性扩散
    %% 输出参数
    % dstI:非线性扩散后的图
    %% 输入参数
    % srcI:非线性扩散之前的图
    % k:权衡系数
    % lamda:控制平滑
    % t:迭代次数
    %% 函数代码
    [r,c]=size(srcI);
    for num=1:t
        for i=1:r
            for j=1:c
                if(i>1 && i<r && j>1 && j<c)
                    left2right=srcI(i,j-1)-srcI(i,j);
                    right2left=srcI(i,j+1)-srcI(i,j);
                    c1=exp(-(left2right^2)/(k^2));
                    c2=exp((-right2left^2)/(k^2));
                    srcI(i,j)=srcI(i,j)+lamda*(left2right*c1+right2left*c2);
                end
            end
        end
    end
    dstI=srcI;

    3.2对图像的行进行两个方向的非线性扩散

    function[dstI]=rowchange(srcI,k,lamda,t)
    %% 函数描述:对图像的行进行两个方向的非线性扩散
    %% 输出参数
    % dstI:非线性扩散后的图
    %% 输入参数
    % srcI:非线性扩散之前的图
    % k:权衡系数
    % lamda:控制平滑
    % t:迭代次数
    %% 函数代码
    [r,c]=size(srcI);
    for num=1:t
        for i=1:r
            for j=1:c
                if(i>1 && i<r && j>1 && j<c)
                    up2down=srcI(i-1,j)-srcI(i,j);
                    down2up=srcI(i+1,j)-srcI(i,j);
                    c1=exp(-(up2down^2)/(k^2));
                    c2=exp((-down2up^2)/(k^2));
                    srcI(i,j)=srcI(i,j)+lamda*(up2down*c1+down2up*c2);
                end
            end
        end
    end
    dstI=srcI;

    3.3对图像的行与列进行两个方向的非线性扩散

    function[dstI]=change(srcI,k,lamda,t)
    %% 函数描述:对图像的行与列进行两个方向的非线性扩散
    %% 输出参数
    % dstI:非线性扩散后的图
    %% 输入参数
    % srcI:非线性扩散之前的图
    % k:权衡系数
    % lamda:控制平滑
    % t:迭代次数
    %% 函数代码
    [r,c]=size(srcI);
    for num=1:t
        for i=1:r
            for j=1:c
                if(i>1 && i<r && j>1 && j<c)
                    up2down=srcI(i-1,j)-srcI(i,j);
                    down2up=srcI(i+1,j)-srcI(i,j);
                    left2right=srcI(i,j-1)-srcI(i,j);
                    right2left=srcI(i,j+1)-srcI(i,j);
                    c1=exp(-(up2down^2)/(k^2));
                    c2=exp((-down2up^2)/(k^2));
                    c3=exp(-(left2right^2)/(k^2));
                    c4=exp((-right2left^2)/(k^2));
                    srcI(i,j)=srcI(i,j)+lamda*(up2down*c1+down2up*c2+left2right*c3+right2left*c4);
                end
            end
        end
    end
    dstI=srcI;

     4.逆小波变换

    将各个高频子带进行去噪后与低频带再次拼接

    %进行逆小波变换
    tempI=iswt2(cA,dstCH,dstCV,dstCD,'haar');
    figure;
    imshow(tempI);
    title('逆小波变换后的图像');
    

    5.多尺度双边滤波

    %多尺度双边滤波
    r=5;
    globalVar=3;
    localVar=0.045;
    dstI=doublefilter(tempI,r,globalVar,localVar);
    figure;
    imshow(dstI);
    title('多尺度双边滤波后的结果图');

    5.1 双边滤波函数

    function[dstI]=doublefilter(srcI,r,globalVar,localVar)
    %% 双边滤波函数
    %% 输出参数
    % dstI:双边滤波后的图像
    %% 输入参数
    % srcI:原始图像
    % r:滤波半径
    % globalVar:全局方差
    % localVar:局部方差
    %% 函数代码
    %获取原始图像的宽高
    [m,n]=size(srcI);
    %计算空间权重
    [x,y]=meshgrid(-r:r);
    spaceW=exp(-(x.^2+y.^2)/(2*globalVar^2));
    %填充原始图像
    srcI_pad=padarray(srcI,[r r],'symmetric');
    dstI=zeros(m,n);
    for i=r+1:m+r
        for j=r+1:n+r
            %计算灰度权重
            temp=srcI_pad(i-r:i+r,j-r:j+r);
            grayW=exp(-(temp-srcI(i-r,j-r)).^2/(2*localVar^2));
            %计算最终权重
            finalW=spaceW.*grayW;
            ret=temp.*finalW;
            dstI(i-r,j-r)=sum(ret(:))/sum(finalW(:));
        end
    end

    6.均方差 峰值信噪比评价去噪能力

    [MSE,PSNR]=Evaluation(srcI,dstI);
    display(MSE);%均方差
    display(PSNR);%峰值信噪比
    

    6.1 评价函数

    function [MSE,PSNR] = Evaluation( srcI,dstI )
    %% 函数描述:评估去噪图像的效果
    %% 输出参数:
    % MSE:均方差
    % PSNR:峰值信噪比
    %% 输入参数:
    % srcI:原始图片
    % dstI:去噪后的图片
    %% 函数代码
    D=dstI-srcI;
    MSE=sum(D(:).*D(:))/numel(dstI);
    PSNR=10*log10(255^2/MSE);

    7. 处理结果

    When you are obsessed something,anything can be easy and possible.
  • 相关阅读:
    晨读,难道只是为了完成任务而读的吗?
    集合还有这么优雅的运算法?
    Java中的TreeSet集合会自动将元素升序排序
    CSS3的几个变形案例……
    “老师,请您多关注一下我吧!!!”
    jsp中使用cookie时报错……
    为什么要有周考?周考是用来干什么的?
    今天,我们就来抽个奖!
    今天 ,给大家变个魔术!!!
    Google Maps Api 多坐标分类标记,在地图上显示海量坐标,并分组显示。
  • 原文地址:https://www.cnblogs.com/1532387167llx/p/10977076.html
Copyright © 2011-2022 走看看