美文网首页
OpenCV官网文档(核心操作)——图像上的算术运算

OpenCV官网文档(核心操作)——图像上的算术运算

作者: zqyadam | 来源:发表于2020-03-01 12:05 被阅读0次

    https://docs.opencv.org/4.2.0/d0/d86/tutorial_py_image_arithmetics.html

    目标

    图像加法运算

    您可以使用OpenCV函数cv.add()来对两个图像进行加法运算,也可以仅通过numpy的操作 res = img1 + img2 。两个图像应具有相同的深度和类型,或者第二个图像可以只是一个标量值。

    注意
    OpenCV加法和Numpy加法之间有区别。OpenCV加法是饱和运算,而Numpy加法是模运算。

    例如,考虑以下示例:

    >>> x = np.uint8([250])
    >>> y = np.uint8([10])
    >>> print( cv.add(x,y) ) # 250+10 = 260 => 255
    [[255]]
    >>> print( x+y )          # 250+10 = 260 % 256 = 4
    [4]
    

    当两个图像做加法时,这将更加明显。坚持使用OpenCV功能,因为它们会提供更好的结果。

    图像融合

    这也是图像加法,但是对图像赋予不同的权重,以使其具有融合或透明的感觉。根据以下等式添加图像:
    g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)

    通过从0 \rightarrow 1更改\alpha,您可以在一个图像到另一个图像之间执行很酷的过渡。

    在这里,我拍摄了两个图像,将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()对图像应用以下公式:

    dst = \alpha \cdot img1 + \beta \cdot img2 + \gamma

    在这里,\gamma被视为零。

    img1 = cv.imread('ml.png')
    img2 = cv.imread('opencv-logo.png')
    dst = cv.addWeighted(img1,0.7,img2,0.3,0)
    cv.imshow('dst',dst)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    查看以下结果:

    image

    按位运算

    这包括按位AND,OR,NOT和XOR操作。在提取图像的任何部分(如我们将在下一章中看到),定义和使用非矩形ROI等方面,它们将非常有用。下面我们将看到一个如何更改图像特定区域的示例。 。

    我想将OpenCV徽标放在图像上方。如果添加两个图像,它将改变颜色。如果将它们混合,则会获得透明效果。但我希望它不透明。如果是矩形区域,则可以像上一章一样使用ROI。但是OpenCV徽标不是矩形。因此,您可以按如下所示进行按位操作:

    # Load two images
    img1 = cv.imread('messi5.jpg')
    img2 = cv.imread('opencv-logo-white.png')
    # I want to put logo on top-left corner, So I create a ROI
    rows,cols,channels = img2.shape
    roi = img1[0:rows, 0:cols]
    # Now create a mask of logo and create its inverse mask also
    img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
    ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
    mask_inv = cv.bitwise_not(mask)
    # Now black-out the area of logo in ROI
    img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
    # Take only region of logo from logo image.
    img2_fg = cv.bitwise_and(img2,img2,mask = mask)
    # Put logo in ROI and modify the main image
    dst = cv.add(img1_bg,img2_fg)
    img1[0:rows, 0:cols ] = dst
    cv.imshow('res',img1)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    请参阅下面的结果。左图显示了我们创建的mask。右图显示了最终结果。为了获得更多理解,请显示上述代码中的所有中间图像,尤其是img1_bg和img2_fg。

    image

    其他资源

    练习题

    1. 使用cv.addWeighted函数在文件夹中创建图像的幻灯片放映,并在图像之间平滑过渡

    相关文章

      网友评论

          本文标题:OpenCV官网文档(核心操作)——图像上的算术运算

          本文链接:https://www.haomeiwen.com/subject/cunxkhtx.html