欢迎光临散文网 会员登陆 & 注册

【图像去噪】基于全变分算法(TV)图像去噪matlab源码

2021-08-29 00:09 作者:Matlab工程师  | 我要投稿

用途:图像降噪(图像修复,复原中),TVloss是一种较为有效的正则项,来保持图像的光滑性

TVloss的去噪效果还算不错,但是会导致图像变得过平滑,感觉这样的话,可能加上TVLoss就会好点了。

全变分模型主要是依靠梯度下降流岁图像进行平滑处理的模型,希望在图像的内部对图像进行平滑,使得相邻像素的差值较小,,图像的轮廓(边缘)尽可能不去平滑.数学定义如下:

但是这个函数是不可微的,是非凸的,所以对于二维全变分有另外一种定义:

这个就是凸函数了. ..所以全变分求出来是一个数值.

如果仿照一维信号的去噪的话,则基于全变分的图像去噪可以看成是求解优化的问题:

function image=bldconv(g) a1=0.1; a2=0.01; PQ=paddedsize(size(g)); G=fft2(g,PQ(1),PQ(2)); [y x]=size(G); htemp=ones(3); h0=freqz2(htemp,PQ(1),PQ(2)); R=Rcreat(y,x); H=h0; for k=1:10 %计算IMG和psf iMG=(conj(H).*G)./((conj(H).*H)+a1*R); H=conj(iMG).*G./((conj(iMG).*iMG)+a2*R); end IMG=mat2gray(real(ifft2(iMG))); image=IMG(1:size(g,1),1:size(g,2)); imwrite(image,'testfile.tif'); imshow(image,[]); hold on; end %=========================== %计算R矩阵的函数Rcreat %=========================== function R=Rcreat(y,x) %R矩阵生成子函数 %by Realasking %为bdeconv.m编制 i=1:y; j=1:x; RI=zeros(y,x); RJ=zeros(y,x); R=zeros(y,x); for k=1:y %向量化代码生成R的矩阵 RI(k,i)=-2*cos(2*pi*i./y); end for k=1:x RJ(j,k)=-2*cos(2*pi*j'./x); end Img=imread('Baboon1.bmp'); %读取图片 PSF=fspecial('motion',3); %创建PSF gb=imfilter(Img,PSF,'circular'); %创建退化图像 Img=imnoise(gb,'gaussian',0,0.01); %加噪声 figure,imshow(Img) Img=double(Img); Img0=Img; PQ=paddedsize(size(Img)); IMG=fft2(Img,PQ(1),PQ(2)); IMG0=fft2(Img0,PQ(1),PQ(2)); [nrow,ncol]=size(Img);  % 获取图像尺寸大小 lamda1=0.02; lamda2=0.02; dt=0.28;   % 0.25-0.35为最佳 G=gauss(Img,7,3); Ix = 0.5*(G(:,[2:ncol,ncol])-G(:,[1,1:ncol-1])); % x方向梯度 Iy = 0.5*(G([2:nrow,nrow],:)-G([1,1:nrow-1],:)); % y方向梯度 gradG = Ix.^2+Iy.^2;  % 梯度大小 P=1+1./(1+gradG);  %自适应滤波器 deltax=Img0; %zeros(nrow,ncol);  %产生与图像大小相同的矩阵 deltay=Img0; %zeros(nrow,ncol); htemp=ones(3); h0=freqz2(htemp,PQ(1),PQ(2)); R=Rcreat(PQ(1),PQ(2)); H=h0; for M=1:10 % 设置迭代次数 for i=2:(nrow-1) for j=2:(ncol-1) deltax(i,j)=(Img(i+1,j)-Img(i,j))./(((Img(i+1,j)-Img(i,j)).^2+(Img(i,j+1)-Img(i,j-1)).^2/4+1).^(1-0.5.*P(i,j)))-(Img(i,j)-Img(i-1,j))./(((Img(i,j)-Img(i-1,j)).^2+(Img(i-1,j+1)-Img(i-1,j-1)).^2/4+1).^(1-0.5.*P(i-1,j))); deltay(i,j)=(Img(i,j+1)-Img(i,j))./(((Img(i+1,j)-Img(i-1,j)).^2/4+(Img(i,j+1)-Img(i,j)).^2+1).^(1-0.5.*P(i,j)))-(Img(i,j)-Img(i,j-1))./(((Img(i+1,j-1)-Img(i-1,j-1)).^2/4+(Img(i,j)-Img(i,j-1)).^2+1).^(1-0.5.*P(i,j-1))); end end div=deltax+deltay; DIV=fft2(div,PQ(1),PQ(2)); IMG=IMG+dt*(-conj(H).*H.*IMG+conj(H).*IMG0+lamda1.*DIV); H=conj(IMG).*IMG0./(conj(IMG).*IMG+lamda2.*R); Img1=real(ifft2(IMG)); Img=Img1(1:size(Img0,1),1:size(Img0,2)); end

三、运行结果

在这里插入图片描述

 


【图像去噪】基于全变分算法(TV)图像去噪matlab源码的评论 (共 条)

分享到微博请遵守国家法律