前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV入门教程1-常用函数

OpenCV入门教程1-常用函数

原创
作者头像
皮大大
发布2024-06-20 17:59:24
590
发布2024-06-20 17:59:24
举报
文章被收录于专栏:图像处理图像处理

公众号:尤而小屋 作者:Peter 编辑:Peter

大家好,我是Peter~

工作的原因,最近开始涉及到很多图像处理的工作,所以决定开辟一个新专栏:OpenCV入门教程系列

教程从零开始,记录自己的学习历程,欢迎关注本专栏,精力有限,保证周更至少一篇。如果文章中有误或者更好的方法,欢迎大家提出来,一起学习~

本文是第一篇,主要是介绍OpenCV和图片的基础操作,比如图片的存储形式、格式以及图片的读取、写入、显示等。

图像概述

图像是一种以二维或三维形式存在的数据集合,用于表示对象的视觉信息。根据不同的分类方法,图像可以分为静态图像和动态图像、灰度图像和彩色图像等。

  • 静态图像是指不随时间变化的图像
  • 动态图像则会随着时间的变化呈现出不同的视觉效果
  • 灰度图像只包含亮度信息
  • 彩色图像则包含了亮度和颜色信息

在实际应用中,根据不同的需求,人们会选择不同类型的图像进行处理和分析。

OpenCV介绍

OpenCV(Open Source Computer Vision Library)是一个跨平台的计算机视觉库,提供了丰富的函数和工具,用于处理和分析图像和视频数据。它是由英特尔公司开发的,现在已经成为全球范围内广泛使用的计算机视觉领域的重要工具。

OpenCV的主要目标是提供一种简单、高效和可扩展的方式来处理图像和视频数据。它支持各种常见的图像处理和计算机视觉算法,包括图像滤波、图像分割、特征提取、目标检测、人脸识别等。

OpenCV还提供了丰富的接口和工具,可以与其他编程语言和框架进行集成,如Python、C++、Java等。它还支持各种常见的硬件加速技术,如GPU加速和多核处理器,可以显著提高图像处理和计算机视觉算法的性能和效率。

除此之外,OpenCV还提供了大量的示例代码和教程,可以帮助开发人员快速入门和学习使用OpenCV库。它还是一个开源项目,拥有活跃的社区支持和文档库,可以提供持续的技术支持和改进。

应用领域

  • 人机互动:比如人机交互
  • 物体识别:基于视觉对物体进行判断
  • 图像分割:ROI(Region of Interest,感兴趣区域)技术
  • 人脸识别:通过Haar级联来实现
  • 动作识别:主要是2D和3D动作识别
  • 运动追踪、计算机视觉、图像标注、目标检测等

安装opencv-python

OpenCV-python是OpenCV库的Python接口,它提供了在Python中使用OpenCV的功能和工具。OpenCV-python是OpenCV官方支持的Python绑定,可以轻松地在Python中使用OpenCV的图像处理和计算机视觉功能。

通过使用OpenCV-python,开发人员可以使用Python语言来编写计算机视觉应用,从而提高了代码的可读性和易用性。它还提供了与OpenCV C++接口相似的API,使得开发人员可以轻松地从C++代码迁移到Python代码。

此外,OpenCV-python还支持各种常见的Python框架和库,如NumPy、Pandas、Matplotlib等,这些库可以与OpenCV-python无缝集成,从而提高了开发人员的工作效率和代码质量。

总之,OpenCV-python是一个功能强大的Python计算机视觉库,它为开发人员提供了一种简单、高效和可扩展的方式来处理图像和视频数据。

安装:

代码语言:python
代码运行次数:0
复制
pip install opencv-python

OpenCV常用python内置函数

ord函数

将键盘输入的字符(长度为1)转成ASCII码

In 1:

代码语言:python
代码运行次数:0
复制
ord("a")

Out1:

代码语言:python
代码运行次数:0
复制
97

In 2:

代码语言:python
代码运行次数:0
复制
ord("b")

Out2:

代码语言:python
代码运行次数:0
复制
98

In 3:

代码语言:python
代码运行次数:0
复制
ord("A")

Out3:

代码语言:python
代码运行次数:0
复制
65

max/min函数

对含有噪声的图片进行去噪处理

In 4:

代码语言:python
代码运行次数:0
复制
max(["a","B"])

Out4:

代码语言:python
代码运行次数:0
复制
'a'

In 5:

代码语言:python
代码运行次数:0
复制
max(["a","B"], key=str.upper)  # 先统一转成大写

Out5:

代码语言:python
代码运行次数:0
复制
'B'

sorted函数

排序功能,提高程序中图片抗干燥能力。

In 6:

代码语言:python
代码运行次数:0
复制
sorted([1,4,5,3,2])

Out6:

代码语言:python
代码运行次数:0
复制
[1, 2, 3, 4, 5]

In 7:

代码语言:python
代码运行次数:0
复制
sorted([1,4,5,3,2],reverse=True)

Out7:

代码语言:python
代码运行次数:0
复制
[5, 4, 3, 2, 1]

图片存储形式

图片在计算机中是以二进制的形式进行存储的。先了解图片的几种存储形式:

BGR图

BGR图是一种常见的图像表示方式,其中每个像素点由蓝(Blue)、绿(Green)和红(Red)三个颜色通道的值组成。在BGR图中,每个通道的值通常采用整数或浮点数来表示,取值范围因不同格式而异。

生活中图片一般是RGB形式(R: 红色Red,G:绿色green,B: 蓝色Blue)。OpenCV中使用的BGR格式,其中每个像素点由蓝(Blue)、绿(Green)和红(Red)三个颜色通道的值组成。

在实际中不直接使用BGR,而是进行图片颜色格式的转换。B、G、R为图片上每个像素点构成的通道,所以每个BGR图示一个蓝绿红3种通道的图片。

通道的取值是0~255,python中通过元组的形式来表示,如(255,255,255)表示白色,(0,0,0)表示黑色

灰度图

灰度图的每个像素点不再由BGR3个通道组成,仅由一个通道组成,即灰度值。灰度值的取值范围:0~255,其中0表示黑色,255表示白色

HSV图

HSV图显示出来的图也是彩色的,也是3个通道组成,介绍如下:

  • H:色彩或者色度,取值范围0~179
  • S:饱和度,取值范围0~255
  • V:亮度,取值范围0~255

二值图

一种特殊的灰度图,没有通道的概念,并且图中每个像素点的取值只有0或者255两个值,可以理解成非黑即白。

二值图可以帮助去除图片中的噪点,使得图片内只存在我们想要的二值化表示部分。

图片读取和保存

图片格式

cv2.imread函数是OpenCV库中用于读取图像文件的函数,它可以读取多种静态图像格式,包括但不限于以下几种:

  • BMP(Windows位图)格式:这是一种无压缩的图像格式,广泛用于Windows系统。
  • JPEG(联合图像专家组)格式:这是一种压缩的图像格式,广泛应用于互联网和数字相机。
  • PNG(可移植网络图形)格式:这是一种无损压缩的图像格式,支持透明度通道,适用于网络传输和存储。
  • GIF(图形交换格式)格式:这是一种支持动态图像和透明度通道的图像格式,常用于动画和演示。
  • TIFF(标记图像文件格式)格式:这是一种通用的图像格式,支持多种图像压缩和色彩模式,广泛应用于出版、印刷和其他行业。

除了以上常见的图像格式,cv2.imread函数还可以读取其他一些不常用的图像格式,如:

  • PBM(Portable Bitmap)格式:这是一种简单的无压缩二进制图像格式,通常用于存储黑白图像。
  • PGM(Portable Graymap)格式:这也是一种简单的无压缩二进制图像格式,通常用于存储灰度图像。
  • PPM(Portable Pixmap)格式:这是一种简单的无压缩二进制图像格式,通常用于存储彩色图像。 需要注意的是,不同的图像格式可能具有不同的压缩方式和色彩模式,cv2.imread函数默认会读取所有像素信息,但有时可能需要使用不同的参数来控制读取的方式,例如设置cv2.IMREAD_GRAYSCALE参数来读取灰度图像,或设置cv2.IMREAD_COLOR参数来读取彩色图像(默认情况下会忽略透明度通道)。

读取cv2.imread

代码语言:python
代码运行次数:0
复制
cv2.imread(filname, flags=1)
  • filename:所要读取的图片的相对地址
  • flags:读取的格式,默认是1,表示按照BGR三通道的格式读取;如果设置为0,表示按照灰度图单通道的方式来读取

In 8:

代码语言:python
代码运行次数:0
复制
import numpy as np
import cv2

# img = cv2.imread("pictures/a.png",flags=1)  # 默认是1 
img = cv2.imread("pictures/a.png")  # 默认是BGR,3通道方式读取

img[:2]

Out8:

代码语言:python
代码运行次数:0
复制
array([[[169,  92,   0],
        [169,  92,   0],
        [169,  92,   0],
        ...,
        [169,  92,   0],
        [169,  92,   0],
        [169,  92,   0]],

       [[169,  92,   0],
        [169,  92,   0],
        [169,  92,   0],
        ...,
        [169,  92,   0],
        [169,  92,   0],
        [169,  92,   0]]], dtype=uint8)

介绍另外一种读取的方式:写入的参数是cv2.IMREAD_COLOR

In 9:

代码语言:python
代码运行次数:0
复制
img = cv2.imread("pictures/a.png", cv2.IMREAD_COLOR)
img[:2]

Out9:

代码语言:python
代码运行次数:0
复制
array([[[169,  92,   0],
        [169,  92,   0],
        [169,  92,   0],
        ...,
        [169,  92,   0],
        [169,  92,   0],
        [169,  92,   0]],

       [[169,  92,   0],
        [169,  92,   0],
        [169,  92,   0],
        ...,
        [169,  92,   0],
        [169,  92,   0],
        [169,  92,   0]]], dtype=uint8)

读取BGR图的三种等效方式:

代码语言:python
代码运行次数:0
复制
cv2.imread("pictures/a.png",flags=1)
cv2.imread("pictures/a.png")
cv2.imread("pictures/a.png",cv2.IMREAD_COLOR)

In 10:

代码语言:python
代码运行次数:0
复制
# 灰度图的方式来读取

img1 = cv2.imread("pictures/a.png",flags=0)
img1

Out10:

代码语言:python
代码运行次数:0
复制
array([[93, 93, 93, ..., 93, 93, 93],
       [93, 93, 93, ..., 93, 93, 93],
       [93, 93, 93, ..., 93, 93, 93],
       ...,
       [74, 74, 74, ..., 68, 68, 68],
       [74, 74, 74, ..., 68, 68, 68],
       [74, 74, 74, ..., 68, 68, 68]], dtype=uint8)

灰度图的另外一种读取方式,写入参数:cv2.IMREAD_GRAYSCALE

In 11:

代码语言:python
代码运行次数:0
复制
img1 = cv2.imread("pictures/a.png", cv2.IMREAD_GRAYSCALE)
img1

Out11:

代码语言:python
代码运行次数:0
复制
array([[93, 93, 93, ..., 93, 93, 93],
       [93, 93, 93, ..., 93, 93, 93],
       [93, 93, 93, ..., 93, 93, 93],
       ...,
       [74, 74, 74, ..., 68, 68, 68],
       [74, 74, 74, ..., 68, 68, 68],
       [74, 74, 74, ..., 68, 68, 68]], dtype=uint8)

读取灰度图的两种方式:

代码语言:PYTHON
复制
# 两种等价的方式
cv2.imread("pictures/a.png",flags=0)
cv2.imread("pictures/a.png", cv2.IMREAD_GRAYSCALE)

保存cv2.imwrite

使用函数cv2.imwrite():

代码语言:python
代码运行次数:0
复制
cv2.write(filaname,img)
  • filename:要保存图片的名字
  • img:要保存的图片的矩阵形式

In 12:

代码语言:python
代码运行次数:0
复制
img[:2]

Out12:

代码语言:python
代码运行次数:0
复制
array([[[169,  92,   0],
        [169,  92,   0],
        [169,  92,   0],
        ...,
        [169,  92,   0],
        [169,  92,   0],
        [169,  92,   0]],

       [[169,  92,   0],
        [169,  92,   0],
        [169,  92,   0],
        ...,
        [169,  92,   0],
        [169,  92,   0],
        [169,  92,   0]]], dtype=uint8)

In 13:

代码语言:python
代码运行次数:0
复制
cv2.imwrite("./pictures/new_a.jpg",img)

Out13:

代码语言:python
代码运行次数:0
复制
True
# 完整代码为

import numpy as np
import cv2

# 先读取
img = cv2.imread("pictures/a.png")  # 默认是BGR-3通道读取
# 中间可能很多处理
# 保存
cv2.imwrite("./pictures/new_a.jpg",img)

图片显示(基于cv2)

在读取完图片后,如何将图片展示出来进行可视化?使用cv2.imshow()

图片显示cv2.imshow()

In 14:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np

img = cv2.imread("pictures/a.png", cv2.IMREAD_COLOR)  # 读取图片
cv2.imshow("image", img)   # 显示
# cv2.imwrite("pictures/new_a1.png", img)   写入保存

cv2.destroyAllWindows()  # 摧毁函数cv2.destroyAllWindows()

在这里注意两点:

  1. cv2.imshow()用来显示图片,但没有延时作用,此时仍然没看到图
  2. 如果使用了cv2.imshow,一定加上这个摧毁函数cv2.destroyAllWindows()

图片延时cv2.waitKey(time)

函数的使用:

代码语言:python
代码运行次数:0
复制
cv2.waitKey(time)

time表示等待的时间,单位是毫秒。函数表示在给定的time时间内等待用户按键的触发。

如果time=0,表示停止在当前帧,有按键指令的时候进入下一帧。如果是单张图片,一般写作:cv2.waitKey(0)

注意:函数的后面是否需要加上&0xff。完整写法为:cv2.waitKey(1000) & 0xFF

延时后图片显示

(1)time=0表示图片已显示,任意按键下退出

In 15:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np

img = cv2.imread("pictures/a.png", cv2.IMREAD_COLOR)  # 读取
cv2.imshow("image", img)   # 显示

cv2.waitKey(0)  # 延时

# cv2.imwrite("pictures/new_a1.png", img)   写入
cv2.destroyAllWindows()  # 摧毁

(2)在指定的按键下退出

此时图片已经停留,任意按键即可关闭程序。如果指定特殊按键,使用if语句进行判断:只有输入q键才会退出。

In 16:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np

img = cv2.imread("pictures/a.png",flags=1)
cv2.imshow("image", img)

while True:
    if cv2.waitKey(0) == ord("q"):  # 只有在q键下才会退出
        break
    else:
        pass
    
cv2.imwrite("new_a.png",img)  # 写入

cv2.destroyAllWindows()

(3)在指定的条件下退出程序和保存图片:

In 17:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np

img = cv2.imread("pictures/a.png",flags=1)
cv2.imshow("image", img)

while True:
    if cv2.waitKey(0) == ord("q"):  # 只有在q键下才会退出
        break
    if cv2.waitKey(0) == ord("s"):
        cv2.imwrite("new_a.png",img)  # 输入s进行图片写入
        break

cv2.destroyAllWindows()

(4)指定时间下退出程序

In 18:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np

img = cv2.imread("pictures/a.png",flags=1)
cv2.imshow("image", img)

if cv2.waitKey(5000) & 0XFF == ord("s"): # 重点
    cv2.imwrite("new_a.png",img) 

cv2.destroyAllWindows()

重点代码解释:如果5秒内没有按键s,则程序将会自动退出。

图片显示(基于matplotlib)

matplotlib中显示图片是以RGB的格式进行显示的,OpenCV默认是以BGR格式。如果是通过cv2读取的图片,需要进行格式转化。

In 19:

代码语言:python
代码运行次数:0
复制
# 读取图片cv2 + 显示图片matplotlib

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

 # BGR格式-三通道读取
img = cv2.imread("pictures/a.png") 
# 转成RGB格式
img2 = img[:,:,::-1]  # 通道翻转

plt.imshow(img2)
plt.show()

介绍另外一种写法:

In 20:

代码语言:python
代码运行次数:0
复制
# 读取图片cv2 + 显示图片matplotlib

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(10,6))

 # BGR格式-三通道读取
img = cv2.imread("pictures/a.png") 
img_new = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

plt.imshow(img_new)
plt.show()

图片大小cv2.namedWindow

上面介绍了图片的读取、写入和显示,下面介绍如何控制图片窗口显示的大小。

窗口的大小取决于图片的大小。

控制窗口大小的函数:cv2.namedWindow。其初始设置的标签为:cv2.WINDOW_AUTOSIZE,改为cv2.WINDOW_NORMAL即可控制窗口的大小。

In 21:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np

img = cv2.imread("pictures/a.png",flags=1)

cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)  # 重点:一定在imshow前面
cv2.imshow("image", img)

if cv2.waitKey(5000) & 0XFF == ord("s"): 
    cv2.imwrite("new_a.png",img) 

cv2.destroyAllWindows()

关于cv2.namedWindow的其他参数解释:

代码语言:python
代码运行次数:0
复制
# 窗口大小可改变
cv2.namedWindow("image",cv2.WINDOW_NORMAL)
cv2.namedWindow('image',cv2.WINDOW_GUI_NORMAL)

# 窗口大小不可改变
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

# 窗口大小自适应比例
cv2.namedWindow("image",cv2.WINDOW_FREERATIO)

# 窗口大小保持比例
cv2.namedWindow("image",cv2.WINDOW_KEEPRATIO)    

# 显示色彩变成
cv2.namedWindow('image',cv2.WINDOW_GUI_EXPANDED)

改变窗口大小resizeWindow

In 22:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np

img = cv2.imread("pictures/a.png",flags=1)
cv2.namedWindow("image",0)
cv2.resizeWindow("image",400,300)  # 黑色窗口大小

cv2.imshow("result",img)  # 显示图片

if cv2.waitKey(5000) & 0XFF == ord("s"): 
    cv2.imwrite("new_a.png",img) 

cv2.destroyAllWindows()

图片属性

OpenCV中图片是以矩阵的形式存储的。下面介绍计算机视觉中常用的图片属性:

  • 行数
  • 列数
  • 通道数

In 23:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np
img = cv2.imread("pictures/a.png")
img[:2]

Out23:

代码语言:python
代码运行次数:0
复制
array([[[169,  92,   0],
        [169,  92,   0],
        [169,  92,   0],
        ...,
        [169,  92,   0],
        [169,  92,   0],
        [169,  92,   0]],

       [[169,  92,   0],
        [169,  92,   0],
        [169,  92,   0],
        ...,
        [169,  92,   0],
        [169,  92,   0],
        [169,  92,   0]]], dtype=uint8)

查看整个图片的行数、列数和通道数:

In 24:

代码语言:python
代码运行次数:0
复制
img.shape  # 整体情况,元组形式

Out24:

代码语言:python
代码运行次数:0
复制
(733, 978, 3)

In 25:

代码语言:python
代码运行次数:0
复制
img.shape[0]  # 行数

Out25:

代码语言:python
代码运行次数:0
复制
733

In 26:

代码语言:python
代码运行次数:0
复制
img.shape[1]  # 列数

Out26:

代码语言:python
代码运行次数:0
复制
978

In 27:

代码语言:python
代码运行次数:0
复制
img.shape[2]  # 通道数

Out27:

代码语言:python
代码运行次数:0
复制
3

上面是以BGR格式读取的图片,如果换成以灰度图读取呢?

In 28:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np
img = cv2.imread("pictures/a.png",flags=0)

In 29:

代码语言:python
代码运行次数:0
复制
img.shape

Out29:

代码语言:python
代码运行次数:0
复制
(733, 978)

可以看到灰度图的shape值只会返回图片的行数和列数,不会返回通道数。二值图是一种特殊的灰度图,也不会返回通道数。

总结

常用基本函数的总结:

代码语言:python
代码运行次数:0
复制
import cv2
import numpy as np

# 读取BGR图
cv2.imread("pictures/a.png",flags=1)
cv2.imread("pictures/a.png")
cv2.imread("pictures/a.png",cv2.IMREAD_COLOR)

# 读取灰度图
cv2.imread("pictures/a.png",flags=0)
cv2.imread("pictures/a.png", cv2.IMREAD_GRAYSCALE)

# BGR和RGB通道转换
img_new = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)  
img_new = img[:,:,::-1]

cv2.write(filaname,img)  # 写入
cv2.imshow("img",img)  # 显示
cv2.waitKey(time) &0XFF  # 延时等待   
cv2.destroyAllWindows()  # 摧毁函数 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图像概述
  • OpenCV介绍
  • 应用领域
  • 安装opencv-python
  • OpenCV常用python内置函数
    • ord函数
      • max/min函数
        • sorted函数
        • 图片存储形式
          • BGR图
            • 灰度图
              • HSV图
                • 二值图
                • 图片读取和保存
                  • 图片格式
                    • 读取cv2.imread
                      • 保存cv2.imwrite
                      • 图片显示(基于cv2)
                        • 图片显示cv2.imshow()
                          • 图片延时cv2.waitKey(time)
                            • 延时后图片显示
                            • 图片显示(基于matplotlib)
                            • 图片大小cv2.namedWindow
                            • 改变窗口大小resizeWindow
                            • 图片属性
                            • 总结
                            相关产品与服务
                            图像处理
                            图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档