开发环境搭建
本人使用的是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