图像纹理分析,空洞填补

简介

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


结果显示

  对应的处理结果如下:
                      
              原图像                      结果图像

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值