当前位置:   article > 正文

高能干货:OpenCV看这篇就够了,9段代码详解图像变换基本操作

opencv 画像

640?wx_fmt=gif

导读: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所示。


640?wx_fmt=png

▲图4-2 OpenCV中以BGR形式存储的彩色图片


640?wx_fmt=jpeg

图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 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/802184?site
推荐阅读
相关标签
  

闽ICP备14008679号