图像纹理分析,空洞填补
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中保存到所有空洞区域坐标整个处理完毕。
结果显示
对应的处理结果如下:
原图像 结果图像
相关文章推荐
- 设计模式:观察者模式(Observer)
- 关于libevent的环境搭建和编译使用问题
- 站立会议第七天
- 初学Ajax(二)
- C++ 11(三)
- 跟着编程之美学算法——最长递增子序列
- HDU 1282 回文数猜想(数学题)
- LeetCode之Counting Bits
- 每日Scrum(7)
- java---Serializable(序列化)
- 电动机绕组的接线舞曲
- 机器学习之多变量线性回归(Linear Regression with multiple variables)
- hdu 1076 An Easy Task
- android 语音合成的简单实现
- 如何教女朋友一起编程
- 程序员的自我修养_之三_曾国藩与左宗棠
- 个人工作总结07
- 关于Java的构造器和直接为成员变量赋值的区别
- iOS边练边学--iOS中的(ARC下)单粒模式(GCD实现)
- 【Linux C 王者归来】【第四章】【指针与字符串】