前言

本文将提供4种图像去噪方法,并提供相关代码以及去噪结果图片,其中NL-means效果最好。先上一张去噪前的原始图片。下图为一张胃镜拍的图,患者肠胃溃疡,这个咱不用管,我们只需要去掉噪声,使图片变的更为清晰,这有助于后续对图像进行检测、分割等操作,提高精确度,原始图片如下。
在这里插入图片描述
在这里插入图片描述

图中代码下载链接如下:https://download.csdn.net/download/weixin_39615182/13651531

四种去噪方法—代码及效果

一、中值滤波

denoise_1.m

% 中值滤波
img = imread('denoise.jpg');
% 将图片分为R,G,B图片
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
% 采用二维中值滤波函数medfilt2对图像滤波
R1 = medfilt2(R);
G1 = medfilt2(G);
B1 = medfilt2(B);
% 合并RGB三通道
RGB(:,:,1)=R1(:,:,1);
RGB(:,:,2)=G1(:,:,1);
RGB(:,:,3)=B1(:,:,1);
figure();
subplot(1,2,1);
imshow(img);
title('原图像');
subplot(1,2,2);
imshow(RGB);
title('中值滤波');

其中medfilt2是内置的中值滤波函数

效果:
在这里插入图片描述

二、高斯低通滤波

denoise_2.m

% 高斯低通滤波
clear all;
img = imread('denoise.jpg');
% 将图片分为R,G,B图片
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
% 采用二维中值滤波函数medfilt2对图像滤波
R1 = gaosi(R);
G1 = gaosi(G);
B1 = gaosi(B);
% 合并RGB三通道
RGB(:,:,1)=R1(:,:,1);
RGB(:,:,2)=G1(:,:,1);
RGB(:,:,3)=B1(:,:,1);
figure();
subplot(1,2,1);
imshow(img);
title('原图像');
subplot(1,2,2);
imshow(RGB);
title('高斯低通滤波');

注意其中gaosi(),表示调用函数,这是一个自定义函数,需要自己定义
在这里插入图片描述
gaosi.m中的代码如下

function [img] = gaosi(image)
    d0=50;  %阈值
    [M ,N]=size(image);

    img_f = fft2(double(image));%傅里叶变换得到频谱
    img_f=fftshift(img_f);  %移到中间

    m_mid=floor(M/2);%中心点坐标
    n_mid=floor(N/2);  

    h = zeros(M,N);%高斯低通滤波器构造
    for i = 1:M
        for j = 1:N
            d = ((i-m_mid)^2+(j-n_mid)^2);
            h(i,j) = exp(-d/(2*(d0^2)));      
        end
    end

    img_lpf = h.*img_f;

    img_lpf=ifftshift(img_lpf);    %中心平移回原来状态
    img_lpf=uint8(real(ifft2(img_lpf)));  %反傅里叶变换,取实数部分
    
    img = img_lpf;
end

效果:
在这里插入图片描述

三、高斯平滑滤波

denoise_3.m

% 高斯平滑滤波
clear all;
img = imread('denoise.jpg');

% 将图片分为R,G,B图片
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
% 采用二维中值滤波函数medfilt2对图像滤波
R1 = gaosi_pinghua(R);
G1 = gaosi_pinghua(G);
B1 = gaosi_pinghua(B);
% 合并RGB三通道
RGB(:,:,1)=R1(:,:,1);
RGB(:,:,2)=G1(:,:,1);
RGB(:,:,3)=B1(:,:,1);

figure();
subplot(1,2,1);
imshow(img);
title('原图像');
subplot(1,2,2);
imshow(RGB);
title('高斯平滑滤波');

在这里插入图片描述

gaosi_pinghua.m中代码如下

function [img] = gaosi_pinghua(f)
    d0=20;    
    f=double(f);
    f=fft2(f);
    f=fftshift(f);
    [m,n]=size(f); 
    
    m1=fix(m/2);
    n1=fix(n/2);

    for i = 1:m
        for j = 1:n
            d = sqrt((i-m1)^2+(j-n1)^2);
            h(i,j) = exp(-d^2/2/d0^2);
        end
    end
    g=f.*h;
    g=ifftshift(g);
    g=uint8(real(ifft2(g))); %反傅里叶变换,取实数部分
    
    img = g;
end

效果:
在这里插入图片描述

四、NL-means(非局部均值去噪)

NL-means运行时间最久,运行30s以上才出来,效果相对也最好
denoise_4.m

% NL-means
img = imread('denoise.jpg');
% 将图片分为R,G,B图片
R = double(img(:,:,1));
G = double(img(:,:,2));
B = double(img(:,:,3));
% 采用二维中值滤波函数medfilt2对图像滤波
R1 = NLmeans(R,2,5,10);
G1 = NLmeans(G,2,5,10);
B1 = NLmeans(B,2,5,10);
% 合并RGB三通道
RGB(:,:,1)=R1(:,:,1);
RGB(:,:,2)=G1(:,:,1);
RGB(:,:,3)=B1(:,:,1);
figure();
subplot(1,2,1);
imshow(img);
title('原图像');
subplot(1,2,2);
imshow(RGB);
title('中值滤波');

NL-means.m中代码如下

function DenoisedImg=NLmeans(I,ds,Ds,h)
%I:含噪声图像
%ds:邻域窗口半径
%Ds:搜索窗口半径
%h:高斯函数平滑参数
%DenoisedImg:去噪图像
I=double(I);
[m,n]=size(I);
DenoisedImg=zeros(m,n);
PaddedImg = padarray(I,[ds,ds],'symmetric','both');
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;
        W1=PaddedImg(i1-ds:i1+ds,j1-ds:j1+ds);%邻域窗口1
        wmax=0;
        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);
        for r=rmin:rmax
            for s=smin:smax
                if(r==i1&&s==j1)
                continue;
                end
                W2=PaddedImg(r-ds:r+ds,s-ds:s+ds);%邻域窗口2
                Dist2=sum(sum(kernel.*(W1-W2).*(W1-W2)));%邻域间距离
                w=exp(-Dist2/h2);
                if(w>wmax)
                    wmax=w;
                end
                sweight=sweight+w;
                average=average+w*PaddedImg(r,s);
            end
        end
        average=average+wmax*PaddedImg(i1,j1);%自身取最大权值
        sweight=sweight+wmax;
        DenoisedImg(i,j)=average/sweight;
    end
end

效果
在这里插入图片描述

注意该图片还有反光地方,如右上角,图像去高光以后会写写,本篇主要写四种去噪方法,及其效果。之所以用matlab,感觉相比opencv,matlab更强,以前用opencv处理不了的,matlab就能处理。而且主要是效果不错。这个还是自己选择吧,哪个觉得好用就用哪个。
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐