[db:标题]

摘要:泊松融合还可以创建一些很有意思的图片,比如一张图片任意规格平铺,使用泊松融合后,平铺的边界处过渡的很自然,另外,对于两张图片,由于局部亮度等等的影响,导致拼接在一起时不自然,也可以使用泊松融合予以解决。
在【快速阅读二】从OpenCv的代码中扣取泊松融合算子(Poisson Image Editing)并稍作优化一文的最后,我曾经提到有个使用泊松融合来来实现Seamless Tiling的效果,我自己尝试去实现,暂时没有获取正确的结果,论文里给出的效果如下:   一开始我没怎么看这个tinling的意思,总是以为算法的目的是左图通过泊松融合的处理,能够处理成右图的效果,所以怎么测试也打不到真确的结果。   后面又看了几篇文章,原来他并不是这个意思,注意到上面左图里上下共有2*3个相同的块,如下图所示:   他的意思是通过修改某种边界条件对这个图使用泊松融合,得到后的结果图,再进行拼接就可以得到那种无缝的效果了,即先泊松,再拼接,而不是先拼接,后泊松。我们去看看Tiling这个单词的意思也明白这个道理了。    那么在原文中他说只需要we have chosen fnorth = fsouth = 0:5(gnorth + gsouth), and similarly for the eastand west borders.就可以了。   后面我在泊松图像编辑(Possion Image Edit)原理、实现与应用这位仁兄的博客的尾部也看到了关于这个过程的一个较为详细的注释,直接复制他博客里的图吧(谢谢)。   即用原图的梯度场,用修改后边界后的图作为融合的前景图进行融合,这样得到的融合的结果图,一个简单的代码如下所示: void IM_SeamlessTiling(unsigned char* Src, unsigned char* Dest, int Width, int Height, int Stride) { int Channel = Stride / Width; unsigned char* Fore = (unsigned char*)malloc(Height * Stride * sizeof(unsigned char)); unsigned char* Mask = (unsigned char*)calloc(Height * Width, sizeof(unsigned char)); memcpy(Fore, Src, Height * Stride); // 上下边界和左右边界设为原图像的边界和的一半。 for (int X = 0; X < Width * Channel; X++) { Fore[X] = (Src[X] + Src[(Height - 1) * Stride + X]) / 2; Fore[(Height - 1) * Stride + X] = Fore[X]; } for (int Y = 1; Y < Height - 1; Y++) { for (int C = 0; C < Channel; C++) { Fore[Y * Stride + C] = (Src[Y * Stride + C] + Src[Y * Stride + (Width - 1) * Channel + C]) / 2; Fore[Y * Stride + (Width - 1) * Channel + C] = Fore[Y * Stride + C]; } } memset(Mask , 255, Width * Height); // 然后引导向量场仍然使用原图像的梯度场。
阅读全文