1、内容簡介
略
516-可以交流、咨詢、答疑
2、内容說明
摘 要:針對 Criminisi算法難以獲得理想的修複效果,且存在修複時間過長等缺陷,提出一種改進 Criminisi算法的 圖像修複算法。改進優先權計算方式找到最優待修複塊,完善最優比對塊搜尋政策,找到最優比對塊,采用新的置信 值更新方式以獲得更為理想修複效果,通過仿真實驗測試算法性能,結果表明,相較于 Criminisi算法,改進 Criminisi 算法不僅獲得了較理想的圖像修複效果,而且大幅度減少了修複時間,提高了圖像修複的效果。
關鍵詞:圖像修複;Criminisi算法;優先級;圖像紋理
随着計算機圖像技術的迅速發展,其在生物醫學、 工業生産、遙感測繪等領域得到了成功的應用。但是在 圖像拍攝和采集過程中,由于受到外界因素的幹擾,不可 避免會丢失部分資訊,一些區域缺失,影響圖像品質[1]。 圖像修複技術是指根據已知資訊,對修複區域内丢失信 息進行補充,提高圖像在視覺上的真實性,已經成為圖 像處理領域的研究熱點和重點[2]。 針對圖像修複問題,學者們投入了大量的時間和精 力進行相關研究,提出了一些圖像修複算法,目前主要 分為兩類方法:基于非紋理圖像修複和基于紋理修複方 法[3]。基于非紋理的圖像修複方法主要是利用待修複區 域附近的已知資訊,按一定的規則向待修複區域蔓延, 如文獻[4]提出的基于高階偏微分的圖像修複算法,文 獻[5]提出的基于整體變分(TV)模型的圖像修複算法 等,它們适合于小區域的圖像修複,但如果待修複的區 域比較大,難以獲得比較理想的修複效果。文獻[6]提 出基于先驗模型的圖像修複算法,對于結構資訊的圖 像,可以得到較好的修複效果,但是對于含有豐富紋理 圖像,修複效果較差。基于紋理綜合的修複方法指利用 塊比對選取合适的紋理塊來修複,其中 Criminisi算法是 最為經典的紋理圖像修複算法[7],其首先從圖像完好區 域中尋找與待修複區域最比對的像素塊,然後将其填 充到受損區域,修複效果較好。然而在實際應用過程, Criminisi算法存在一些不足,如出現馬賽克效應和紋理 混亂現象。為了克服 Criminisi算法的不足,國内外一些 學者在該算法的基礎上,提出了一些改進 Criminisi圖像 修複算法[8-11],但是這些算法都存在各自的缺陷,如何提 高圖像修複效果,值得進一步研究。 為了獲得理想的修複效果,針對 Criminisi算法存在的不足,提出一種改進 Criminisi 算法的圖像修複算法, 并通過仿真實驗測試算法的可行性和優越性。首先改 進優先權計算方式找到最優待修複塊,然後完善最優匹 配塊搜尋政策,并找到最優比對塊,最後采用新的置信 值更新方式以獲得更為理想的修複效果,并通過仿真實 驗測試算法性能。結果表明,相對于 Criminisi 算法,改 進 Criminisi算法不僅得到了理想的圖像修複效果,而且 大幅度減少了修複時間,提高了圖像的修複效率。
3、仿真分析
function [Psnr,inpaintedImg] =RGB_Criminisi(imagepath,maskpath,fillColor)
%Criminisi算法修複彩色圖像
img0=imagepath;
fillImg=maskpath;
img = double(fillImg);%要修複的圖像
fillRegion=img(:,:,1)==fillColor(1)&img(:,:,2)==fillColor(2)&img(:,:,3)==fillColor(3);
origImg = img;
ind = img2ind(img);
%------------------------------------------------------
in=ind;
[A,BB]=find(in); %得到每個點的坐标
%-----------------------------------------------------
sz = [size(img,1) size(img,2)];
z1=size(img,1);
z2=size(img,2);
sourceRegion = ~fillRegion;
% 求等照度線值
[Ix(:,:,3),Iy(:,:,3)] = gradient(img(:,:,3));
[Ix(:,:,2),Iy(:,:,2)] = gradient(img(:,:,2));
[Ix(:,:,1),Iy(:,:,1)] = gradient(img(:,:,1));
Ix = sum(Ix,3)/(3*255); Iy = sum(Iy,3)/(3*255);
temp = Ix; Ix = -Iy; Iy = temp; % 旋轉90度
%------------------------------------------------------------------------
%求得梯度值
[ix(:,:,3),iy(:,:,3)] = gradient(img(:,:,3));
[ix(:,:,2),iy(:,:,2)] = gradient(img(:,:,2));
[ix(:,:,1),iy(:,:,1)] = gradient(img(:,:,1));
ix = sum(ix,3)/(3*255); iy = sum(iy,3)/(3*255);
%------------------------------------------------------------------------
% 初始化置信度項C和資料項D值
C = double(sourceRegion);
D = repmat(-.1,sz);
% 修複(直到所有的破損區域都被修複完成)
while any(fillRegion(:))
% 尋找邊緣
dR = find(conv2(double(fillRegion),[1,1,1;1,-8,1;1,1,1],'same')>0);
[Nx,Ny] = gradient(double(~fillRegion));
N = [Nx(dR(:)) Ny(dR(:))];
N(~isfinite(N))=0;
% 計算置信度項值
for k=dR'
Hp = qukuai_9(sz,k);
q = Hp(~(fillRegion(Hp)));
C(k) = sum(C(q))/numel(Hp);
end
% 計算優先權
D(dR) = abs(Ix(dR).*N(:,1)+Iy(dR).*N(:,2)) /255;
priorities =C(dR).*D(dR);
% 找到優先權最大的塊 Hp
[unused,ndx] = max(priorities(:));
p = dR(ndx(1));
%---------------------
[Hp,rows,cols] = qukuai_9(sz,p); %9x9塊大小
toFill=fillRegion(Hp);
Wpatch=img(rows,cols,:); %得到待修複塊
%------------------------------------------------------------------------
%采用全局搜尋,尋找最佳比對塊
Hq=whole_match(z1,z2,img,Wpatch,fillColor);
%------------------------------------------------------------------------
% 更新填充區域
fillRegion(Hp(toFill)) = false;
% 更新C(p)值和等照度線值
C(Hp(toFill)) = C(p);
Ix(Hp(toFill)) = Ix(Hq(toFill));
Iy(Hp(toFill)) = Iy(Hq(toFill));
%-----------------------------------------------------------------------
%更新梯度值
ix(Hp(toFill)) = ix(Hq(toFill));
iy(Hp(toFill)) = iy(Hq(toFill));
%----------------------------------------------------------------------
% 從Hq複制圖像資訊到Hp
ind(Hp(toFill)) = ind(Hq(toFill));
img(rows,cols,:) = ind2img(ind(rows,cols),origImg);
end
inpaintedImg=img;
A=double(img0);
B=double(inpaintedImg);
Psnr=PSNR(A,B);
inpaintedImg=uint8(inpaintedImg);
figure;imshow(inpaintedImg); title('Criminisi算法修複結果');