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

  • 相关阅读:
    助理需要看的书
    linux 磁盘管理以及维护
    转:工作与创业区别
    《编写可读代码的艺术》---把控制流变得可读
    Visual studio插件 Reshaper--- 常用快捷键
    为啥我喜欢在Windows 7环境下做Unity开发?
    《编写可读代码的艺术》---写出言简意赅的注释
    《编写可读代码的艺术》---该写什么样的注释
    《编写可读代码的艺术》---美观代码
    《编写可读代码的艺术》---不会误解的名字
  • 原文地址:https://www.cnblogs.com/lfri/p/10418632.html
Copyright © 2011-2022 走看看