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

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

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

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

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

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

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

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

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

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.

三、运行结果

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