发明名称 一种基于CUDA的快速图像类比合成方法
摘要 一种基于CUDA的快速图像类比合成方法,包括如下步骤:1)生成源图像A,滤波后的图像A’,源图像B的高斯金字塔;2)当前合成第L层,对金字塔从粗糙层到精细层执行以下过程:2.1)对B′<sub>L+1</sub>超采样得到B′<sub>L</sub>;2.2)对B′<sub>L</sub>中的每个像素点q,采用基于GPU的全局搜索策略找到全局搜索最优解q<sub>global</sub>;2.3)对B′<sub>L</sub>中的每个像素点q,采用基于GPU的k-coherence搜索策略找到一致性搜索最优解q<sub>kcoh</sub>;2.4)如果全局搜索得到的结果更好,则将q<sub>Best</sub>赋值为q<sub>global</sub>,否则将q<sub>Best</sub>赋值为q<sub>kcoh</sub>,把q<sub>Best</sub>在A′<sub>L</sub>中的对应坐标保存在B′<sub>L</sub>(q)中;2.5)循环执行步骤2.2)~2.4)设定次数;3)对B’做合成放大,得到高分辨率的EHB’。本发明提升合成速度、提高合成质量。
申请公布号 CN102646271B 申请公布日期 2014.08.06
申请号 CN201210040962.0 申请日期 2012.02.22
申请人 浙江工业大学 发明人 范菁;史晓颖;汤颖;董天阳
分类号 G06T5/50(2006.01)I 主分类号 G06T5/50(2006.01)I
代理机构 杭州天正专利事务所有限公司 33201 代理人 王兵;王利强
主权项 一种基于CUDA的快速图像类比合成方法,其特征在于:所述合成方法包括如下步骤: 1)生成源图像A,滤波后的图像A’,源图像B的高斯金字塔; 2)当前合成第L层,对金字塔从粗糙层到精细层执行以下过程: 2.1)对B'<sub>L+1</sub>超采样得到B'<sub>L</sub>;所述步骤2.1)中,将B'<sub>L+1</sub>与纹理存储器绑定,每个线程执行的操作为:得到B'<sub>L</sub>(p)的坐标(u,v),取得B'<sub>L+1</sub>中(u/2,v/2)点颜色值color,B'<sub>L</sub>(p)的值为color*2+(u%2,v%2); 2.2)对B'<sub>L</sub>中的每个像素点q,采用基于GPU的全局搜索策略找到全局搜索最优解q<sub>global</sub>;所述步骤2.2)中,输入为A,A’,B金字塔L层对应的A<sub>L</sub>,A'<sub>L</sub>,B<sub>L</sub>图像,输出为B'<sub>L</sub>;B'<sub>L</sub>中每个像素点的RG通道保存了由全局搜索得到的最相似点的坐标q<sub>global</sub>,同时保留了其对应的距离;对B'<sub>L</sub>中的一点q,根据q点在B<sub>L</sub>,B'<sub>L</sub>的邻域在A<sub>L</sub>,A'<sub>L</sub>中找到和其最相似的点; 所述步骤2.2)中,所述全局搜索策略的过程为: 设R={r<sub>1</sub>,r<sub>2</sub>,...,r<sub>m</sub>}为参考集合,Q={q<sub>1</sub>,q<sub>2</sub>,...,q<sub>n</sub>}为查询集合;对于纹理合成来说,m为样图中的点个数,n为查询点个数;N()代表邻域向量,N(r)和N(q)为收集图像中邻域得到的向量;公式(1)表示,对于查询集合Q中的每个点q,在R中根据L<sub>2</sub>度量准则找到k个与其最相似点的集合C<sub>1..k</sub>(q),也就是对于每个点q,在集合R中找到和其邻域距离最小的前k个点, <img file="FDA0000463316300000011.GIF" wi="1132" he="93" />分解该运算,得到公式(2): <img file="FDA0000463316300000012.GIF" wi="1286" he="93" />从公式(2)中可以看出<img file="FDA0000463316300000013.GIF" wi="169" he="82" />不依赖于R中点,<img file="FDA0000463316300000014.GIF" wi="158" he="86" />也不依赖于查询点 q,因此对于q点与R中点比较,只要计算<img file="FDA0000463316300000021.GIF" wi="508" he="93" />部分即可;收集邻域向量得到参考集合对应的矩阵RMatrix=|N(r<sub>1</sub>),N(r<sub>2</sub>),...,N(r<sub>n</sub>)|,查询集合对应的矩阵QMatrix=|N(q<sub>1</sub>),N(q<sub>2</sub>),...,N(q<sub>n</sub>)|;对于全局搜索来说,k取1,RMatrix根据A,A’中对应的点来获得,QMatrix根据B,B’中对应的点来获得;利用CUDA架构快速地进行此运算,在CUDA架构下程序被分为host端和device端,host端执行CPU上的操作,device端执行显卡上的操作,内核函数Kernel为CUDA运行在device端的并行计算函数,因此对Q进行分块,分批处理查询集合中的点,动态确定当前可分配的最大Q分块数;对于一个Q分块,计算分块中的点和参考集合中所有像素点间邻域的距离和坐标,采用插入排序法找到具有最小距离的前k个点的坐标集合, kernel函数计算步骤如下: Step1:收集RMatrix和QMatrix,在device端分配存储空间,把RMatrix、QMatrix拷贝给device端;在host端分配空间indexMatrix,存储计算得到的最相似点坐标; Step2:查找显存中剩余空间,确定每次可同时搜索的Q集合大小maxQueryNum, Step3:根据maxQueryNum,对Q分块,对Q的每一个分块: Step3.1:计算距离<img file="FDA0000463316300000022.GIF" wi="510" he="93" />Step3.2:找到距离最小的前k个最相似点集合C<sub>1..k</sub>(q) Step3.3将C<sub>1..k</sub>(q)中点的坐标拷贝到indexMatrix对应位置的内存中; 2.3)对B'<sub>L</sub>中的每个像素点q,采用基于GPU的k‑coherence搜索策略找到一致性搜索最优解q<sub>kcoh</sub>;所述步骤2.3)中,输入同样为A,A’,B金字塔L层对应的A<sub>L</sub>,A'<sub>L</sub>,B<sub>L</sub>图像,输出为B'<sub>L</sub>;B'<sub>L</sub>中每个像素点的RG通道保存了由k‑coherence 搜索得到的最相似点的坐标q<sub>kcoh</sub>;在用CUDA实现时,线程网格的分割为与图像大小相对应,每个线程块处理一个像素元素,它拥有的线程数为一个像素需要查找的coherence候选集个数,通过一个预处理过程,对于A和A’中的每个点,找到k个与其最相似的点,把这些点的坐标保存在纹理中; kernel函数计算步骤如下: Step1.在共享存储器中,声明类型为int4的distance数组,xy分量存储坐标,z分量存储距离,声明类型为uchar2的kcoh数组,把预处理得到的纹理中像素对应的坐标载入kcoh, Step2.每个线程访问共享内存,取出kcoh中的坐标,根据CUDA内建函数blockIdx.x,blockIdx.y获取待合成像素点位置,基于度量准则,计算两点邻域的之间的dist, Step3:线程块中的每个线程将计算得到的dist及其对应的样图坐标保存到distance数组中, Step4:当一个线程块中所有线程都计算完毕时,用树形规约算法找到具有最小dist的样图坐标,即为所求的最相似点坐标, 采用用树形规约算法搜索最小值,每次比较时,存储在前半部分线程中的数据和存储在后半部分线程中的数据相比较,取较小值更新前半部分的数据,每次迭代后减半,直到最后剩下一个值,即为所求的最小值,数据单元之间的比较由多线程并行执行,在CUDA架构下,使用cudaMallocHost函数直接在主机端内存中取一块页面锁定内存; 2.4)如果全局搜索得到的结果更好,则将q<sub>Best</sub>赋值为q<sub>global</sub>,否则将q<sub>Best</sub>赋值为q<sub>kcoh</sub>,把q<sub>Best</sub>在A'<sub>L</sub>中的对应坐标保存在B'<sub>L</sub>(q)中;所述步骤2.4)中,根据coherenceFac比较步骤2.2),2.3)计算得到的结果,得到q<sub>Best</sub>的取值,比较准则如下: 若d(q<sub>kcoh</sub>,q)&gt;d(q<sub>global</sub>,q)(1+coherencefac*2<sup>L</sup>),则q<sub>Best</sub>=q<sub>global</sub>,否则q<sub>Best</sub>=q<sub>kcoh</sub>, 两个邻域的相似性度量准则定义如下,同时比较A,A’和B,B’邻域的特征向量: d(p,q)=||F<sub>A</sub>(p)‑F<sub>B</sub>(q)||<sub>L2</sub>+||F<sub>A'</sub>(p)‑F<sub>B'</sub>(q)||<sub>L2</sub>, 在RGB空间下,选取RGB颜色值作为特征向量;在YIQ空间下,选取亮度Y作为特征向量,将合成得到的新Y值与原有的IQ值组合还原成RGB图像;对于艺术风格学习应用来说,使用亮度分布的平均值和方差对图像的Y通道进行线性变换,对原有的YIQ空间进行转化(remap): <img file="FDA0000463316300000041.GIF" wi="587" he="129" />其中Y(P)是图像A中P点的亮度(Y)值,μ<sub>A</sub>和μ<sub>B</sub>是图像A的亮度(Y)平均值,σ<sub>A</sub>和σ<sub>B</sub>是图像A的亮度(Y)方差,对A’做同样的映射以保持一致性; 2.5)循环执行步骤2.2)~2.4),根据设定的次数,得到滤波后的图像B’; 3)对滤波后的图像B’做合成放大,得到高分辨率的EHB’。 
地址 317299 浙江省天台县赤城街道劳动路277号世纪大厦5楼浙江工业大学天台校地联盟中心