去年图像处理的DLL,有学弟问我作的思路,便放到博客里
github地址,欢迎star
图像加强处理:设计一套空间域与频率域结合的图像加强算法,处理如下任一组图片中的带噪声图像,去除噪声,提升图像质量。
(1)已知:噪声为随机噪声和周期噪声混合噪声;
(2)要求:
a)去噪处理后,计算均方偏差评估去噪处理后图像的去噪效果
b)撰写完整的科技报告(形式相似科技论文)表述本身的算法设计,算法实现与算法评估过程。git
根据老师讲解,swanNoise.bmp 所包含的噪声为椒盐噪声与周期噪声的混合。
对于传统图像中的椒盐噪声,适合使用 k 近邻滤波、中值滤波(二维统计滤波)、自适应中值滤波来去除噪声。k 近邻滤波能保留图像细节,使图像保持必定的清晰度,但椒盐噪声仍有少量干扰。中值滤波能彻底去除椒盐噪声,但图像细节信息也损失了许多。
对于本图像,选取默认的参数调用三个滤波器去噪:
结果发现 k 近邻滤波图像细节损失很多。
再将二维统计滤波结果与自适应中值滤波结果比较:
结果发现适应中值滤波去噪效果最好。github
将空域去噪的结果频谱图进行对比:
结果发现周期噪声突出的频率在每一个区域均匀分布在各个点中。打开 photoshop 确认各点坐标。
对于频域滤波来讲,能够采用高通滤波器、带阻滤波器、陷波滤波器、小波滤波器。下面对这几种滤波器进行比较:算法
*因为试用版 matlab 没法安装 wavetoolbox ,在机房中实验的小波滤波器对本图去噪效果并很差,故采用陷波滤波器。
陷波滤波器结果以下:
设计
通过实验,发现先对频域去噪再对空域去噪效果最好,在这种状况下,自适应中值滤波比之原图的均方偏差最小,结果以下:
3d
二维统计滤波: 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.bmp 所包含的噪声为高斯噪声与周期噪声的混合。code
对于传统图像中的高斯噪声,适合使用非局部均值滤波、中值滤波(二维统计滤波)、三维块匹配滤波
非局部均值滤波均方偏差更小,但三维块匹配滤波对于细节的保留程度更高。orm
一样的,采用陷波滤波器去噪,查看噪声图像频谱图:blog
采用同样的方法陷波滤波:排序