簡介
本篇主要是對紋理分析,空洞填補實現的筆記記錄。 簡單的原理概括就是:找到在圖像上,和以每個空洞像素爲中心的矩形區域紋理最相似的塊,用該塊對應位置像素,填充該空洞區域像素。 參考論文: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中保存到所有空洞區域座標整個處理完畢。
結果顯示
對應的處理結果如下:
原圖像 結果圖像