转载:(https://blog.csdn.net/dan1900/article/details/21092403?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-19&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-19)
曾经想要实现过Bertalmio图像修复算法,无奈自身实力不够,耗费两天时间也没能实现。昨天博客上有人问到TV模型,这个模型我过去是没听说过的,于是就找来相关论文研究了一下,发现TV模型也可以用来修复图像,于是就有了想实现的想法。用到的偏微分方程技巧和各项异性扩散很像。
先看看效果吧:
原lena:
随手截的噪声图:
合成的需要修复的图:
修复后的图(没有处理边界):
对于从来没有接触过图像修复的我来说,效果真是惊艳了。
下面介绍运算步骤:
和各项异性扩散类似,整个算法也是基于迭代的,迭代公式如下:
其中Io代表当前处理的像素,Ip代表邻域像素,p就可以取news四邻域。H定义如下:
这里的lambda为自定义的平滑系数。wp的定义如下:
这里a同样是自定义。
结合上图在看up散度,将p取e来看ue定义如下:
这里的h就是1了。
如此上述所有公式倒着运算不断迭代就可以了,迭代次数可自定义,或是不断迭代直到某条件成立都是可以的。
matlab代码如下,并不长,变量名和公式名是一一对应的:
close all;
clear all;
clc;
img=double(imread(‘lena.jpg’));
mask=rgb2gray(imread(‘ma.jpg’))>160;
[m n]=size(img);
for i=1:m
for j=1:n
if mask(i,j)==0
img(i,j)=0;
end
end
end
imshow(img,[]); %合成的需要修复的图像
lambda=0.2;
a=0.5;
imgn=img;
for l=1:300 %迭代次数
for i=2:m-1
for j=2:n-1
if mask(i,j)==0 %如果当前像素是被污染的像素,则进行处理
Un</span>=sqrt((img(i,j)-img(i-<span style="color:#800080;">1</span>,j))^<span style="color:#800080;">2</span>+((img(i-<span style="color:#800080;">1</span>,j-<span style="color:#800080;">1</span>)-img(i-<span style="color:#800080;">1</span>,j+<span style="color:#800080;">1</span>))/<span style="color:#800080;">2</span>)^<span style="color:#800080;">2</span><span style="color:#000000;">);
Ue</span>=sqrt((img(i,j)-img(i,j+<span style="color:#800080;">1</span>))^<span style="color:#800080;">2</span>+((img(i-<span style="color:#800080;">1</span>,j+<span style="color:#800080;">1</span>)-img(i+<span style="color:#800080;">1</span>,j+<span style="color:#800080;">1</span>))/<span style="color:#800080;">2</span>)^<span style="color:#800080;">2</span><span style="color:#000000;">);
Uw</span>=sqrt((img(i,j)-img(i,j-<span style="color:#800080;">1</span>))^<span style="color:#800080;">2</span>+((img(i-<span style="color:#800080;">1</span>,j-<span style="color:#800080;">1</span>)-img(i+<span style="color:#800080;">1</span>,j-<span style="color:#800080;">1</span>))/<span style="color:#800080;">2</span>)^<span style="color:#800080;">2</span><span style="color:#000000;">);
Us</span>=sqrt((img(i,j)-img(i+<span style="color:#800080;">1</span>,j))^<span style="color:#800080;">2</span>+((img(i+<span style="color:#800080;">1</span>,j-<span style="color:#800080;">1</span>)-img(i+<span style="color:#800080;">1</span>,j+<span style="color:#800080;">1</span>))/<span style="color:#800080;">2</span>)^<span style="color:#800080;">2</span><span style="color:#000000;">);
Wn</span>=<span style="color:#800080;">1</span>/sqrt(Un^<span style="color:#800080;">2</span>+a^<span style="color:#800080;">2</span><span style="color:#000000;">);
We</span>=<span style="color:#800080;">1</span>/sqrt(Ue^<span style="color:#800080;">2</span>+a^<span style="color:#800080;">2</span><span style="color:#000000;">);
Ww</span>=<span style="color:#800080;">1</span>/sqrt(Uw^<span style="color:#800080;">2</span>+a^<span style="color:#800080;">2</span><span style="color:#000000;">);
Ws</span>=<span style="color:#800080;">1</span>/sqrt(Us^<span style="color:#800080;">2</span>+a^<span style="color:#800080;">2</span><span style="color:#000000;">);
Hon</span>=Wn/((Wn+We+Ww+Ws)+<span style="color:#000000;">lambda);
Hoe</span>=We/((Wn+We+Ww+Ws)+<span style="color:#000000;">lambda);
How</span>=Ww/((Wn+We+Ww+Ws)+<span style="color:#000000;">lambda);
Hos</span>=Ws/((Wn+We+Ww+Ws)+<span style="color:#000000;">lambda);
Hoo</span>=lambda/((Wn+We+Ww+Ws)+<span style="color:#000000;">lambda);
imgn(i,j)</span>=Hon*img(i-<span style="color:#800080;">1</span>,j)+Hoe*img(i,j+<span style="color:#800080;">1</span>)+How*img(i,j-<span style="color:#800080;">1</span>)+Hos*img(i+<span style="color:#800080;">1</span>,j)+Hoo*<span style="color:#000000;">img(i,j);
</span><span style="color:#0000ff;">end</span>
<span style="color:#0000ff;">end</span>
<span style="color:#0000ff;">end</span><span style="color:#000000;">
img</span>=<span style="color:#000000;">imgn;
end
figure;
imshow(img,[])