python的opencv操作记录(十)——图像融合

这篇具有很好参考价值的文章主要介绍了python的opencv操作记录(十)——图像融合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近碰到一个项目上的难题,是要从电动显微镜对焦的多张图像进行融合。因为,显微镜物镜的景深范围较小,可能在同一视野中有多个需要拍摄的物体位于不同的景深范围内,所以想通过图像的融合,将不同景深上的多张图像进行融合,从而把这些物体都在同一张图像中对用户进行展示。

opencv中的一个方法

在opencv中,提供了一个图像融合函数seamlessClone,可以直接进行图像融合。

    dst = cv2.imread("/Users/zoulei/files/personal/images/bg.jpg")
    obj = cv2.imread("/Users/zoulei/files/personal/images/fore.jpg")

    # Create an all white mask
    mask = 255 * np.ones(obj.shape, obj.dtype)

    # The location of the center of the src in the dst
    width, height, channels = dst.shape
    center = (int(height / 2), int(width / 2))

    # Seamlessly clone src into dst and put the results in output
    normal_clone = cv2.seamlessClone(obj, dst, mask, center, cv2.NORMAL_CLONE)
    mixed_clone = cv2.seamlessClone(obj, dst, mask, center, cv2.MIXED_CLONE)

    cv2.imshow("origin image", dst)
    cv2.imshow("fution image normal", normal_clone)
    cv2.imshow("fution image mixed", mixed_clone)

    cv2.waitKey()
    cv2.destroyAllWindows()

python的opencv操作记录(十)——图像融合

opencv这块的原理应该是基于一个牛逼的图像融合算法:泊松融合,出自于论文[Poisson Image Editing-2003]。于是去了解了一下这个厉害的算法。

泊松融合

泊松融合大概的逻辑是:

  • 将两幅图像都计算散度场,然后将两幅图像的散度场通过掩码进行相加
  • 通过计算泊松方程重建图像。

我自己的理解是求散度之后更好的得到图像更深层的信息,在更深的层次上对图像进行信息融合,然后再重建,比直接了当的把图贴上去效果要好得多。

当然,论文是比较严谨和难懂的,我这里只是大概的记录下过程,以便于理解。

图像梯度

图像梯度的概念在我之前计算清晰度的文章中已经描述过了:
https://blog.csdn.net/pcgamer/article/details/127942102?spm=1001.2014.3001.5502
就不再赘述了。

图像散度

图像的散度的定义就是对图像进行二阶求导,实际上就是拉普拉斯算子:
∇ 2 f = ∂ 2 f ∂ 2 x + ∂ 2 y ∂ 2 x \nabla^2f=\frac{\partial^2 f}{\partial^2 x} + \frac{\partial^2 y}{\partial^2 x} 2f=2x2f+2x2y

因为图像是离散的数据,所以这个偏导(x方向上)的在离散数据上的定义就是:
∂ 2 f ∂ 2 x = f ( x + 1 , y ) + f ( x − 1 , y ) − 2 f ( x , y ) \frac{\partial^2 f}{\partial^2 x} = f(x+1, y) + f(x-1, y) - 2f(x,y) 2x2f=f(x+1,y)+f(x1,y)2f(x,y)
(x,y)表示图像中的某一个像素值

同样的,在y方向的偏导就是:
∂ 2 f ∂ 2 y = f ( x , y + 1 ) + f ( x , y − 1 ) − 2 f ( x , y ) \frac{\partial^2 f}{\partial^2 y} = f(x, y+1) + f(x, y-1) - 2f(x,y) 2y2f=f(x,y+1)+f(x,y1)2f(x,y)

根据第一个公式,两者相加就是
∇ 2 f = ∂ 2 f ∂ 2 x = f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) − 4 f ( x , y ) \nabla^2f=\frac{\partial^2 f}{\partial^2 x} = f(x+1, y) + f(x-1, y) + f(x, y+1) + f(x, y-1) - 4f(x,y) 2f=2x2f=f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y)

从图像意义上来看,对某一个图像数据进行二阶求导就是等于这个像素的上下左右像素值减去自己像素值的四倍。
在图像中就可以使用一个掩膜来进行计算:
[ 0 1 0 1 − 4 1 0 1 0 ] \begin{bmatrix}0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0\end{bmatrix} 010141010

这个掩膜就是在图像领域的拉普拉斯算子。

计算图像的散度就可以直接将拉普拉斯算子作用于图像上进行计算。
我个人理解这个拉普拉斯可以提取图像中的边缘信息,因为边缘信息的梯度较小,如果一个像素点旁边的像素值都是相同的(也就是没有变化),这个算子计算得出的结果就是0。

融合图像散度

在那边论文描述的融合过程中,应该是把两幅图像分别求梯度场(一阶导数),然后把两幅图像的梯度场相加,然后再对融合梯度场进行一次求导,就是二次梯度场(散度),这就得到了融合图像的散度场。

通过散度场进行图像重建

对论文中的公式看的不是太明白,大概的意思是:
根据拉普拉斯算子的定义,图像进行拉普拉斯算子的卷积运算后就可以得到散度场。

那么,反过来,得到了散度场是否就可以得到原图像呢?答案是肯定的。

大致的思路如下:

  • 假设有这么一副图像:
    [ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 ] \begin{bmatrix} x_1 & x_2 & x_3 \\ x_4 & x_5 & x_6 \\ x_7 & x_8 & x_9\end{bmatrix} x1x4x7x2x5x8x3x6x9

  • 这幅图像对应的散度场: V ( 5 ) = x 2 + x 4 + x 6 + x 8 − 4 x 5 V(5) = x_2 + x_4 + x_6 + x_8 - 4x_5 V(5)=x2+x4+x6+x84x5

  • 总共有9个未知数,现在有了一个方程,如果还有8个方程的话,那么每个未知数就会有一个固定的解了。

  • 关键的点来了:泊松融合的目的是将源图像的一部分无缝融合到目标图像上。其本质是在保持目标图在融合边界的像素的同时以源图像的该部分的梯度场作为指导来生成融合区域内的像素。整体原则是保持融合区域内的生成像素的梯度场与源图像融合部分的像素的梯度场尽可能一致,反映到方程求解中则是梯度差异尽可能小。也就是让生成区域的拉普拉斯结果和源图像的拉普拉斯结果一致,且生成区域边界的的值和目标图像在融合区域的边界值一致。

  • 上面这句话最后说的边界值需要一致,也就是说融合图像的边界值可以和目标图像一致,也就是说上面的9个未知量(不管这个是融合的还是原图像)中,8个是边界,边界像素可以和目标图像一致,也就是已知量,加上这8个方程,联合散度场的计算公式,就可以重建出原始的图像了。

泊松融合的一般逻辑

综上所述,我理解泊松融合就是下面的逻辑:

  1. 计算需要被融合的图像的梯度场
  2. 通过掩码得到目标图像上的ROI区域,计算的到这个ROI的梯度场。
  3. 把第一步和第二步的梯度场相加
  4. 对第三步的梯度场再次求导,得到融合图像的二阶导,也就是散度场
  5. 再对这个散度场进行图像重建,得到融合图像。

在opencv中的seamlessClone函数中,有三个flag方式:

  • NORMAL_CLONE
  • MIXED_CLONE
  • MONOCHROME_TRANSFER

我还没去仔细看opencv的源码,根据我自己的实验,我个人感觉这三个参数主要在于上面的第三步的区别,可能是对两遍的梯度场做了一些权重的设置,看是以哪个梯度场为主来进行图像的生成。

  • NORMAL_CLONE,前需要融合的前景图像为主,边缘基本都保留了
  • MIXED_CLONE,两者的特性都保留
  • MONOCHROME_TRANSFER,保留前景的轮廓,把背景的风格给融合进去。上面没有这样的图像,这里补充一张:

python的opencv操作记录(十)——图像融合文章来源地址https://www.toymoban.com/news/detail-492299.html

到了这里,关于python的opencv操作记录(十)——图像融合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv实现抠图,图像拼接,图像融合

    在OpenCV中,你可以使用图像拼接、抠图和将图像的一部分放在另一张图片的指定位置。以下是示例代码,演示如何执行这些操作: 图像拼接 要将两张图像拼接在一起,你可以使用  cv::hconcat (水平拼接)和  cv::vconcat (垂直拼接)函数。下面是一个示例代码,演示如何水平

    2024年02月05日
    浏览(38)
  • OpenCV进阶 — 图像拼接和图像融合技术

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,你用你的手机对某一场景拍照,但是你没有办法一次将所有你

    2024年02月03日
    浏览(38)
  • python学习笔记:opencv的图像操作

    什么是opencv? opencv是一个开源的计算机视觉库,可以在http://opencv.org获取,opencv库用C,C++,python等多种语言编写,在使用中,经常用opencv打开存储器的图像,对摄像头的图像进行捕捉并保存或者对图像进行预处理,以实现图像更好的额完成算法分类,应用领域很广:在人机互

    2024年02月07日
    浏览(47)
  • opencv(三)边界填充、图像融合、图像阈值处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 边界填充就是将图片按一定的方法将图片的四周向外填充并将图片放大 因为opencv中的颜色通道不是RGB而是BGR,所以我们要用到之前讲到的分割将颜色通道重新整合成RGB后再用matplotlib库将其画出 BORDER_R

    2024年02月21日
    浏览(59)
  • Python-OpenCV 图像的基础操作

    首先读入一副图像: 获取像素值及修改的更好方法: img = cv2.imread(‘./resource/image/1.jpg’, cv2.IMREAD_COLOR) img.shape: 图像的形状(包括行数,列数,通道数的元组) img.size : 图像的像素数目 img.dtype :图像的数据类型 ROI(regionofinterest),感兴趣区域。机器视觉、图像处理中,从被

    2024年02月14日
    浏览(46)
  • Python Opencv实践 - 基本图像IO操作

       

    2024年02月14日
    浏览(61)
  • 【Python】OpenCV4图像、视频读写操作

    OpenCV提供了imread函数来从文件中加载图像,以及imwrite函数来将图像写入文件。这些函数支持各种静态图像的文件格式。通常支持BMP、PNG、JPEG和TIFF等格式。 让我们来探索在OpenCV和NumPy中表示图像的结构。图像是一个多维数组;它有列和行的像素,并且每个像素有一个值。对于

    2024年02月10日
    浏览(32)
  • OpenCV-Python中的图像基础操作

    首先读入一副图像: 获取像素值及修改的更好方法: img = cv2.imread(‘./resource/image/1.jpg’, cv2.IMREAD_COLOR) img.shape: 图像的形状(包括行数,列数,通道数的元组) img.size : 图像的像素数目 img.dtype :图像的数据类型 ROI(regionofinterest),感兴趣区域。机器视觉、图像处理中,从被

    2024年02月11日
    浏览(40)
  • opencv -12 图像运算之按 《位或》 运算(图像融合&图像修复和去除)

    或运算的规则是,当参与或运算的两个逻辑值中有一个为真时,结果就为真。其逻辑关系可以类比为如图 所示的并联电路,两个开关中只要有任意一个闭合时,灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明,表中使用“or”表示或运算。 按位或运算是指将数值转

    2024年02月16日
    浏览(59)
  • opencv -10 基础运算之 图像加权和(图像融合&图像修复&视频合成)

    所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为: 式中,saturate()表示取饱和值(最大值)。图像进行加权和计算时,要求 src1 和 src2 必须大小、类型相同 ,但是对具体是什么类型和通道没有特殊限制。它们可以是任意

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包