0001 function imgInpainted = inpaintTV(img, mask, epsilon, relTolerance, maxIters, outDemoVideo)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 if nargin < 3 || isempty(epsilon)
0014 epsilon = 1e-2;
0015 end
0016 if nargin < 4 || isempty(relTolerance)
0017 relTolerance = 1e-8;
0018 end
0019 if nargin < 5 || isempty(maxIters)
0020 maxIters = 100000;
0021 end
0022 createDemoVideo = false;
0023 if nargin > 5 && ~isempty(outDemoVideo)
0024
0025 createDemoVideo = true;
0026 video = VideoWriter(outDemoVideo,'Motion JPEG AVI');
0027 video.Quality = 100;
0028 open(video);
0029 itersPerFrame = 10;
0030 end
0031
0032
0033 Pi = @(f)f.*(1-mask) + img.*mask;
0034 Amplitude = @(u)sqrt(sum(u.^2,3)+epsilon^2);
0035 Neps = @(u)u./repmat(Amplitude(u), [1 1 2]);
0036 G = @(f)-div(Neps(grad(f)));
0037
0038
0039 tau = .9*epsilon/4;
0040
0041
0042 imgInpainted = img;
0043 energyPrev = 0;
0044 for i=1:maxIters
0045 energy = sum(sum(Amplitude(grad(imgInpainted))));
0046 imgInpainted = Pi( imgInpainted - tau*G(imgInpainted) );
0047
0048 if abs(energy-energyPrev) < relTolerance
0049 break;
0050 end
0051 energyPrev = energy;
0052
0053
0054 if createDemoVideo && mod(i-1, itersPerFrame) == 0
0055 imagesc(imgInpainted'); axis xy; colorbar;
0056 frame = getframe(gcf);
0057 writeVideo(video, frame);
0058 end
0059 end
0060
0061 if i == maxIters
0062 warning('Maximum number of iterations reached');
0063 end
0064
0065 if createDemoVideo, close(video); end
0066
0067 end