开发环境搭建

本人使用的是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]) #
print(mat[2,2]) # ## 切片操作
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

Python3 OpenCV3 图像处理基础的更多相关文章

  1. opencv3 图像处理(一)图像缩放( python与c++ 实现)

    opencv3 图像处理 之 图像缩放( python与c++实现 ) 一. 主要函数介绍 1) 图像大小变换 Resize () 原型: void Resize(const CvArr* src,C ...

  2. Python3学习(1)-基础篇

    Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 安装(MAC) 直接运行: brew install python3 输入:python3 --v ...

  3. MATLAB图像处理基础

    MATLAB图像处理基础 2.2.1 图像文件格式及图像类型 1.MATLAB支持的几种图像文件格式: ⑴JPEG(Joint Photogyaphic Expeyts Group):一种称为联合图像 ...

  4. Python3.x:基础学习

    Python3.x:基础学习 1,Python有五种标准数据类型 1.数字 2.字符串 3.列表 4.元组 5.字典 (1).数字 数字数据类型存储数字值.当为其分配值时,将创建数字对象. var1 ...

  5. 基于Python3 + OpenCV3.3.1的远程监控程序

    基于Python3 + OpenCV3.3.1的远程监控程序 一.环境配置 OpenCV是一个基于(开源)发行的跨平台计算机视觉库,利用OpenCV能够实现视频图像的捕获. 关于python3中Ope ...

  6. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  7. Matlab图像处理基础知识

    Matlab图像处理基础知识 Matlab的图片以矩阵的形式存储,矩阵的行列值为图片的行列的色彩值. 1图像表达方式: 像素索引 图像被视为离散单元.如使用I(2,2)可以获取第二行第二列的像素值 空 ...

  8. python3 opencv3 实现基本的人脸检测、识别功能

    一言不和,先上码子(纯新手,莫嘲笑) # encoding: utf-8 #老杨的猫,环境:PYCHARM,python3.6,opencv3 import cv2,os import cv2.fac ...

  9. Python3 系列之 基础语法篇

    基础数据类型 整数 python 可以处理任意大小的整数 浮点数 python 可以处理任意大小的浮点数,但是需要注意的一点是:整数运算永远是精确的(除法也是精确的),而浮点数运算则可能会有四舍五入的 ...

随机推荐

  1. maven之setting.xml的配置详解

    文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...

  2. [SHOI 2013] 发微博

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4419 [算法] 用std :: set维护每个人的好友集合 当两人成为好友时将每人接 ...

  3. 【USACO】The Cow Prom

    [题目链接] 点击打开链接 [算法] tarjan求强连通分量 [代码] #include<bits/stdc++.h> #define MAXN 20005 using namespac ...

  4. Java调用Static修饰的本类方法

    public class Dy { public static void main(String[] args){ int a=6; int b=5; int result=0; result=Add ...

  5. C++中的new用法总结

    前段时间复习面试的时候,看到这个问题经常有问到,我这个小白就看了些博客和书,总结一下. new可以说是个一个关键字,也可以说是一个运算符,并且可以被重载. 1.new operator 这个就是平时最 ...

  6. CodeForces 712B Memory and Trident (水题,暴力)

    题意:给定一个序列表示飞机要向哪个方向飞一个单位,让你改最少的方向,使得回到原点. 析:一个很简单的题,把最后的位置记录一下,然后要改的就是横坐标和纵坐标绝对值之和的一半. 代码如下: #pragma ...

  7. EOJ3263:丽娃河的狼人传说(贪心)

    传送门 题意 分析 考虑将区间按右端点排序,再遍历区间,操作即可 建议以加方式写 trick 1.不需要判区间重合 代码 #include<cstdio> #include<cstr ...

  8. Codeforces626B - Cards【模拟】

    题意: 两张相同可以合并成相同: 两张不同可以产生另外一个不同: 求最终的可能颜色: 思路: 模拟啊. 总共也就那么几种情况,具体看挫code--. #include<iostream> ...

  9. POJ1466/HDOJ1068 谈谈二分匹配的时间复杂度

    题意: n个学生编号是0-n-1,然后给出他们这些人和一些人的关系. 要你找出最大的人数,要求这些人之间没关系. 咳咳,题目中没说性别的关系TVT 思路: 很明显是一个匹配算法,但是我们得搞出一个二分 ...

  10. python 模块和包的使用方法

    一.模块 1.import导入模块 import module1,mudule2... 2.from...import...导入模块 导入指定内容 from modname import name1[ ...