目录
前言四种去噪方法---代码及效果一、中值滤波二、高斯低通滤波三、高斯平滑滤波四、NL-means(非局部均值去噪)前言
本文将提供4种图像去噪方法,并提供相关代码以及去噪结果图片,其中NL-means效果最好。先上一张去噪前的原始图片。下图为一张胃镜拍的图,患者肠胃溃疡,这个咱不用管,我们只需要去掉噪声,使图片变的更为清晰,这有助于后续对图像进行检测、分割等操作,提高精确度,原始图片如下。
图中代码下载链接如下:/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:Mfor j = 1:Nd = ((i-m_mid)^2+(j-n_mid)^2);h(i,j) = exp(-d/(2*(d0^2)));endendimg_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:mfor j = 1:nd = sqrt((i-m1)^2+(j-n1)^2);h(i,j) = exp(-d^2/2/d0^2);endendg=f.*h;g=ifftshift(g);g=uint8(real(ifft2(g))); %反傅里叶变换,取实数部分img = g;end
效果:
四、NL-means(非局部均值去噪)
NL-means运行时间最久,运行30s以上才出来,效果相对也最好。
denoise_4.m
% NL-meansimg = 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:mfor j=1:ni1=i+ds;j1=j+ds;W1=PaddedImg(i1-ds:i1+ds,j1-ds:j1+ds);%邻域窗口1wmax=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:rmaxfor s=smin:smaxif(r==i1&&s==j1)continue;endW2=PaddedImg(r-ds:r+ds,s-ds:s+ds);%邻域窗口2Dist2=sum(sum(kernel.*(W1-W2).*(W1-W2)));%邻域间距离w=exp(-Dist2/h2);if(w>wmax)wmax=w;endsweight=sweight+w;average=average+w*PaddedImg(r,s);endendaverage=average+wmax*PaddedImg(i1,j1);%自身取最大权值sweight=sweight+wmax;DenoisedImg(i,j)=average/sweight;endend
效果
注意该图片还有反光地方,如右上角,图像去高光以后会写写,本篇主要写四种去噪方法,及其效果。之所以用matlab,感觉相比opencv,matlab更强,以前用opencv处理不了的,matlab就能处理。而且主要是效果不错。这个还是自己选择吧,哪个觉得好用就用哪个。
如果觉得《【数字图像处理1】基于matlab的彩色图像去噪》对你有帮助,请点赞、收藏,并留下你的观点哦!