1 内容介绍
该算法出自Criminisi的论文
Region Filling and Object Removal by Exemplar-Based Image Inpainting
该算法只要思路是利用图片的已知区域对待修复区域进行填充。而填充的顺序是根据计算优先级确定的,填充的基本单位是自定义大小的像素块。
先来看一下论文中比较重要的两个图片,
图一介绍了填充的基本原理:
将图像分为已知区域(source region)和待填充或移除区域(target region),填充从target region的边界开始,以边界点p为中心,设置块的大小,形成像素块(图b),然后在已知区域中根据匹配准则找到相似的块,如图c以q'及q"为中心的两个块,最后选取最佳匹配的块进行填充(图d)。
图二介绍了边缘轮廓填充优先级的计算准则:
正在上传…重新上传取消
红色箭头为轮廓的法线法向(垂直于轮廓切线),蓝色为点p像素梯度方向旋转90°。
根据这两个量我们可以计算两个值:
分别是confidence term和data term,两者相乘即为我们该点像素的填充优先级。
算法集体流程可以描述为:
-
读取待修复图片以及其掩膜
-
根据掩膜得到待修复区域的边缘轮廓
-
计算边缘轮廓填充次序(优先级)
-
针对对优先级最高的轮廓点,在原图已知区域寻找最佳匹配的图像块并进行填充
-
更新边缘轮廓,若边缘轮廓.size大于0,表示还未填充完毕,则回到步骤2更新轮廓,开启新一轮迭代,直到填充完毕(没有边缘轮廓点)
2 仿真代码
clear ;clc
close all;
%% 原始图像
srcImage= rgb2gray(imread('bird12mask.bmp'));
% srcImage= imread('lena.jpg');
srcImage= srcImage(150:375,50:298);
% %% 破损图像
% damage_size_m=20; damage_size_n=20; %破损块大小
damageImage= srcImage;
% damageImage(20:20+damage_size_m,125:125+damage_size_n)= 0;
% damageImage= rgb2gray(imread('pepper4mask.bmp'));
% damageImage= imread('111..jpg');
%
% figure
% imshow(uint8(damageImage)); %破损图像
% imwrite(uint8(damageImage),'LLmask.jpg')
%% 等照度
damageImage=double(damageImage);
,1;1,1,1],'same')>0); %外 进行卷积以找到边界,dR为一组列向量,表示边界坐标
% dR = find(conv2(double(fillRegion),[1,1,1;1,-8,1;1,1,1],'same')<0);
%% 计算数据项,计算法向量,计算等照度
%更新等照度
[Gx, Gy] = gradient(double(damageImage)); %破损图梯度
Gx = Gx / 255;
Gy = Gy / 255;
temp = Gx; Gx = -Gy; Gy = temp;
%计算法向量
%% 计算置信度项C(p)
for k=dR'
Hp = getpatch(sz, k); %调用getpatch()函数
q = Hp(~(fillRegion(Hp))); %fillRegion(Hp)是9*9的块,待填充区域是1,源区域是0
%q是列向量,由源区域像素点构成
C(k) = sum(C(q))/numel(Hp); %计算置信度,numel()面积即像素数
end
%%计算
P = C(dR).*D(dR); %计算优先权P(p)
%% 找到权值优先所对应的点p
% 找到最大优先权值的块Hp,Hp为一9*9矩阵,矩阵值是待修复块坐标
[unused,ndx] = max(P); %返回P的最大值及P的位置
p = dR(ndx(1)); %p为待修复块的中心坐标点
[Hp,rows,cols] = getpatch(sz,p); %找到优先权最大的块,Hp为一9*9矩阵,矩阵值是待修复块坐标
toFill = fillRegion(Hp); %fillRegion为待修复点为1,已存在点为0,toFill为9*9的块
%% 找到最优匹配快 Hq为一9*9矩阵,矩阵值为最优匹配块的坐标
%找到最优匹配快,Hq为一9*9矩阵,矩阵值为最优匹配块的坐标
Hq = bestexemplar(damageImage, damageImage(rows,cols),fillRegion);
%Hq = bestexemplar1(damageImage, damageImage(rows,cols), toFill', sourceRegion);
% Update fill region 更新破损区域
fillRegion(Hp(toFill)) = false; %Hp(toFill)表示只留下待修复点的坐标,使得待修复点的值为0
% Propagate confidence
C(Hp(toFill)) = C(p); %被去掉那块的修复块的置信度被更新,C代表sourceRegion,待修复点为0,已存在点为1;用优先权最大的修复点的置信度来代替优先权最大的块的置信度
% Gx(Hp(toFill)) = Gx(Hq(toFill)); %用最优匹配块的向量梯度来更新优先权最大的块的梯度
% Gy(Hp(toFill)) = Gy(Hq(toFill));
% Copy image data from Hq to Hp
ind(Hp(toFill)) = ind(Hq(toFill)); %最优匹配块的坐标来作为待修复块的坐标
damageImage(rows,cols) = ind2img(ind(rows,cols),damageImage); %ind(rows,cols)表示待修复块的坐标范围,该范围已被最优匹配块的值所替代
con=con+1;
%% 保存图像
% imwrite(uint8(damageImage),strcat('indoor2_',num2str(con),'.bmp'))
end
toc
count=con %填充次数
OKImg= damageImage;
figure,
title('原图')
subplot(121)
imshow(uint8(srcImage)); %破损图像
title('修复图')
subplot(122)
imshow(OKImg, [])
imwrite(uint8(OKImg),'bbGX.bmp')
3 运行结果
4 参考文献
[1]李斌. 基于MATLAB的图像修复算法的研究与实现[J]. 宿州教育学院学报, 2015, 18(6):2.
[2]钱宗峰, 王星全, 王文交. 基于整体变分模型的图像修复算法仿真实现[J]. 现代电子技术, 2012, 35(16):4.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。