OpenCV快速入门篇(Python实现)

转载自:https://blog.csdn.net/feilong_csdn/article/details/82750029

本系列python版本:python3.5.4
本系列opencv-python版本:opencv-python3.4.2.17
本系列使用的开发环境是jupyter notebook,是一个python的交互式开发环境,测试十分方便,并集成了vim操作,安装教程可参考:windows上jupyter notebook主题背景、字体及扩展插件配置(集成vim环境)

目录

OpenCV快速入门篇(Python实现)

一、opencv-python简介与安装

二、opencv-python读取、展示和存储图像

1、imread函数

2、imshow函数

3、imwrite函数

4、窗口销毁函数

三、图像色彩空间变换函数cv2.cvtColor

四、绘制自定义数字图像

1、绘图简单图像

(1) cv2.line函数

(2) cv2.rectangle函数

(3) cv2.circle函数

(4) cv2.ellipse函数

(5) cv2.polylines函数

2、对图像的简单像素操作

(1) 对图像取反

(2) 对图像像素线性变换


一、opencv-python简介与安装

opencv 是用于快速处理图像处理、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等。本教程所有示例基于opencv-python,使用python语言对数字图像进行处理和研究。

首先我们需要安装一下环境
1、 python3
2、 numpy
3、 opencv-python

安装python3: 廖雪峰python教程有详细的说明,网址安装python
安装numpy: pip install numpy
安装opencv-python: pip install opencv-python

安装完opencv-python后命令行打开python交互式环境:import cv2 成功,便说明成功安装了opencv-python

二、opencv-python读取、展示和存储图像

1、imread函数

imread函数读取数字图像,先看一下官网对于该函数的定义

cv2.imread(path_of_image, intflag)

函数参数一: 需要读入图像的完整的路径
函数参数二: 标志以什么形式读入图像,可以选择一下方式:
· cv2.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都将被忽略。它是默认标志
· cv2.IMREAD_GRAYSCALE: 以灰度模式加载图像
· cv2.IMREAD_UNCHANGED: 保留读取图片原有的颜色通道

· 1 : 等同于cv2.IMREAD_COLOR
· 0 : 等同于cv2.IMREAD_GRAYSCALE
· -1 : 等同于cv2.IMREAD_UNCHANGED

来个示例更清楚:

import cv2
gray_img = cv2.imread('imgs/yrr009.jpg', 0)   # 加载灰度图像
rgb_img = cv2.imread('imgs/yrr009.jpg', 1)    # 加载RGB彩色图像

2、imshow函数

imshow函数作用是在窗口中显示图像,窗口自动适合于图像大小,我们也可以通过imutils模块调整显示图像的窗口的大小。函数官方定义如下:

cv2.imshow(windows_name, image)

函数参数一: 窗口名称(字符串)
函数参数二: 图像对象,类型是numpy中的ndarray类型

代码示例:

cv2.imshow('Grey', gray_img)  # 显示灰度图像
cv2.imshow('RGB', rgb_img)  # 显示彩色图像
if cv2.waitKey(0) == 27:  # 按ESC键退出窗口cv2.destroyAllWindows()

结果为:

显示灰度图

显示彩色图像

3、imwrite函数

imwrite函数检图像保存到本地,官方定义:

cv2.imwrite(image_filename, image)

函数参数一: 保存的图像名称(字符串)
函数参数二: 图像对象,类型是numpy中的ndarray类型

代码示例:

cv2.imwrite('imgs/rgb_img1.jpg', rgb_img)    # 将图像保存成jpg文件
cv2.imwrite('imgs/gray_img1.png', gray_img)  # 将图像保存成png文件

4、窗口销毁函数

当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止,常用的销毁窗口的函数有下面两个:
(1)、cv2.destroyWindow(windows_name) #销毁单个特定窗口,参数: 将要销毁的窗口的名字
(2)、cv2.destroyAllWindows() #销毁全部窗口,无参数

那我们合适销毁窗口,肯定不能图片窗口一出现我们就将窗口销毁,这样便没法观看窗口,试想有两种方式:
(1) 让窗口停留一段时间然后自动销毁;
(2) 接收指定的命令,如接收指定的键盘敲击然后结束我们想要结束的窗口
以上两种情况都将使用cv2.waitKey函数, 首先产看函数定义:

cv2.waitKey(time_of_milliseconds)

唯一参数 time_of_milliseconds是整数,可正可负也可是零,含义和操作也不同,分别对应上面说的两种情况

(1) time_of_milliseconds > 0 : 此时time_of_milliseconds表示时间,单位是毫秒,含义表示等待 time_of_milliseconds毫秒后图像将自动销毁,看以下示例:

# 表示等待10秒,将销毁窗口名称为'Grey'的图像窗口
if cv2.waitKey(10000):cv2.destroyWindow('Grey')
# 表示等待10秒后,将销毁所有图像
if cv2.waitKey(10000):cv2.destroyAllWindows() 

(2) time_of_milliseconds <= 0 : 此时图像窗口将等待一个键盘敲击,接收到指定的键盘敲击便会进行窗口销毁。我们可以自定义等待敲击的键盘,通过下面的例子进行更好的解释:

# 当指定waitKey(0) == 27时当敲击键盘 Esc 时便销毁所有窗口
if cv2.waitKey(0) == 27:cv2.destroyAllWindows()# 当接收到键盘敲击A时,便销毁名称为'RGB'的图像窗口
if cv2.waitKey(-1) == ord('A'):cv2.destroyWindow('RGB')

三、图像色彩空间变换函数cv2.cvtColor

本节将图像色彩空间变换函数单独拉出来说,原因:

1、该函数十分常用; 2、应明白为什么需要做图像色彩空间的处理

首先展示一下图像色彩空间变换函数定义:

cv2.cvtColor(input_image, flag)

参数一: input_image表示将要变换色彩的图像ndarray对象
参数二: 表示图像色彩空间变换的类型,以下介绍常用的两种:
· cv2.COLOR_BGR2GRAY: 表示将图像从BGR空间转化成灰度图,最常用
· cv2.COLOR_BGR2HSV: 表示将图像从RGB空间转换到HSV空间

注意:使用OpenCV读取图片时, 默认的通道顺序是BGR而非RGB

如果想查看参数flag的全部类型,请执行以下程序便可查阅,总共有274种空间转换类型:

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

代码样例:

rgbImg1 = cv2.imread("imgs/t9.jpg")
cv2.imshow('Original', rgbImg1)
grayImg = cv2.cvtColor(rgbImg1, cv2.COLOR_BGR2GRAY)
cv2.imshow('BGR2GRAY', grayImg)
if cv2.waitKey(0) == 27:cv2.destroyWindow('BGR2GRAY')

在之后的图像特征提取和识别学习中,我们经常使用的是将彩色图像转化成灰度图像, 这里解释一下为什么我么总是对灰度图进行处理,增强对以后图像处理操作的理解:图像的颜色主要是由于图像受到外界光照影响随之产生的不同颜色信息,同一个背景物的图像在不同光源照射下产生的不同颜色效果的图像,因此在我们做图像特征提取和识别过程时,我们要的是图像的梯度信息,也就是图像的本质内容,而颜色信息会对我们对梯度信息提取造成一定的干扰,因此我们会在做图像特征提取和识别前将图像转化为灰度图,这样同时也降低了处理的数据量并且增强了处理效果。

四、绘制自定义数字图像

本小节目的主要是跟着大家通过自定义数字图像来理解什么是数字图像? 为什么前面提到的图像对象是numpy中的ndarray对象

1、绘图简单图像

对于一个长宽分别为w、h的RGB彩色图像来说,它的每个像素值是由(B、G、R)的一个tuple组成,opencv-python中每个像素三个值的顺序是B、G、R,而对于灰度图像来说,每个像素对应的便只是一个整数,如果要把像素缩放到0、1,则灰度图像就是二值图像,0便是黑色,1便是白色。我们通过下面的例子来理解一下:

import cv2
# 这里图像采用的仍旧是上面用的图像
rgb_img = cv2.imread('imgs/t9.jpg')
print(rgb_img.shape)     #(384, 512, 3)
print(rgb_img[0, 0])     #[71 50 23]
print(rgb_img[0, 0, 0])  #71gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)
print(gray_img.shape)    #(384, 512)
print(gray_img[0, 0])    #44

从上面我们可以看到彩色图像的高度height = 384, 宽度w=512且通道数为3, 像素(0, 0)的值是[71 50 23],即B=71, G=50, R=23, 对于灰度图像来说便只是单通道的了。

因此(0, 0, 0)便是代表一个黑色像素,(255, 255, 255)便是代表一个白色像素。这么想,B=0, G=0, R=0相当于关闭了颜色通道也就相当于无光照进入,所以图像整个是黑的,而(255, 255, 255)即B=255, G=255, R=255, 相当于打开了B、G、R所有通道光线全部进入,因此便是白色。

明白了上面的原理我们便可以通过创建numpy的ndarray对象来创建任意的彩色图像和灰度图像了,例如:

import cv2
import numpy as npwhite_img = np.ones((512,512,3), np.uint8)
white_img1 = 255*white_img
cv2.imshow('white_img', white_img1)
if cv2.waitKey(0) == 27:cv2.destroyAllWindows()

结果:

纯白色图像

纯黑色图像

接下来我们先来熟悉一下OpenCV中一些简单几何图像基本绘制函数,然后我们尝试着在上面白色的图像上进行添加新的图像物体,是不是还挺有趣的,我们将介绍直线cv2.line、长方形cv2.rectangle、圆cv2.circle、椭圆cv2.ellipse、多边形cv2.polylines等集合图像绘制函数。

先介绍一下它们的公共参数:
· img: 表示需要进行绘制的图像对象ndarray
· color: 表示绘制几何图形的颜色,采用BGR即上述说的(B、G、R)
· thickness: 表示绘制几何图形中线的粗细,默认为1,对于圆、椭圆等封闭图像取-1时是填充图形内部
· lineType : 表示绘制几何图形线的类型,默认8-connected线是光滑的,当取cv2.LINE_AA时线呈现锯齿状

(1) cv2.line函数

直线绘制函数, 函数官方定义为:

cv2.line(image, starting, ending, color, thickness, lineType)

参数image、color、thickness、lineType分别是上述公共定义,参数starting、ending分别表示线的起点像素坐标、终点像素坐标。

(2) cv2.rectangle函数

长方形绘制函数,函数官方定义:

cv2.rectangle(image, top-left, bottom-right, color, thickness, lineType)

参数image、color、thickness、lineType分别是上述公共定义,参数top-left、bottom-right分别表示长方形的左上角像素坐标、右下角像素坐标。

(3) cv2.circle函数

圆形绘制函数,官方定义函数为:

cv2.circle(image, center, radius, color, thickness, lineType)

参数image、color、thickness、lineType分别是上述公共定义,参数center、radius分别表示圆的圆心像素坐标、圆的半径长度,圆绘制函数中当参数thickness = -1 时绘制的是实心圆,当thickness >= 0 时绘制的是空心圆。

(4) cv2.ellipse函数

椭圆绘制函数,官方定义为:

cv2.circle(image, center, (major-axis-length, minor-axis-length), angle, startAngle, endAngle, color, thickness, lineType)

椭圆的参数较多,首先参数image、color、thickness、lineType分别是上述公共定义,椭圆绘制函数中当参数thickness = -1 时绘制的是实心椭圆,当thickness >= 0 时绘制的是空心椭圆,其他参数如下:

· center: 表示椭圆中心像素坐标
· major-axis-length: 表示椭圆的长轴长度
· minor-axis-length: 表示椭圆的短轴长度
· angle: 表示椭圆在逆时针方向旋转的角度
· startAngle: 表示椭圆从主轴向顺时针方向测量的椭圆弧的起始角度
· endAngle: 表示椭圆从主轴向顺时针方向测量的椭圆弧的终止时角度

(5) cv2.polylines函数

多边形绘制函数,官方定义函数为:

cv2.polylines(image, [point-set], flag, color, thickness, lineType)

参数image、color、thickness、lineType分别是上述公共定义,其他参数如下:

· [point-set]: 表示多边形点的集合,如果多边形有m个点,则便是一个m12的数组,表示共m个点
· flag: 当flag = True 时,则多边形是封闭的,当flag = False 时,则多边形只是从第一个到最后一个点连线组成的图像,没有封闭

现在我们将上面五种几何图像绘制到开始的白色图像上,观看效果:

import cv2
import numpy as npimg = np.ones((512,512,3), np.uint8)
img = 255*img
img = cv2.line(img, (100,100), (400,400),(255, 0, 0), 5)
img = cv2.rectangle(img,(200, 20),(400,120),(0,255,0),3)
img = cv2.circle(img,(100,400), 50, (0,0,255), 2)
img = cv2.circle(img,(250,400), 50, (0,0,255), 0)
img = cv2.ellipse(img,(256,256),(100,50),0,0,180,(0, 255, 255), -1)
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
img = cv2.polylines(img,[pts],True,(0, 0, 0), 2)cv2.imshow('img', img)
if cv2.waitKey(0) == 27:cv2.destroyAllWindows()

结果:

2、对图像的简单像素操作

除了根据数字图像特点绘制特定图像,我们还可以对已有的图像像素进行操作然后得到很多神奇的效果,也就是对图像的像素进行变换。

(1) 对图像取反

reverse_img = 255 - gray_img

结果:

对图像取反

(2) 对图像像素线性变换

for i in range(gray_img.shape[0]):for j in range(gray_img.shape[1]):random_img[i, j] = gray_img[i, j]*1.2

结果:

对图像像素线性变换

上述两个图像变换完整示例代码:

import cv2
import numpy as npgrayImg = cv2.imread("imgs/gray_img.png",0)
reverse_img = 255 - grayImg   # 对图像取反random_img = np.zeros((grayImg.shape[0], grayImg.shape[1]), dtype=np.uint8)
# 对图像像素线性变换
for i in range(grayImg.shape[0]):for j in range(grayImg.shape[1]):random_img[i, j] = grayImg[i, j]*1.2
cv2.imshow('reverse_img', reverse_img)
cv2.imshow('random_img', random_img)
if cv2.waitKey(0) == 27:cv2.destroyAllWindows()

OpenCV快速入门篇(Python实现)相关推荐

  1. python快速入门答案-Python 开发 14 天快速入门

    专栏亮点 零基础学习,循序渐进:专栏将编程语言的学习路线提炼为基础.中级.高级三层,内容由易到难,循序渐进,简练而生动地为读者呈现知识点. 内容全面,提炼要义:从核心概念到高级知识点,包括基本数据结构 ...

  2. python快速入门教程-Python 开发 14 天快速入门

    专栏亮点 零基础学习,循序渐进:专栏将编程语言的学习路线提炼为基础.中级.高级三层,内容由易到难,循序渐进,简练而生动地为读者呈现知识点. 内容全面,提炼要义:从核心概念到高级知识点,包括基本数据结构 ...

  3. JSON数据结构(A、快速入门篇)(Yanlz+Data+JsonArray+JsonObject+JsonValue+JsonMapper.ToJson+JsonMapper.ToObject+)

    <JSON数据结构> 版本 作者 参与者 完成日期 备注 Data_JSON_V01_1.0 严立钻 2018.08.24 ++++一个好用的JSON在线编辑:http://www.kjs ...

  4. opencv快速入门人脸检测与人脸识别

    让"它"认得你 --利用opencv快速入门人脸检测与人脸识别 opencv,顾名思义"开源,计算机视觉".OpenCV就是这样的一个特殊的框架,一群大牛然绕自 ...

  5. 穿越 java | 快速入门篇 - 第1节 计算机基础知识

    主题:计算机基础知识 开发环境 更多干货 定义 作用 组成元件 CPU 内存 cpu里的高速缓存 BIOS软件(基础输入输出系统) CMOS芯片 机械硬盘 组成 数据存取过程 文件编码 ASCII G ...

  6. python新手快速入门教程-Python 开发 14 天快速入门

    专栏亮点 零基础学习,循序渐进:专栏将编程语言的学习路线提炼为基础.中级.高级三层,内容由易到难,循序渐进,简练而生动地为读者呈现知识点. 内容全面,提炼要义:从核心概念到高级知识点,包括基本数据结构 ...

  7. 运动控制器编程_快速入门 | 篇二十一:运动控制器ZHMI组态编程简介一

    点击上方"正运动小助手",随时关注新动态! 运动控制器ZHMI组态编程简介一  今天我们来学习一下,运动控制器的ZHMI组态编程简介.本文主要从产品概述.控制器连接触摸屏使用.HM ...

  8. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  9. Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)

    Git快速入门篇-- Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程) 前言:我们平时在整理代码的时候,尤其是与别人一起开发项目的时候,常常涉及到代码的更新,因此代码版本问 ...

最新文章

  1. usaco shuttle puzzle(dfs剪枝)
  2. 天大本科生论文入选CVPR 2022,实现深度学习长尾分类新SOTA
  3. shell脚本的测试与判断的基础实施
  4. 如何实现Conditional Include
  5. php开发mvc教程,php开发一个简单的MVC
  6. 《系统集成项目管理工程师》必背100个知识点-34项目范围基准
  7. Eclipse中io操作提示找不到文件
  8. 2016php技术面试题,一个php的面试题,大家看看
  9. 机器学习之乳腺癌问题(SVM)
  10. 网络基础2(分层模型,通信过程,以太网,ARP协议格式和具体功能详解)
  11. 深入理解jQuery插件开发(转)
  12. DataFrame和RDD互操作的两种方式:
  13. 怎么用便签在手机上记事?
  14. linux飞行模式切换,光遇飞行的两种模式区别 飞行模式切换和区别分析
  15. android手机能安装win10,微软或推可在安卓设备上安装的Win10系统ROM
  16. [失败]uuv_simulator在台式机_虚拟环境下会崩溃的问题[失败]
  17. AVR单片机用progisp下载报错flash verify error at :0h
  18. 怎么证明未显式定义构造方法时,编译器会自动生成无参的构造方法?
  19. eigen坐标变换_Eigen实现坐标转换
  20. 从零开始,如何拥有自己的博客网站【华为云至简致远】

热门文章

  1. mysql DDL 语句
  2. 深入理解CAS算法原理
  3. docker部署环境
  4. 让数字人出圈的技术秘籍,华为率先公开了
  5. 怎么在mysql中创建用户名和密码是什么_mysql中怎么创建用户名和密码
  6. 归并排序算法(C语言版本)
  7. response.setHeader()方法设置http文件头的值
  8. 如何防御DDoS等流量攻击?
  9. EclipseCDT
  10. 条件随机场CRF(三)