1. 参考文献
[1] Zhang, H Y, Wu B, Peng Q C, et al. Digital Image Inpainting Based on P-Harmonic Energy Minimization[J]. 电子学报:英文版, 2007, (3):525-530.
2. p-Harmonic模型实现
2.1 p-Harmonic模型
% demo_P_Harmnic.m
% Author: HSW
% Date: 2015/3/27
% HARBIN INSTITUTE OF TECHNOLOGY
%
% set matlab
close all;
clear all;
clc;
options.null = 0;
% read image
Img = imread('Image\butterfly.bmp');
% Img = imread('Image\peppers.bmp');
Img = rgb2gray(Img);
Img = im2double(Img);
if max(Img(:)) < 2
Img = Img*255;
end
FlagColor = (size(Img,3) == 3);
% set mask
SetMask = 2;
if SetMask == 1
% read mask
Mask = imread('Mask\peppers_mask512.bmp');
Mask = Mask > 5;
MFlagColor = (size(Mask,3) == 3);
if MFlagColor ~= FlagColor && FlagColor == 1
Mask = repmat(Mask,[1,1,3]);
elseif MFlagColor ~= FlagColor && FlagColor == 0
Mask = Mask(:,:,1);
end
elseif SetMask == 2
% Interactively set mask
if not(exist('grab_mode'))
grab_mode = 'line';
end
options.grab_mode = grab_mode;
if not(exist('grab_radius'))
grab_radius = 4;
end
switch grab_mode
case 'points'
options.r = grab_radius;
U = grab_inpainting_mask(Img,options);
case 'line'
options.r = grab_radius;
[U,options.point_list] = grab_inpainting_mask(Img,options);
end %switch
Iin = find(U(:,:,1) == Inf);
Iout = find(U(:,:,1) ~= Inf);
m1 = length(Iin); % 缺损点的总数
% product the mask
Mask = zeros(size(Img));
if FlagColor == 1
tmpMask = zeros([size(Img,1),size(Img,2)]);
for channel = 1:3
tmpMask(Iin) = 1 ;
Mask(:,:,channel) = tmpMask;
end
else
Mask(Iin) = 1; % 缺损区域为1
end % if FlagColor
end% if SetMask
FlagNoise = 1; % default noiseless
if FlagNoise == 1
sigma = 25;
NoiseImg = Img + sigma*randn(size(Img));
nImg = (1-Mask).*NoiseImg;
else
nImg = (1-Mask).*Img;
end
PSNRin = 10*log10(255^2/mean((Img(:)-nImg(:)).^2));
InImg = nImg;
% Initial Image
if FlagColor == 1
Positions = find(Mask(:,:,1) == 1);
for channel = 1:3
tmpnImg = nImg(:,:,channel);
tmpnImg(Positions) = floor(255*rand(1,length(Positions))) + 1;
InImg(:,:,channel) = tmpnImg;
end
else
Positions = find(Mask == 1);
randValue = floor(255*ra