圖像紋理分析,空洞填補

簡介

  本篇主要是對紋理分析,空洞填補實現的筆記記錄。
簡單的原理概括就是:找到在圖像上,和以每個空洞像素爲中心的矩形區域紋理最相似的塊,用該塊對應位置像素,填充該空洞區域像素。
參考論文:Texture Synthesis by Non-parametric Sampling

具體實現

紋理提取

  1、輸入的原圖像爲src,設置區域塊大小爲:WindowSize;創建一張空白圖片SampleImage,size爲((2*windowSize+1)*(2*windowSize+1),src.width * src.height)。
  2、原圖像上從頭開始,依次取出Rect(2*windowSize+1, 2*windowSize+1)大小的塊區域,填入到圖像SampleImage每一行中。
  3、依次檢測SampleImage每一行中像素值是否有值爲0,表示包含空洞區域,如果有,則該行從SampleImage中刪除。
原圖像和得到的SampleImage如下:
   原圖像  
                                                SampleImage

掩碼計算

  這裏填充空洞的過程,是從空洞的外圈,一圈一圈的往裏面填,知道空洞整個填滿。因此每一輪的掩碼獲取方式爲:1、提取出當前待處理圖片的非空洞區域爲pic1;2、對非空洞區域進行膨脹得到pic2;3、pic2 - pic1,得到我們需要的掩碼圖像。
  對應結果如下:
                      

高斯權重覈計算

  1、根據掩碼圖像,找到Src圖像上,對應像素點座標,保存到結構SrcMaskAddr中。
  2、以第一個待處理的像素點爲中心,在Src上取出一個Rect((2 * WindowSize + 1), (2 * WindowSize + 1))矩形區域Template;
    3、對該矩形區域取掩碼ValidMask,將區域中位於空洞部分的,置爲0,其他置爲1.
    4、生成一個高斯核GaussMask,size爲(2 * WindowSize + 1), (2 * WindowSize + 1)。
    5、將GaussMask與掩碼ValidMask相乘,得到非空洞區域的高斯核:dotmask
    5、dotmask所有子項相加,得到權重結果:TotWeight

塊相似度計算

  1、新建一個tempmtx,size和SampleImage一致,將Template中所有數據,保存到tempmtx第一行中,接着tempmtx將第一行數據,複製到它所有列中。
  2、同樣的操作,將dotmask所有子項作爲爲一行,複製出size和SampleImage一致的結構:dotmask2。
  3、將tempmtx和SampleImage對應相減,接着對差值求平均,保存到dist。
  4、將dist和dotmask2相乘,接到結果SDD。
  5、將SDD每一行相加,得到SDD2。
注意:這裏的SDD2保存的就是:當前處理塊tempmtx和SampleImage上保存的圖像所有紋理,做比較後的相似度結果。

結果選取

  1、比較SDD2中所有元素值,對應元素值最小的那塊,作爲目標塊,該塊的中心像素值,填充到矩形塊tempmtx中心上,該空洞像素點就被填充了。
  2、不斷的輪詢遍歷,直到SrcMaskAddr中保存到所有空洞區域座標整個處理完畢。


結果顯示

  對應的處理結果如下:
        
              原圖像                      結果圖像

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章