【圖像修復】基于crimins算法解決圖像修復問題matlab源碼
一、前言
圖像修復的目的是利用圖像中已知信息根據(jù)一定規(guī)則對丟失區(qū)域進行修復。近年,隨著計算機技術(shù)和多媒體技術(shù)的不斷發(fā)展,圖像修復技術(shù)不僅用于傳統(tǒng)的破損照片修復,而且也應用在攝影、醫(yī)學、印刷、網(wǎng)絡傳輸、考古和交通監(jiān)控等領(lǐng)域的圖像或視頻修復中,成為計算機圖形學和計算機視覺中的研究熱點。

四個方法有各自的特點和應用背景,其中使用頻率較高的,易理解的方法為基于樣本塊中的基于匹配的方法。所以針對這個方向,提供了一些可供研究學習的文獻,并且簡要的介紹了文獻的內(nèi)容,方便同學學習。
Criminisi 等人[4]首先提出基于匹配的樣本塊修復算法,隨后又大量的研究者參與研究對其的改進算法。主要分為兩方面:
(1)針對塊選擇方法(即填充順序);
(2)塊填充方法(即如何選擇 匹配塊以及如何填充)。
在填充順序方面,文獻[5]利用局部特征確定順序,張巖等人[6]利用梯度特征確定填充順序。文獻[7,8]根據(jù)待填充塊的 DCT系數(shù)決定填充順序。
在塊填充方面(即如何選擇匹配塊以及如何填充),張巖等人[6]利用圖像方向經(jīng)驗模型分解后的頻域信息尋找最優(yōu)匹配塊。Jemi等人[7]利用邊緣信息尋找最優(yōu)匹配塊。
文獻[1,2,3]作為綜述文獻細讀,了解基礎知識,然后對文獻[4,5,6,7,8]粗略閱讀,了解什么是圖像修復算法,算法研究的方法以及仿真結(jié)果是如何呈現(xiàn)的。
下一步精讀文獻[4,5,8],理解算法具體的實現(xiàn)原理和實現(xiàn)過程,在閱讀過程中,如果對英文的理解感覺有難度,可以先閱讀中文文獻[5,6]中對文獻[4]的描述。
建議仿真的文獻為[4]和[5],[4]為經(jīng)典算法,[5]為[4]的改進算法。所以仿真順序為先仿真文獻[4]后文獻[5],建議可以思考的問題:
(1)文獻[4]算法的優(yōu)點和缺點,并且在仿真過程中對此做出測試實驗。
(2)文獻[5]是對文獻[4]的改進,理解它是怎么改進的,改進的效果體現(xiàn)在的地方,不僅限于修復效果的提升,還有更多,比如運行速度等。
(3)更多問題可以自己在仿真的過程中發(fā)現(xiàn)并且驗證,這些都會是收獲。,
這里提到的8篇文獻,僅僅是拋磚引玉,并不是最新而且也不全面,如果想要更進一步全面的學習圖像修復領(lǐng)域,建議閱讀更多最新文獻。
二、criminisi算法分析
Criminisi算法通過在待修復區(qū)域邊緣上選取優(yōu)先權(quán)最高的像素點p,然后以p為中心構(gòu)造一個n×n大小的像素塊,然后在完好區(qū)域?qū)ふ遗c該模板塊最相似的樣本塊,并用找到的樣本塊更新模板塊中的待修復信息,最后更新已修復塊塊中像素點的置信度,并開始下一次迭代修復,直至修復完成。 圖1是Criminisi算法的修復原理



1、算法中的優(yōu)先權(quán)
Criminisi算法中計算優(yōu)先權(quán)的公式如(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; ? ? ? ?%梯度旋轉(zhuǎn)90°為等照度
%% 初始化
% ? C ? ? ? ? ? ? ?置信度項,為與圖像大小相同的矩陣
% ? D ? ? ? ? ? ? ?數(shù)據(jù)項,為與圖像大小相同的矩陣
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;%填充次數(shù)初始化
%% 開始填充
tic %開始計時
? ?
%% 找到最優(yōu)匹配快 Hq為一9*9矩陣,矩陣值為最優(yōu)匹配塊的坐標
? ?
? ?%找到最優(yōu)匹配快,Hq為一9*9矩陣,矩陣值為最優(yōu)匹配塊的坐標
? ?Hq = bestexemplar(damageImage, damageImage(rows,cols),fillRegion);
? ?%Hq = bestexemplar1(damageImage, damageImage(rows,cols), toFill', sourceRegion);
? ?% Update fill region 更新破損區(qū)域
? ?fillRegion(Hp(toFill)) = false; ? ? ? ? ? ? ? ?%Hp(toFill)表示只留下待修復點的坐標,使得待修復點的值為0
? ?% Propagate confidence
? ? C(Hp(toFill)) ?= C(p); ? ? ? ? ? ? ? ? ? ? ? ? %被去掉那塊的修復塊的置信度被更新,C代表sourceRegion,待修復點為0,已存在點為1;用優(yōu)先權(quán)最大的修復點的置信度來代替優(yōu)先權(quán)最大的塊的置信度
? ?
? ?
% ? ? ?Gx(Hp(toFill)) = Gx(Hq(toFill)); ? ? ? ? ? ? ? %用最優(yōu)匹配塊的向量梯度來更新優(yōu)先權(quán)最大的塊的梯度
% ? ? Gy(Hp(toFill)) = Gy(Hq(toFill));
? ?
? ?
? ?% Copy image data from Hq to Hp
? ?ind(Hp(toFill)) = ind(Hq(toFill)); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %最優(yōu)匹配塊的坐標來作為待修復塊的坐標
? ?damageImage(rows,cols) = ind2img(ind(rows,cols),damageImage); %ind(rows,cols)表示待修復塊的坐標范圍,該范圍已被最優(yōu)匹配塊的值所替代
? ?con=con+1;
? ? ?
%% 保存圖像
?imwrite(uint8(damageImage),strcat('indoor2_',num2str(con),'.jpg'))
?
end
toc
count=con %填充次數(shù)
OKImg= damageImage;
figure
imshow(OKImg, [])
imwrite(uint8(OKImg),'ok.jpg')




?