【图像修复】基于criminis算法实现图像修复附matlab代码

 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,两者相乘即为我们该点像素的填充优先级。

算法集体流程可以描述为:

  1. 读取待修复图片以及其掩膜

  2. 根据掩膜得到待修复区域的边缘轮廓

  3. 计算边缘轮廓填充次序(优先级)

  4. 针对对优先级最高的轮廓点,在原图已知区域寻找最佳匹配的图像块并进行填充

  5. 更新边缘轮廓,若边缘轮廓.size大于0,表示还未填充完毕,则回到步骤2更新轮廓,开启新一轮迭代,直到填充完毕(没有边缘轮廓点)

2 仿真代码

clear ;clcclose 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'))  endtoccount=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代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值