天天看點

基于改進Criminisi算法的圖像修複

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算法修複結果');

      
基于改進Criminisi算法的圖像修複

繼續閱讀