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