Python OpenCV教程详解

一、OpenCV介绍

OpenCV,全称为Open Source Computer Vision Library,是一个开源的计算机视觉库。对于包括视频处理、计算机视觉、机器学习在内的许多领域都有非常广泛的应用。OpenCV最初由英特尔公司发起,现在由Willow Garage、Itseez等公司及个人维护。OpenCV提供了丰富的图像处理和计算机视觉算法,涉及图像处理、特征提取、目标跟踪、人脸识别、机器学习等方面。其模块化的设计、开源的代码、跨平台的支持,赢得了广大计算机视觉从业者和工程师的青睐。

二、OpenCV安装

OpenCV可以在Python中使用,首先需要安装OpenCV库。OpenCV可以通过pip安装,只需要使用以下命令即可:

pip install opencv-python
pip install opencv-contrib-python

安装完成后,我们就可以在Python中使用OpenCV库了。

三、OpenCV图像读取和显示

在OpenCV中,使用cv2.imread()函数读取图像文件,函数参数为文件名和读取标志。

1 import cv2
2 
3 #读取图像
4 img = cv2.imread('lena.jpg',cv2.IMREAD_COLOR)
5 
6 #显示图像
7 cv2.imshow('image',img)
8 cv2.waitKey(0) #等待按键
9 cv2.destroyAllWindows() #销毁所有窗口

第4行代码中,cv2.IMREAD_COLOR表示按彩色图像的方式读取图像文件。读取完成后,使用cv2.imshow()函数显示图像。第7行代码中,第一个参数为窗口名称,第二个参数为要显示的图像的变量名。cv2.waitKey()函数用于等待按键,当按下任意键时程序退出。最后一行代码销毁所有的窗口。

四、OpenCV图像处理

1. 图像平滑处理

在OpenCV中,使用cv2.blur()函数进行图像平滑处理。函数的参数包括输入图像、卷积核大小等。例如:

1 import cv2
2 
3 #读取图像
4 img = cv2.imread('lena.jpg')
5 
6 #图像平滑处理,卷积核大小为5x5
7 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
8 img_blur = cv2.blur(img, (5,5))
9 
10 #显示图像
11 cv2.imshow('image',img)
12 cv2.imshow('image_blur',img_blur)
13 cv2.waitKey(0) #等待按键
14 cv2.destroyAllWindows() #销毁所有窗口

上面的代码中,cv2.getStructuringElement()函数用于获取MORPH_RECT类型的卷积核。然后使用cv2.blur()平滑处理图像,最后用cv2.imshow()函数显示原图和平滑后的图像。运行代码后,我们可以看到平滑后的图像较原图模糊,可以起到一定的降噪作用。

2. 图像阈值处理

在OpenCV中,使用cv2.threshold()函数进行图像阈值处理。函数的参数包括输入图像、阈值、最大像素值等。例如:

1 import cv2
2 
3 #读取图像
4 img = cv2.imread('lena.jpg',0)
5 
6 #图像阈值处理
7 ret,img_threshold = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
8 
9 #显示图像
10 cv2.imshow('image',img)
11 cv2.imshow('image_threshold',img_threshold)
12 cv2.waitKey(0) #等待按键
13 cv2.destroyAllWindows() #销毁所有窗口

上面的代码中,cv2.imread()函数读入的图像文件是灰度图像,因此第二个参数为0。然后使用cv2.threshold()函数进行阈值处理,threshold函数返回值有两个,第一个为阈值化的阈值值(在本例中为100),第二个为阈值化后的图像。最后使用cv2.imshow()函数显示原图和阈值化后的图像。

3. 图像边缘检测

在OpenCV中,使用cv2.Canny()函数进行图像边缘检测。函数的参数包括输入图像、阈值等。例如:

1 import cv2
2 
3 #读取图像
4 img = cv2.imread('lena.jpg',0)
5 
6 #图像边缘检测
7 img_canny = cv2.Canny(img, 100, 200)
8 
9 #显示图像
10 cv2.imshow('image',img)
11 cv2.imshow('image_canny',img_canny)
12 cv2.waitKey(0) #等待按键
13 cv2.destroyAllWindows() #销毁所有窗口

上面的代码中,cv2.imread()函数读入的图像文件是灰度图像,因此第二个参数为0。然后使用cv2.Canny()函数进行图像边缘检测,其中第二个和第三个参数分别为低阈值和高阈值,最后使用cv2.imshow()函数显示原图和边缘检测后的图像。

五、OpenCV图像处理实例

下面我们来看一个实例,通过OpenCV对图像进行颜色识别并在图像上标出颜色区域。

首先,我们需要加载一张彩色图像,并将图像进行平滑处理:

1 import cv2
2 import numpy as np
3 
4 #读取图像
5 img = cv2.imread('fruits.jpg')
6 
7 #图像平滑处理,卷积核大小为5x5
8 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
9 img_blur = cv2.blur(img, (5,5))

然后,我们将图像转换到HSV颜色空间,从而可以使用颜色阈值过滤器实现对图像上的特定颜色进行识别。

1 #将图像转换到HSV颜色空间
2 img_hsv = cv2.cvtColor(img_blur, cv2.COLOR_BGR2HSV)
3 
4 #设定颜色区间
5 lower_red = np.array([0, 50, 50])
6 upper_red = np.array([10, 255, 255])
7 
8 #过滤出红色区域
9 mask = cv2.inRange(img_hsv, lower_red, upper_red)

接下来,我们对过滤出的颜色区域进行形态学处理,去掉噪点和孤立的区域:

1 #形态学处理
2 mask = cv2.erode(mask, kernel, iterations=2)
3 mask = cv2.dilate(mask, kernel, iterations=2)

最后,我们根据颜色区域的轮廓,使用cv2.drawContours()函数将颜色区域标出:

1 #查找轮廓
2 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
3 
4 #标出颜色区域
5 for contour in contours:
6     cv2.drawContours(img, [contour], 0, (0,255,0), 3)
7 
8 #显示图像
9 cv2.imshow('image',img)
10 cv2.waitKey(0) #等待按键
11 cv2.destroyAllWindows() #销毁所有窗口

完整的代码如下:

1 import cv2
2 import numpy as np
3 
4 #读取图像
5 img = cv2.imread('fruits.jpg')
6 
7 #图像平滑处理,卷积核大小为5x5
8 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
9 img_blur = cv2.blur(img, (5,5))
10 
11 #将图像转换到HSV颜色空间
12 img_hsv = cv2.cvtColor(img_blur, cv2.COLOR_BGR2HSV)
13 
14 #设定颜色区间
15 lower_red = np.array([0, 50, 50])
16 upper_red = np.array([10, 255, 255])
17 
18 #过滤出红色区域
19 mask = cv2.inRange(img_hsv, lower_red, upper_red)
20 
21 #形态学处理
22 mask = cv2.erode(mask, kernel, iterations=2)
23 mask = cv2.dilate(mask, kernel, iterations=2)
24 
25 #查找轮廓
26 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
27 
28 #标出颜色区域
29 for contour in contours:
30     cv2.drawContours(img, [contour], 0, (0,255,0), 3)
31 
32 #显示图像
33 cv2.imshow('image',img)
34 cv2.waitKey(0) #等待按键
35 cv2.destroyAllWindows() #销毁所有窗口

六、总结

通过本文的介绍,我们了解了OpenCV的基本概念、安装方法,以及常见的图像处理方法。在实际应用中,OpenCV可以实现很多有趣的功能,如人脸识别、目标跟踪等。希望本文能为初学者提供一些帮助,让大家更好地掌握OpenCV这个强大的计算机视觉库。

原创文章,作者:NHZX,如若转载,请注明出处:https://www.506064.com/n/133925.html

(0)
NHZXNHZX
上一篇 2024-10-04
下一篇 2024-10-04

相关推荐

  • 以InputStream为中心的Java文件读取

    一、什么是InputStream InputStream是Java中一个抽象类,它是所有字节输入流的父类。它提供了一种方法来读取字节流并从中提取数据。 通常情况下,我们读取文件都使…

    编程 2024-10-04
  • 如何快速替换块,替换怎么替换一部分

    本文目录一览: 1、cad中怎么批量用图形替换块? 2、cass怎么批量替换块 3、cad中怎么替换块? 4、cad中如何批量替换块 5、cad如何替换块 6、cad中怎样一种块批…

    编程 2024-10-08
  • vde丶java教程网(dev java)

    本文目录一览: 1、哪有免费的JAVA教程? 2、谁知道java视频哪个网站比较全呢? 3、学习Java应该关注哪些网站 4、谁知道java教程 网上哪儿能看到?知道的说下? 5、…

    编程 2024-10-03
  • jsphp变量代码(宏变量代码一览表)

    本文目录一览: 1、js如何调用php变量 2、如何在js里引用php变量 3、如何在当前页面用php 获取js 变量的值 4、js输出php变量,要怎么做,求详细代码 js如何调…

    编程 2024-10-03
  • 使用i left my stuff login,轻松管理您的个人物品

    一、 简介 i left my stuff login是一款免费的个人物品管理应用,它可以帮助用户轻松地记录、管理和查找自己的个人物品。通过这个应用程序,用户可以随时随地掌握自己的…

    编程 2024-10-09
  • AAC文件详解

    现在音视频流行的编码格式主要有MP3、AAC、AC3、DTS等等。其中AAC文件在实际应用中占有非常重要的地位。本文将从格式、编码、解码、转换等多个方面对AAC文件进行详细的阐述。…

    编程 2024-10-03
  • c语言做的简易计算器,c语言编程一个简单的计算器

    本文目录一览: 1、怎么用C语言设计一个简单计算器 2、c语言编写 编写一个简单的计算器,实现两个整型数的四则运算。 3、如何使用C语言做一个简单的计算器 4、用简单c语言编写计算…

    编程 2024-10-04
  • CSS HTML Style Cursor Pointer

    一、指针变化 在网页开发过程中,指针的变化很常见,如当鼠标悬停在图片上时,鼠标指针会变为手型,或者当鼠标悬停在链接上时,鼠标指针会变为小手形状。 CSS提供了一种简便的方法来实现指…

    编程 2024-10-03
  • 包含mysql数据库excel的词条

    本文目录一览: 1、如何通过Excel查询MySQL数据库 2、如何将excel数据导入mysql数据库 3、如何在MySQL数据库中导入excel文件内的数据 如何通过Excel…

    编程 2024-10-04
  • Python字典生成式的全面解析

    一、Python字典用法 Python字典是一种无序、可变和可迭代的数据类型,用大括号{}表示,其中每个元素都是一个键值对,通过键来访问对应的值。 #示例 d = {‘apple’…

    编程 2024-10-04

发表回复

登录后才能评论