您的位置:首页 > 其它

图像纹理分析,空洞填补

2016-04-25 20:15 288 查看


简介

  本篇主要是对纹理分析,空洞填补实现的笔记记录。
简单的原理概括就是:找到在图像上,和以每个空洞像素为中心的矩形区域纹理最相似的块,用该块对应位置像素,填充该空洞区域像素。
参考论文: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中保存到所有空洞区域坐标整个处理完毕。



结果显示

  对应的处理结果如下:





原图像                      结果图像
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: