• MATLAB TV模型图像修复


    曾经想要实现过Bertalmio图像修复算法,无奈自身实力不够,耗费两天时间也没能实现。昨天博客上有人问到TV模型,这个模型我过去是没听说过的,于是就找来相关论文研究了一下,发现TV模型也可以用来修复图像,于是就有了想实现的想法。用到的偏微分方程技巧和各项异性扩散很像。

    先看看效果吧:

    原lena:

    随手截的噪声图:

    合成的需要修复的图:

    修复后的图(没有处理边界):

    对于从来没有接触过图像修复的我来说,效果真是惊艳了。

    下面介绍运算步骤:

    和各项异性扩散类似,整个算法也是基于迭代的,迭代公式如下:

    其中Io代表当前处理的像素,Ip代表邻域像素,p就可以取news四邻域。H定义如下:

    这里的lambda为自定义的平滑系数。wp的定义如下:

    这里a同样是自定义。

    结合上图在看up散度,将p取e来看ue定义如下:

    这里的h就是1了。

    如此上述所有公式倒着运算不断迭代就可以了,迭代次数可自定义,或是不断迭代直到某条件成立都是可以的。

    matlab代码如下,并不长,变量名和公式名是一一对应的:

     1 close all;
     2 clear all;
     3 clc;
     4 
     5 img=double(imread('lena.jpg'));
     6 mask=rgb2gray(imread('ma.jpg'))>160;
     7 [m n]=size(img);
     8 for i=1:m
     9     for j=1:n
    10         if mask(i,j)==0
    11            img(i,j)=0; 
    12         end
    13     end
    14 end
    15 imshow(img,[]);     %合成的需要修复的图像
    16 
    17 lambda=0.2;
    18 a=0.5;
    19 imgn=img;
    20 for l=1:300         %迭代次数
    21     for i=2:m-1
    22         for j=2:n-1
    23             if mask(i,j)==0     %如果当前像素是被污染的像素,则进行处理
    24                                             
    25                 Un=sqrt((img(i,j)-img(i-1,j))^2+((img(i-1,j-1)-img(i-1,j+1))/2)^2);
    26                 Ue=sqrt((img(i,j)-img(i,j+1))^2+((img(i-1,j+1)-img(i+1,j+1))/2)^2);
    27                 Uw=sqrt((img(i,j)-img(i,j-1))^2+((img(i-1,j-1)-img(i+1,j-1))/2)^2);
    28                 Us=sqrt((img(i,j)-img(i+1,j))^2+((img(i+1,j-1)-img(i+1,j+1))/2)^2);
    29 
    30                 Wn=1/sqrt(Un^2+a^2);
    31                 We=1/sqrt(Ue^2+a^2);
    32                 Ww=1/sqrt(Uw^2+a^2);
    33                 Ws=1/sqrt(Us^2+a^2);
    34 
    35                 Hon=Wn/((Wn+We+Ww+Ws)+lambda);
    36                 Hoe=We/((Wn+We+Ww+Ws)+lambda);
    37                 How=Ww/((Wn+We+Ww+Ws)+lambda);
    38                 Hos=Ws/((Wn+We+Ww+Ws)+lambda);
    39 
    40                 Hoo=lambda/((Wn+We+Ww+Ws)+lambda);
    41 
    42                 imgn(i,j)=Hon*img(i-1,j)+Hoe*img(i,j+1)+How*img(i,j-1)+Hos*img(i+1,j)+Hoo*img(i,j);
    43             
    44             end
    45         end
    46     end
    47     img=imgn;
    48     
    49 end
    50 
    51 figure;
    52 imshow(img,[])

     

  • 相关阅读:
    leetcode319
    leetcode516
    leetcode46
    leetcode337
    leetcode287
    leetcode328
    leetcode241
    2018-6-30-dotnet-设计规范-·-抽象类
    2018-6-30-dotnet-设计规范-·-抽象类
    2018-8-10-WPF-如何画出1像素的线
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13646586.html
Copyright © 2020-2023  润新知