赞
踩
导读:OpenCV是一个以BSD许可证开源的、跨平台的计算机视觉库。它提供了Python、C++、Java、Matlab等多种编程语言接口。它集成了很多计算机视觉算法,具有非常强大的功能,是计算机视觉中最为著名的一个库。在本文中,我们将要介绍OpenCV的一些基本用法。
作者:王天庆
如需转载请联系大数据(ID:hzdashuju)
01 OpenCV介绍
OpenCV是使用C++进行编写的、以BSD许可证开放源代码的、跨平台的计算机视觉库。它提供了上百种计算机视觉、机器学习、图像处理等相关算法,新版本的OpenCV支持Tensorflow、Caffe等深度学习框架。
OpenCV的底层优化处理得很好,能够支持多核处理,能够利用硬件实现加速。由于该库是以BSD许可证进行开源的,因此可以被免费应用在科学研究与商业应用中。
OpenCV库是由英特尔公司下属的俄罗斯技术团队发起的,由于优异的性能、免费、开源、算法丰富、使用简单等优点,自从项目被发起后便得到迅猛发展,越来越多的组织和个人加入到源代码的贡献队伍中,这也在客观进一步促进了OpenCV库的发展。
OpenCV在诸多领域得到了广泛的应用,例如物体检测、图像识别、运动跟踪、增强现实(AR)、机器人等场景。我们在本书中需要对图像进行处理时,需要用到OpenCV库。
OpenCV的安装也比较简单,在Python中,通过pip包管理工具就可以实现安装:
pip install opencv-python
如果在anaconda环境中安装OpenCV,则通过下面的方法进行安装:
conda install opencv
安装完毕OpenCV后,可以通过下述方法来查看是否安装成功:
# 查看引入OpenCV库时是否报错import cv2# 查看安装的版本cv2.__version__# 我这里显示的版本信息是 '3.4.1'import cv2# 查看安装的版本cv2.__version__# 我这里显示的版本信息是 '3.4.1'
以下介绍OpenCV基本操作。
02 存取数据
OpenCV中的图片以RGB的形式存储,只不过再OpenCV中的颜色通道顺序不是RGB而是BGR。这可以归结为一个历史遗留原因。因为OpenCV库的研发历史比较“悠久”,在那个时代,BGR是数码相机设备的主流表示形式。这一点伴随着OpenCV的发展一直没有被改变,我们在后面编写代码的时候应该注意到通道顺序的问题。
我们看一下OpenCV中存储图片的形式,图4-2是按照BGR顺序存储的RGB颜色模型的图片,对于相同的数据,我们也可以将其分别拆分为蓝色、绿色、红色的颜色矩阵,如图4-3所示。
▲图4-2 OpenCV中以BGR形式存储的彩色图片
▲图4-3 将彩色图片拆分成三个颜色通道存储的形式
通过图4-2和图4-3,我们知道了OpenCV存储图片的形式。那么在Python环境中的OpenCV库底层存储这颜色的数据结构就是array类型。OpenCV将图片读取进来,经过解码后以array形式存储。通过下面的例子,我们看一下OpenCV中图片的读取和存储方法。
import cv2import numpy as np# 使用imread()方法读入一个图片image = cv2.imread("lena.jpg")# 看一下数据的存储维度image.shape# 返回:(121, 121, 3)# 将读入的数据image打印出来print(image)'''如果读入数据失败,返回值将不是一个array类型,而是None我们可以看到图片数据的存储形式:[[[113 152 227] [109 153 230] [104 152 230] ..., [ 58 93 166] [119 156 212] [149 182 232]] [[107 149 224] [103 149 226] [ 97 149 225] ..., [ 79 112 175] [ 77 108 159] [ 65 91 137]] [[101 148 222] [ 96 146 222] [ 91 146 221] ..., [ 56 80 132] [ 3 22 65] [ 0 3 40]] ..., [[ 21 40 45] [ 24 37 45] [ 34 41 50] ..., [ 20 34 57] [ 7 24 50] [ 8 27 54]] [[ 17 35 36] [ 20 32 38] [ 22 29 38] ..., [ 13 29 52] [ 28 45 72] [ 41 59 90]] [[ 15 31 30] [ 19 31 35] [ 21 28 37] ..., [ 13 29 52] [ 48 64 93] [ 71 90 123]]]'''# 将存储图片数据的image变量写到磁盘中,写出的文件名为lena.bak.jpg# 其返回值结果为True代表写入成功,反之代表失败cv2.imwrite("lena.bak.jpg",image)import numpy as np# 使用imread()方法读入一个图片image = cv2.imread("lena.jpg")# 看一下数据的存储维度image.shape# 返回:(121, 121, 3)# 将读入的数据image打印出来print(image)'''如果读入数据失败,返回值将不是一个array类型,而是None我们可以看到图片数据的存储形式:[[[113 152 227] [109 153 230] [104 152 230] ..., [ 58 93 166] [119 156 212] [149 182 232]] [[107 149 224] [103 149 226] [ 97 149 225] ..., [ 79 112 175] [ 77 108 159] [ 65 91 137]] [[101 148 222] [ 96 146 222] [ 91 146 221] ..., [ 56 80 132] [ 3 22 65] [ 0 3 40]] ..., [[ 21 40 45] [ 24 37 45] [ 34 41 50] ..., [ 20 34 57] [ 7 24 50] [ 8 27 54]] [[ 17 35 36] [ 20 32 38] [ 22 29 38] ..., [ 13 29 52] [ 28 45 72] [ 41 59 90]] [[ 15 31 30] [ 19 31 35] [ 21 28 37] ..., [ 13 29 52] [ 48 64 93] [ 71 90 123]]]'''# 将存储图片数据的image变量写到磁盘中,写出的文件名为lena.bak.jpg# 其返回值结果为True代表写入成功,反之代表失败cv2.imwrite("lena.bak.jpg",image)
这里面有一个问题需要注意:OpenCV判断图片的格式是通过扩展名来实现的,如果我们写出的文件名为 lena.jpg.bak 那么可能会报错:
could not find a writer for the specified extension in function cv::imwrite_
所以,我们在使用OpenCV时候要注意图片文件的扩展名。
OpenCV相比于其他的库,最大的特点是对图像的处理功能非常完备。OpenCV能够实现对图片颜色和形状的变换。
03 颜色变换
图片的颜色变换可以有很多种类,譬如可以对彩色图片进行灰度化处理,调节图片的亮度和对比度,将图片转换成负片的形式等。这些操作都是表现在对图片的颜色处理上,下面我们介绍几种图片的常用颜色变换。
1. 灰度化
我们在平时接触到的图片大多都是彩色图片,存储的颜色模型一般也都是RGB模型。对于彩色图片我们前面提到过它的存储形式,相当于三个颜色通道分别用各自的颜色矩阵来记录数据。对于灰度图像来讲,它自然没有三个通道的说法,它的表现形式是一张矩阵,没有RGB三个不同的颜色通道。
彩色图片是可以转换为灰度图像的,虽然在转换为灰度图像的过程中丢失了颜色信息,但是却保留了图片的纹理、线条、轮廓等特征,这些特征往往比颜色特征更重要。
将彩色图片转换为灰度图片后,存储的数据量自然而然也随之减少,这样就会带来一个明显的好处:对图片进行处理时的计算量也将会减少很多,这一点在工程实践中非常重要,大家会在后面的内容中进一步体会。下面我们简述一下在OpenCV中将彩色图片转换为灰度图片的过程。
import numpy as npimport cv2img = cv2.imread("lena.jpg")print(img.shape)# (121, 121, 3)# 使用cv2.cvtColor() 方法将彩色图片转换为灰度图片gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)print(gray_img.shape)# (121, 121)# 将转换后的灰度图片回复成BGR形式img2 = cv2.cvtColor(gray_img,cv2.COLOR_GRAY2BGR)print(img2.shape)# (121, 121, 3)# 输出彩色图片img的内容print(img)'''[[[113 152 227] [109 153 230] [104 152 230] ..., [ 58 93 166] [119 156 212] [149 182 232]] [[107 149 224] [103 149 226] [ 97 149 225] ..., [ 79 112 175] [ 77 108 159] [ 65 91 137]] [[101 148 222] [ 96 146 222] [ 91 146 221] ..., [ 56 80 132] [ 3 22 65] [ 0 3 40]] ..., [[ 21 40 45] [ 24 37 45] [ 34 41 50] ..., [ 20 34 57] [ 7 24 50] [ 8 27 54]] [[ 17 35 36] [ 20 32 38] [ 22 29 38] ..., [ 13 29 52] [ 28 45 72] [ 41 59 90]] [[ 15 31 30] [ 19 31 35] [ 21 28 37] ..., [ 13 29 52] [ 48 64 93] [ 71 90 123]]]'''# 输出将灰度图片重新转换为BGR形式图片后的内容print(img2)'''[[[170 170 170] [171 171 171] [170 170 170] ..., [111 111 111] [169 169 169] [193 193 193]] [[167 167 167] [167 167 167] [166 166 166] ..., [127 127 127] [120 120 120] [102 102 102]] [[165 165 165] [163 163 163] [162 162 162] ..., [ 93 93 93] [ 33 33 33] [ 14 14 14]] ..., [[ 39 39 39] [ 38 38 38] [ 43 43 43] ..., [ 39 39 39] [ 30 30 30] [ 33 33 33]] [[ 33 33 33] [ 32 32 32] [ 31 31 31] ..., [ 34 34 34] [ 51 51 51] [ 66 66 66]] [[ 29 29 29] [ 31 31 31] [ 30 30 30] ..., [ 34 34 34] [ 71 71 71] [ 98 98 98]]]'''as npimport
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。