【图像修复】基于crimins算法解决图像修复问题matlab源码

一、前言

图像修复的目的是利用图像中已知信息根据一定规则对丢失区域进行修复。近年,随着计算机技术和多媒体技术的不断发展,图像修复技术不仅用于传统的破损照片修复,而且也应用在摄影、医学、印刷、网络传输、考古和交通监控等领域的图像或视频修复中,成为计算机图形学和计算机视觉中的研究热点。
在这里插入图片描述
四个方法有各自的特点和应用背景,其中使用频率较高的,易理解的方法为基于样本块中的基于匹配的方法。所以针对这个方向,提供了一些可供研究学习的文献,并且简要的介绍了文献的内容,方便同学学习。
Criminisi 等人[4]首先提出基于匹配的样本块修复算法,随后又大量的研究者参与研究对其的改进算法。主要分为两方面:
(1)针对块选择方法(即填充顺序);
(2)块填充方法(即如何选择 匹配块以及如何填充)。
在填充顺序方面,文献[5]利用局部特征确定顺序,张岩等人[6]利用梯度特征确定填充顺序。文献[7,8]根据待填充块的 DCT系数决定填充顺序。
在块填充方面(即如何选择匹配块以及如何填充),张岩等人[6]利用图像方向经验模型分解后的频域信息寻找最优匹配块。Jemi等人[7]利用边缘信息寻找最优匹配块。
文献[1,2,3]作为综述文献细读,了解基础知识,然后对文献[4,5,6,7,8]粗略阅读,了解什么是图像修复算法,算法研究的方法以及仿真结果是如何呈现的。
下一步精读文献[4,5,8],理解算法具体的实现原理和实现过程,在阅读过程中,如果对英文的理解感觉有难度,可以先阅读中文文献[5,6]中对文献[4]的描述。
建议仿真的文献为[4]和[5],[4]为经典算法,[5]为[4]的改进算法。所以仿真顺序为先仿真文献[4]后文献[5],建议可以思考的问题:
(1)文献[4]算法的优点和缺点,并且在仿真过程中对此做出测试实验。
(2)文献[5]是对文献[4]的改进,理解它是怎么改进的,改进的效果体现在的地方,不仅限于修复效果的提升,还有更多,比如运行速度等。
(3)更多问题可以自己在仿真的过程中发现并且验证,这些都会是收获。,
这里提到的8篇文献,仅仅是抛砖引玉,并不是最新而且也不全面,如果想要更进一步全面的学习图像修复领域,建议阅读更多最新文献。

二、criminisi算法分析

Criminisi算法通过在待修复区域边缘上选取优先权最高的像素点p,然后以p为中心构造一个n×n大小的像素块,然后在完好区域寻找与该模板块最相似的样本块,并用找到的样本块更新模板块中的待修复信息,最后更新已修复块块中像素点的置信度,并开始下一次迭代修复,直至修复完成。 图1是Criminisi算法的修复原理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1、算法中的优先权
Criminisi算法中计算优先权的公式如(1)所示:
在这里插入图片描述
在这里插入图片描述

 
clear ;clc
close all;
 
 
%% 原始图像
srcImage= imread('indoor2.jpg');
figure,
imshow(uint8(srcImage));      %破损图像
 
%% 破损图像 
damage_size_m=60;   damage_size_n=30;             %破损块大小
damageImage= srcImage;
damageImage(140:140+damage_size_m,70:70+damage_size_n)= 0;
 
figure
imshow(uint8(damageImage));      %破损图像
 
%% 等照度
damageImage=double(damageImage);
 
[Gx, Gy] = gradient(damageImage);          %图像梯度
Gx = Gx / 255;
Gy = Gy / 255;
temp = Gx; Gx = -Gy; Gy = temp;        %梯度旋转90°为等照度
 
%% 初始化
%   C              置信度项,为与图像大小相同的矩阵
%   D              数据项,为与图像大小相同的矩阵
 
fillRegion = damageImage == 0;     %fillRegion为待修复点为1,已存在点为0
sourceRegion = ~fillRegion;        %sourceRegion待修复点为0,已存在点为1
 
sz = size(damageImage);
ind = reshape(1:sz(1)*sz(2),sz(1),sz(2));       %找出各点的在从列中得到的坐标
 
C = double(sourceRegion);          %待修复点为0,已存在点为1;
D = repmat(-.1,sz);
con=0;%填充次数初始化
%% 开始填充
 
tic %开始计时
 
 
    
%% 找到最优匹配快 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),'.jpg'))
  
 
end
toc
count=con %填充次数
OKImg= damageImage;
figure
imshow(OKImg, [])
imwrite(uint8(OKImg),'ok.jpg')
 
 
 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Matlab科研辅导帮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值