TV算法

转载:(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,[])

复制代码
发布了0 篇原创文章 · 获赞 0 · 访问量 84

猜你喜欢

转载自blog.csdn.net/weixin_43556670/article/details/105646030
今日推荐