matlab在空域与频域中去除周期噪声、椒盐噪声的简单应用

前言

去年图像处理的DLL,有学弟问我做的思路,便放到博客里
github地址,欢迎star
图像增强处理:设计一套空间域与频率域结合的图像增强算法,处理以下任一组图片中的带噪声图像,去除噪声,提高图像质量。
(1)已知:噪声为随机噪声和周期噪声混合噪声;
(2)要求:
a)去噪处理后,计算均方误差评估去噪处理后图像的去噪效果
b)撰写完整的科技报告(形式类似科技论文)表述自己的算法设计,算法实现与算法评估过程。

对 swanNoise 图像去噪

空域去噪

根据老师讲解,swanNoise.bmp 所包含的噪声为椒盐噪声与周期噪声的混合。
对于传统图像中的椒盐噪声,适合使用 k 近邻滤波、中值滤波(二维统计滤波)、自适应中值滤波来去除噪声。k 近邻滤波能保留图像细节,使图像保持一定的清晰度,但椒盐噪声仍有少许干扰。中值滤波能完全去除椒盐噪声,但图像细节信息也损失了许多。
对于本图像,选取默认的参数调用三个滤波器去噪:

结果发现 k 近邻滤波图像细节损失不少。
再将二维统计滤波结果与自适应中值滤波结果比较:

结果发现适应中值滤波去噪效果最好。

频域去噪

将空域去噪的结果频谱图进行对比:

结果发现周期噪声突出的频率在每个区域均匀分布在各个点中。打开 photoshop 确认各点坐标。
对于频域滤波来说,可以采用高通滤波器、带阻滤波器、陷波滤波器、小波滤波器。下面对这几种滤波器进行比较:

  • 高通滤波器对于周期噪声的滤波效果并不好
  • 带阻滤波器对噪声以外的成分也有衰减
  • 陷波滤波器对某个点进行衰减,对其余的成分不造成损失
  • 小波滤波器对不同的频率成分分解到互不重叠的频带,对其余成分不造成损失

*由于试用版 matlab 无法安装 wavetoolbox ,在机房中实验的小波滤波器对本图去噪效果并不好,故采用陷波滤波器。
陷波滤波器结果如下:

小结

经过实验,发现先对频域去噪再对空域去噪效果最好,在这种情况下,自适应中值滤波比之原图的均方误差最小,结果如下:

二维统计滤波:
function y = TwostaticFilter(imageWithNoise,k,boxSize)
% iamgeWithNoise:噪声图像
% k:k值
% boxSize:模板尺寸
% 二维统计滤波

y = imageWithNoise;
[rows,cols]=size(y);
template = zeros(boxSize);
for i = 1:rows-boxSize+1
    for j = 1:cols-boxSize+1
        % 取模板内元素
        template = imageWithNoise(i:i+(boxSize-1),j:j+(boxSize-1));
        % 用排序后第k个值替换模板中心点像素值
        v = sort(template(:));
        y(i+(boxSize-1)/2,j+(boxSize-1)/2) = v(k);
    end
end
非局部均值滤波:
function DenoisedImg=NLmeans(I,ds,Ds,h)
 [m,n]=size(I);
DenoisedImg=zeros(m,n);
% 扩展图像边界
PaddedImg = padarray(I,[ds,ds],'symmetric','both');
% 定义d值
kernel=ones(2*ds+1,2*ds+1);
kernel=kernel./((2*ds+1)*(2*ds+1));
% 定义噪声功率
h2=h*h;
for i=1:m
    for j=1:n
        % 原图像对应扩展图像的偏移量
        i1=i+ds;
        j1=j+ds;
        % 在扩展图像中以(i1,j1)为中心的邻域窗口1
        W1=PaddedImg(i1-ds:i1+ds,j1-ds:j1+ds);
        average=0; % 加权和
        sweight=0; % 归一化系数
        % 搜索窗口
        rmin = max(i1-Ds,ds+1); % 搜索窗口上边界最低限制到原图像上边界
        rmax = min(i1+Ds,m+ds); % 搜索窗口下边界最高限制到原图像下边界
        smin = max(j1-Ds,ds+1); % 搜索窗口左边界最低限制到原图像左边界
        smax = min(j1+Ds,n+ds); % 搜索窗口右边界最高限制到原图像右边界
        % r与s为搜索窗口内像素点的坐标,对搜索窗口内的每个像素点求相似度
        for r=rmin:rmax
            for s=smin:smax
                % 不能与自己比较相似度
                if(r==i1&&s==j1)
                    continue;
                end
                % 以搜索窗口内的像素点为中心的邻域窗口2
                W2=PaddedImg(r-ds:r+ds,s-ds:s+ds);
                % 计算邻域间距离
                Dist2=sum(sum(kernel.*(W1-W2).*(W1-W2)));
                % 计算权值w(x,y)
                w=exp(-Dist2/h2);
                sweight=sweight+w;
                average=average+w*PaddedImg(r,s);
            end
        end
        % 将加权和归一化并替换原像素点
        DenoisedImg(i,j)=average/sweight;
    end
end
三维块匹配滤波:
function [y_est] = BM3D(y, z, sigma)
elseif strcmp(transform_type, 'dct') == 1,
    Tforward    = dct(eye(N));
elseif strcmp(transform_type, 'dst') == 1,
    Tforward    = dst(eye(N));
elseif strcmp(transform_type, 'DCrand') == 1,
    x = randn(N); x(1:end,1) = 1; [Q,R] = qr(x);
    if (Q(1) < 0),
        Q = -Q;
    end;
    Tforward = Q';
else
    dwtmode('per','nodisp');
    Tforward = zeros(N,N);
    for i = 1:N
        Tforward(:,i)=wavedec(circshift([1 zeros(1,N-1)],[dec_levels i-1]), log2(N), transform_type);  %% construct transform matrix
    end
end
Tforward = (Tforward' * diag(sqrt(1./sum(Tforward.^2,2))))';
Tinverse = inv(Tforward);
return;

陷波滤波:
function [im,fftim] = swannotchfilter(Image,D)
f = Image;
f = mat2gray(f,[0 255]);
[M,N] = size(f);
P = 2*M;
Q = 2*N;
fc = zeros(M,N);
for x = 1:1:M
    for y = 1:1:N
        fc(x,y) = f(x,y) * (-1)^(x+y);
    end
end
F = fft2(fc,P,Q);
H_NF = ones(P,Q);
for x = (-P/2):1:(P/2)-1
     for y = (-Q/2):1:(Q/2)-1
        v_k = 200; u_k = 145;
        D_k = ((x+u_k)^2 + (y+v_k)^2)^(0.5);
        H_NF(x+(P/2)+1,y+(Q/2)+1) = H_NF(x+(P/2)+1,y+(Q/2)+1) * 1/(1+(D/D_k)^4);
     end
end
G_1 = H_NF .* F;
g_1 = real(ifft2(G_1));
g_1 = g_1(1:1:M,1:1:N);
for x = 1:1:M
    for y = 1:1:N
        g_1(x,y) = g_1(x,y) * (-1)^(x+y);
    end
end
im=g_1;
fftim=G_1;

对 dogDistorted 图像去噪

空域去噪

根据老师讲解,dogDistorted.bmp 所包含的噪声为高斯噪声与周期噪声的混合。

对于传统图像中的高斯噪声,适合使用非局部均值滤波、中值滤波(二维统计滤波)、三维块匹配滤波
非局部均值滤波均方误差更小,但三维块匹配滤波对于细节的保留程度更高。

频域去噪

同样的,采用陷波滤波器去噪,查看噪声图像频谱图:

采用一样的方法陷波滤波:

小结:

原文地址:https://www.cnblogs.com/shy-/p/10888880.html

时间: 2024-10-29 00:33:59

matlab在空域与频域中去除周期噪声、椒盐噪声的简单应用的相关文章

Js中去除数组中重复元素的4种方法

今天工作遇到此问题,尝试多个方法不尽人意,故此写个博客来总结一下如何在js中去除重复元素. 方法1:         Array.prototype.method1 = function(){             var arr[];    //定义一个临时数组             for(var i = 0; i < this.length; i++){    //循环遍历当前数组                 //判断当前数组下标为i的元素是否已经保存到临时数组          

ckeditor编辑器中去除p标签

ckeditor中默认添加p标签.去掉<p>标签的方法在ckeditor文件下config.js中加: config.shiftEnterMode = CKEDITOR.ENTER_P; 如果你想在ckeditor编辑的时候把回车换成<br/>标签,加: config.enterMode = CKEDITOR.ENTER_BR; 如果你想把编辑器设置为源码模式,加: config.startupMode = 'source'; ckeditor编辑器中去除p标签,布布扣,bubuk

android studio 中去除应用标题栏

android studio 中去除应用标题栏 ㈠ ⒈ mainifests中设置: android:theme="@style/AppTheme"(即默认设置). ⒉ values->styles.xml中设置: style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar". ㈡ values->styles.xml中: 在当先使用的style的parent属性添加

Joomla的Url中去除index.php

最近在研究Joomla系统(一个著名的CMS系统),安装之后发现页面的URL中始终有一个index.php存在,感觉非常碍眼,决心将其除之而后快,废话少说,下面以2.5版本为例奉上去除步骤. 1. 登录管理后台,在"Site"->"Global Configuration"->"Site"中的"SEO Settings"中全部勾选"Yes": 2. 创建.htaccess文件:将Joomla安装

几何画板中去除画出的线段的教程

在几何画板中作图和在黑板和纸上画图不一样,没有直接可以使用的橡皮擦或者黑板擦来将画的图擦除,但是在几何画板中如果画错了图或者不需要某个图形,也是可以不让它显示出来的,这样就不会妨碍继续作图.下面就以如何在几何画板中去除画出的线段为例给大家作详细介绍. 方法一 如果该线段没有子对象的,即没有其他图像是建立在这条线段基础上做出来的,那么这个线段就是独立存在的,去除它多作图没有任何影响的,这个时候要去掉线段的话,直接选中该线段,执行"编辑"--"剪切"命令或按Delete

[LeetCode] Remove Duplicates from Sorted Array 有序数组中去除重复项

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with constant memory. For example,Given input array A = [

在Word中去除超链接的两种方法

本文来自e良师益友网 不少朋友都有这样一个疑问:在Word中输入网站地址,回车之后,先前输入的地址就自动转变为了蓝色的超链接,如果我们不想这样,该如何设置呢?下面,简单的介绍两种方法给大家参考. 方法一:运用自动更正选项 1.启动Word2003,在空白处直接输入网站地址之后,自动变为蓝色的超链接形式,我们仔细发现,首字母下有一道横线,光标移动至此,显示自动更正选项. 2.单击自动更正选项,有三个可供选择的,选择控制自动更正选项. 3.在键入时自动套用格式选项卡中,取消勾选Internet及网络

从VG中去除PV unknown device

LVM分区中查看PV时,出现如下错误: # pvscan Couldn't find device with uuid ......... PV   /dev/sda2                  VG  VolGroup00    lvm2 [17.99GB/0  free] PV   unknown device        VG  VolGroup00    lvm2[2.21GB/2.21GB] 解决方法:从VG中去除PV unknown device 采用 vgreduce -

Ionic 2 中生命周期的命名改变及说明

本文简要整理了在 Ionic 2 的版本中生命周期命名的改变,以及各个事件的解释. 在之前的课程中讲解了 Ionic 生命周期的命名以及使用,不过在 Ionic 2 更新到了 30 版本后,框架在全局对生命周期的命名做了改变,所以本文简单整理一下新的生命周期事件和说明如下.官方文档地址在这里. 事件名称 事件说明 ionViewLoaded 页面加载完毕触发.该事件发生在页面被创建成 DOM 的时候,且仅仅执行一次.如果页面被缓存(Ionic默认是缓存的)就不会再次触发该事件.该事件中可以放置初