• openCV 二 图像处理


    官网:https://docs.opencv.org/3.2.0/df/d9d/tutorial_py_colorspaces.html

    改变颜色空间

    本教程颜色空间转换:BGR  Gray and BGR  HSV.

    cv2.cvtColor(input_image, flag)
    • input_image:输入图像
    • flag:openCV标志位,决定颜色空间转换类型,如:(BGR → Gray->flags cv2.COLOR_BGR2GRAY)、(BGR → HSV->cv2.COLOR_BGR2HSV)

    获取所有颜色空间转换标志

    import cv2
    flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
    print(flags)

     目标追踪

    现在我们知道如何转换BGR图像到HSV图像,我们可以使用这个去抽取一个颜色对象。HSV比BGR颜色空间更容易去表示一个颜色,在我们的应用中,我们尝试去抽取一个蓝色的颜色对象,具体描述:

    1、提取视频的每一帧

    2、从BGR颜色空间转换到HSV颜色空间

    3、我们为HSB图像设置一个蓝色范围的阈值

    4、现在单独提取这个蓝色对象

    官方示例代码:

    import cv2
    import numpy as np
    
    cap = cv2.VideoCapture(0)
    while (1):
        # 获取每一帧
        _, frame = cap.read()
        # Convert BGR to HSV
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        # define range of blue color in HSV
        lower_blue = np.array([110, 50, 50])
        upper_blue = np.array([130, 255, 255])
        # 将HSV图像阈值化以仅获得蓝色
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
        # 按位与操作
        res = cv2.bitwise_and(frame, frame, mask=mask)
        cv2.imshow('frame', frame)
        cv2.imshow('mask', mask)
        cv2.imshow('res', res)
        k = cv2.waitKey(5) & 0xFF
        if k == 27:
            break
    cv2.destroyAllWindows()

    蓝色物体追踪展示:

    注意:

    1、在这张图片上有一些噪声,在之后的章节中我们将看到如何移除他们

    2、这是物体追踪的最简单方式,一但你学习了轮廓函数,你将可以做更多的事情

    如何找到要追踪的HSV值

    很多常见的问题可以在stackoverflow.com,最简单的方式是使用cv2.cvtColor()函数,你可以传递一个你想要的BGR值而不是一张图片。例如:寻找绿色的HSV值:

    import cv2
    import numpy as np
    
    green = np.uint8([[[0,255,0 ]]])
    hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
    print(hsv_green)

     图像的几何变换

    目标:

      学习对图像使用应用不同的几何变换,如:平移、旋转、放射变换等。

    缩放

    缩放仅仅是改变图像的大小,OpenCV自带了函数cv2.resize()来完成这个目标。图片的大小可以手动指定,也可以通过缩放因子来指定。图像所方式有很多插值方法可以使用,默认使用cv2.INTER_LINEAR

    import cv2
    import numpy as np
    img = cv2.imread('messi5.jpg')
    res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
    #OR
    height, width = img.shape[:2]
    res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

    收缩时推荐:cv2.INTER_AREA

    放大时推荐:cv2.INTER_CUBIC (slow) & cv2.INTER_LINEAR

    平移

    import cv2
    import numpy as np
    img = cv2.imread('messi5.jpg',0)
    rows,cols = img.shape
    M = np.float32([[1,0,100],[0,1,50]])
    dst = cv2.warpAffine(img,M,(cols,rows))
    cv2.imshow('img',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    警告:warpAffine的第三个参数是输出图像的大小,他的形式应该是(width,height),宽等于列的数量,高等于行的数量,关于M矩阵的信息可以参考https://blog.csdn.net/keith_bb/article/details/56331356

    旋转

    为了找到旋转的变换矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D。检查下面的例子,旋转90度的图像相对于中心没有任何缩放。
    img = cv2.imread('messi5.jpg',0)
    rows,cols = img.shape
    M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
    dst = cv2.warpAffine(img,M,(cols,rows))

     

    放射变换

    在仿射变换中,原图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要从输入图像中得到三个点,以及它们在输出图像中的对应位置。然后cv2。getAffineTransform将创建一个2x3矩阵,该矩阵将传递给cv2.warpaffine

    img = cv2.imread('drawing.png')
    rows,cols,ch = img.shape
    pts1 = np.float32([[50,50],[200,50],[50,200]])
    pts2 = np.float32([[10,100],[200,50],[100,250]])
    M = cv2.getAffineTransform(pts1,pts2)
    dst = cv2.warpAffine(img,M,(cols,rows))
    plt.subplot(121),plt.imshow(img),plt.title('Input')
    plt.subplot(122),plt.imshow(dst),plt.title('Output')

     

     平滑图像

    1、学习使用各种低通过滤器过滤图像

    2、对图像使用自定义过滤器

    二维卷积(图像滤波)

    与一维信号一样,图像也可以用各种低通滤波器(LPF)、高通滤波器(HPF)等进行滤波。LPF有助于去除噪声,模糊图像等。HPF滤波器有助于在图像中找到边缘。

    OpenCV提供了一个函数cv2.filter2D()来卷积内核与图像。例如,我们将尝试对图像进行平均滤波。一个5x5的平均滤波内核如下所示:

     


    操作方法是这样的:将该内核保持在一个像素之上,将该内核之下的所有25个像素相加,取其平均值,然后用新的平均值替换中心像素。它继续对图像中的所有像素进行此操作。请尝试此代码并检查结果
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    img = cv2.imread('opencv_logo.png')
    kernel = np.ones((5,5),np.float32)/25
    dst = cv2.filter2D(img,-1,kernel)
    plt.subplot(121),plt.imshow(img),plt.title('Original')
    plt.xticks([]), plt.yticks([])
    plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
    plt.xticks([]), plt.yticks([])
    plt.show()

  • 相关阅读:
    如何得到运行程序的路径,以及如何得到路径的文件夹,文件名,以及类型等等信息
    STL的心得(4)运用(MFC)
    STL的心得(3)---运用(控制台)
    【Css】清除浮动,独占一行
    [Html]加链接提示
    【JS】清除子节点
    【CSS】使Div在父元素中水平居中
    [JS]回前页
    【JS】鼠标移动到链接上变手型
    【jQuery】改变控件的使能状态
  • 原文地址:https://www.cnblogs.com/zhumengke/p/10196288.html
Copyright © 2020-2023  润新知