【数字图像处理1】基于matlab的彩色图像去噪
前言本文将提供4种图像去噪方法,并提供相关代码以及去噪结果图片。先上一张去噪前的原始图片。下图为一张胃镜拍的图,患者肠胃溃疡,这个咱不用管,我们只需要去掉噪声,使图片变的更为清晰,这有助于后续对图像进行检测、分割等操作,提高精确度,原始图片如下。下载链接如下:https://download.csdn.net/download/weixin_39615182/13651531四种去噪方法—代码及效
前言
本文将提供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就能处理。而且主要是效果不错。这个还是自己选择吧,哪个觉得好用就用哪个。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)