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

本文介绍了OpenCV的基本概念和应用,包括图像的读取与存储、颜色变换(灰度化、负片转换、亮度对比度调整)以及几何变换(裁剪、尺寸变换、旋转)。通过示例代码展示了如何使用OpenCV进行图像处理,如彩色到灰度的转换,以及图像的旋转和尺寸调整等操作。
摘要由CSDN通过智能技术生成

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 np
import c
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值