• Opencv图像简单操作


    图像简单操作

    1、旋转图像

    cv2.getRotationMatrix2D()

    2、颠倒图像

    cv2.flip()

    3、移动图像

    cv2.warpAffine()

    4、分割和合并图像

     有时你需要分别处理图像的B,G,R通道。在这种情况下,你需要将BGR图像拆分为单个通道。在其他情况下,你可能需要将这些单独的频道加入BGR图片。你可以通过以下方式简单地做到这一点:

    >>> b,g,r = cv.split(img) 
    >>> img = cv.merge((b,g,r))
    #要么
    >>> b = img [:, :, 0]

    假设你要将所有红色像素都设置为零,则无需先拆分通道。numpy索引更快:

    >>> img [:, :, 2] = 0

    警告 : cv.split()是一项耗时的操作(就时间而言)。因此,仅在必要时才这样做。否则请进行Numpy索引。

    5、为图像设置边框(填充)

    如果要在图像周围创建边框(如相框),则可以使用cv.copyMakeBorder()。但是它在卷积运算,零填充等方面有更多应用。此函数采用以下参数:

    • src - 输入图像
    • topbottomleftright 边界宽度(以相应方向上的像素数为单位)
    • borderType - 定义要添加哪种边框的标志。它可以是以下类型:
    • cv.BORDER_CONSTANT - 添加恒定的彩色边框。该值应作为下一个参数给出。
    • cv.BORDER_REFLECT - 边框将是边框元素的镜像,如下所示: fedcba | abcdefgh | hgfedcb
    • cv.BORDER_REFLECT_101或 cv.BORDER_DEFAULT与上述相同,但略有变化,例如: gfedcb | abcdefgh | gfedcba
    • cv.BORDER_REPLICATE最后一个元素被复制,像这样: aaaaaa | abcdefgh | hhhhhhh
    • cv.BORDER_WRAP难以解释,它看起来像这样: cdefgh | abcdefgh | abcdefg
    • value -边框的颜色,如果边框类型为cv.BORDER_CONSTANT

    下面是一个示例代码,演示了所有这些边框类型,以便更好地理解:

    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt
    BLUE = [255,0,0]
    img1 = cv.imread('opencv-logo.png')
    replicate = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REPLICATE)
    reflect = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT)
    reflect101 = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_REFLECT_101)
    wrap = cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_WRAP)
    constant= cv.copyMakeBorder(img1,10,10,10,10,cv.BORDER_CONSTANT,value=BLUE)
    plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
    plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
    plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
    plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
    plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
    plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
    plt.show()

    6、图像加法

    您可以通过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功能将提供更好的结果。因此,始终最好坚持使用OpenCV功能。

    7、图像融合

    这也是图像加法,但是对图像赋予不同的权重,以使其具有融合或透明的感觉。根据以下等式添加图像:

     通过从 α 从 0→1 更改,您可以在一个图像到另一个图像之间执行很酷的过渡。在这里,我拍摄了两个图像,将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()在图像上应用以下公式。

     在这里γ 被视为零。

    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()

    8、图像按位运算

    这包括按位 AND、 ORNOT 和 XOR 操作。它们在提取图像的任何部分(我们将在后面的章节中看到)、定义和处理非矩形 ROI 等方面非常有用。 下面我们将看到一个例子,如何改变一个图像的特定区域。
    我想把 OpenCV 的标志放在一个图像上面。如果我添加两个图像,它会改变颜色。如果我混合它,我得到一个透明的效果。但我希望它是不透明的。如果是一个矩形区域,我可以使用 ROI,就像我们在上一章中所做的那样。但是 OpenCV 的 logo 不是长方形的。所以你可以使用如下的按位操作来实现:我想在图像上方放置OpenCV徽标。如果添加两个图像,它将改变颜色。如果混合它,我将获得透明效果。但我希望它不透明。如果是矩形区域,则可以像上一章一样使用ROI。但是OpenCV徽标不是矩形。因此,您可以按如下所示进行按位操作:

    # 加载两张图片
    img1 = cv.imread('messi5.jpg')
    img2 = cv.imread('opencv-logo-white.png')
    # 我想把logo放在左上角,所以我创建了ROI
    rows,cols,channels = img2.shape
    roi = img1[0:rows, 0:cols ]
    # 现在创建logo的掩码,并同时创建其相反掩码
    img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
    ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
    mask_inv = cv.bitwise_not(mask)
    # 现在将ROI中logo的区域涂黑
    img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
    # 仅从logo图像中提取logo区域
    img2_fg = cv.bitwise_and(img2,img2,mask = mask)
    # 将logo放入ROI并修改主图像
    dst = cv.add(img1_bg,img2_fg)
    img1[0:rows, 0:cols ] = dst
    cv.imshow('res',img1)
    cv.waitKey(0)
    cv.destroyAllWindows()
  • 相关阅读:
    Linux新手入门:通过chmod改变文件权限--转
    一个非常好的性格切割问题
    Weka算法Classifier-tree-J48源代码分析(一个)基本数据结构和算法
    百度地图3.1课程—检索演示
    JAVA在IO流量汇总
    crm2011i创建nt类型字段
    学习vi和vim编辑(3):一个简单的文本编辑器(2)
    禹洲:我们这一代人的困惑
    D其他项目打电话AL工程EF Model
    HDU 2289 Cup(可以二分法,但是除了它的一半?)
  • 原文地址:https://www.cnblogs.com/windyrainy/p/15169570.html
Copyright © 2020-2023  润新知