zoukankan      html  css  js  c++  java
  • Python3 OpenCV3 图像处理基础

    开发环境搭建

    本人使用的是Ubuntu 16.04LTS。

    1、安装Python3 

    ## 其实 Ubuntu 16.04 系统自带了 Python 3.5.2,因此不需要再安装了?但是需要安装一些开发环境。
    sudo apt-get update # 更新系统源
    sudo apt-get install python3 python3.5-dev libpython3.5-dev  # 安装基础包
    sudo apt-get install python3-pip # 安装 pip3 
    sudo pip3 install --upgrade pip  # 更新 pip3 
    
    ## 测试 
    $ python3 --version
    Python 3.5.2 

    2、安装Numpy,Matplotlib,OpenCV

    这些库可以自己下载源码编译,也有别人编译好的,我们直接下载。

    ## 安装库
    sudo pip3 install numpy      # 安装 numpy,用于在Python中进行科学计算
    sudo pip3 install matplotlib # 安装 matplotlib,用于显示、绘图等
    sudo pip3 install opencv-python # 安装 opencv
    sudo pip3 install opencv-contrib-python #安装opencv-contrib,包含一些其它库,比如xfeature2d
    ## 确保 OpenCV 已经安装好 $ python3 -c "import cv2;print(cv2.__version__)" 4.0.0

    其实在安装opencv-python时会附带安装numpy,matplotlib安装时也会附带numpy,因为它们都依赖于numpy,如图:

     

    至此,环境基本上已经搭建结束。以后的任务就是开发啦。

    附:

    #各个版本号
    python       2.7.12
    python3      3.5.2
    pip          8.1.1
    pip3         19.0.3
    numpy        1.16.1
    matplotlib     3.0.2
    opencv-python  4.0.0.12

    Numpy的使用

    Numpy 是 Python中的科学计算工具包,可以说是Python中的Matlab。支持向量操作、切片操作、广播,支持多种常用数据类型,内置丰富的线性代数、矩阵算法。由于底层使用多为C语言实现,所以有着较快速度。同时以使用Python接口可以方便地使用 Python 的语法,摆脱静态语言的臃肿,从而实现快速建模、计算和验证。

    (1) numpy.ndarray 数组的创建

    ## --- 创建 np.ndarray 数组 ----
    import numpy as np
    # 使用 Python list 创建
    mat1 = np.array([[1,2,3], [4,5,6], [7,8,9]])
    # 使用 np.arange 创建
    mat2= np.arange(1,10).reshape(3,3)
    # 使用 zeros/ones/eye 创建
    mat3 = np.zeros((3,3))
    mat4 = np.ones((3,3))
    mat5 = np.eye(3)
    
    print(mat1)
    print(mat2)
    print(mat3)
    print(mat4)
    print(mat5)

    (2) numpy.ndarray 的数据类型

    ## --- numpy 数据类型(默认 np.int64 或 np.float64) -----
    # 内置多种数据类型,如 np.uint8, np.int32, np.float32, np.float64
    a = np.array([[1.25, -16],[32,264.75]], np.float32)  # 32位浮点型
    b = np.array(a, np.int32)  # 32位整形
    c = b.astype("uint8")      # 8位无符号整型(注意会发生溢出)
    
    print(a)
    """
    [[   1.25  -16.  ]
     [  32.    264.75]]
    """
    
    print(b)
    """
    [[  1 -16]
     [ 32 264]]
    """
    
    print(c)
    """
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    """

    (3) 索引

    ## ----- 索引(单坐标、切片、掩模) ------
    mat = np.arange(1,10).reshape(3,3)
    print(mat)
    
    ## 单坐标
    print(mat[2][2])    # 9
    print(mat[2,2])     # 9
    
    ## 切片操作
    print(mat[:2,:2])
    """
    [[1 2]
     [4 5]]
    """
    
    ## 掩模操作
    mask = mat>5
    print(mask)
    """
    [[False False False]
     [False False  True]
     [ True  True  True]]
    """
    
    mat[mask] = 5
    print(mat)
    """
    [[1 2 3]
     [4 5 5]
     [5 5 5]]
    """

    (4) 广播 (broadcasting)

    ## ----- numpy 广播机制(broadcasting) ------
    # https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
    # 当操作两个 numpy.ndarray 数组时,如果它们的维度满足一定的关系,则可以进行广播操作。
    x = np.arange(4)        # (4,)
    xt = x.reshape(-1,1)    # (4,1)
    z = np.ones((3,4))      # (3,4)
    
    print(x+xt)
    """
    [[0 1 2 3]
     [1 2 3 4]
     [2 3 4 5]
     [3 4 5 6]]
    """
    
    print(x+z)
    """
    [[ 1.  2.  3.  4.]
     [ 1.  2.  3.  4.]
     [ 1.  2.  3.  4.]]
    """

    Matplotlib

    [Matplotlib](http://matplotlib.org/) 是 Python 中的可视化库,可以用来绘制高质量的 2D 折线图、散点图、柱状图,或者用来显示图像。分别参考

    (1) Sample plots in Matplotlib

    (2) Image tutorial - Matplotlib 2.1.0 documentation

    # 使用 matplotlib 绘制一些列缩略图(thumbnails),并显示图像 
    #from scipy.misc import imread, imresize
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    import numpy as np
    
    ## (1) 绘制随机噪点
    ## 初始化随机种子,并生成随机坐标
    np.random.seed(0)
    data = np.random.randn(2, 100)
    ## 创建画布
    fig, axs = plt.subplots(2, 2, figsize=(5, 5))
    ## 绘制子图 
    axs[0, 0].hist(data[0])
    axs[1, 0].scatter(data[0], data[1])
    axs[0, 1].plot(data[0], data[1])
    axs[1, 1].hist2d(data[0], data[1])
    ## 显示 
    plt.show()
    
    ## (2) 绘制图像
    img = mpimg.imread("/home/auss/Pictures/test.png")
    imgx = img[:,:,0] # 取第一个通道
    
    ## 创建画布
    fig = plt.figure()
    
    ## 绘制原始图像,并加上颜色条
    axs = fig.add_subplot(1,3,1)
    ipt = plt.imshow(img)
    axs.set_title("origin")
    plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal')
    
    ## 绘制伪彩色图像,并加上颜色条 
    axs = fig.add_subplot(1,3,2)
    ipt = plt.imshow(imgx,cmap="winter")
    axs.set_title("winter")
    plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal')
    
    ## 绘制直方图
    axs = fig.add_subplot(1,3,3)
    ipt = plt.hist(imgx.ravel(), bins=256, range=(0, 1.0), fc='k', ec='k')
    axs.set_title("histogram")
    
    plt.show()

    OpenCV的简单应用

    铺垫了这么久,终于到了 OpenCV 了。 OpenCV 的 Python 接口名称为 cv2。通常 OpenCV 内部的算法已经很丰富了,并且提供了 highgui 模块用于显示图像(不过可能有的没有编译该模块)。如果需要进行拓展,则可以配合着 Numpy 进行计算,并结合 Matplotlib 进行显示。

    注意,matplotlib 中图像通道为 RGB,而 OpenCV 中图像通道为 BGR。因此进行显示的时候,要注意交换通道的顺序。

    这里给出一个 Canny 边缘检测的例子,涉及到图像读写、色彩空间转换、滤波、Canny边缘检测、掩模赋值操作等。

    #!/usr/bin/python3
    # 2017.11.02 17:31:24 CST
    # 2017.11.02 17:51:13 CST
    import cv2
    import numpy as np
    img = cv2.imread("firefox.png")
    
    ## BGR => Gray; 高斯滤波; Canny 边缘检测
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gaussed = cv2.GaussianBlur(gray, (3,3), 0)
    cannyed = cv2.Canny(gaussed, 10, 220)
    
    ## 将灰度边缘转化为BGR 
    cannyed2 = cv2.cvtColor(cannyed, cv2.COLOR_GRAY2BGR) 
    
    ## 创建彩色边缘 
    mask = cannyed > 0             # 边缘掩模
    canvas = np.zeros_like(img)    # 创建画布
    canvas[mask] = img[mask]       # 赋值边缘
    
    ## 保存
    res = np.hstack((img, cannyed2, canvas))   # 组合在一起 
    cv2.imwrite("result.png", res)        # 保存
    
    ## 显示 
    cv2.imshow("canny in opencv ", res)        
    
    # 保持10s, 等待按键响应(超时或按键则进行下一步)
    key = 0xFF & cv2.waitKey(1000*10)
    if key in (ord('Q'), ord('q'), 27):
        ## 这部分用作演示用
        print("Exiting...")
    
    ## 销毁窗口
    cv2.destroyAllWindows()

    参考链接:https://zhuanlan.zhihu.com/p/30670165

  • 相关阅读:
    react路由组件&&非路由组件
    react函数式组件(非路由组件)实现路由跳转
    react使用antd组件递归实现左侧菜单导航树
    【LeetCode】65. Valid Number
    【LeetCode】66. Plus One (2 solutions)
    【LeetCode】68. Text Justification
    【LeetCode】69. Sqrt(x) (2 solutions)
    【LeetCode】72. Edit Distance
    【LeetCode】73. Set Matrix Zeroes (2 solutions)
    【LeetCode】76. Minimum Window Substring
  • 原文地址:https://www.cnblogs.com/lfri/p/10418632.html
Copyright © 2011-2022 走看看