图像修复基于crimins算法解决图像修复问题matlab源码
Posted Matlab走起
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像修复基于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')
完整代码或者代写添加QQ1575304183
往期回顾>>>>>>
以上是关于图像修复基于crimins算法解决图像修复问题matlab源码的主要内容,如果未能解决你的问题,请参考以下文章
基于微软开源深度学习算法,用 Python 实现图像和视频修复