你是否曾好奇计算机是如何"看懂"这个世界的?从人脸识别到自动驾驶,计算机视觉技术正日益渗透到我们的生活中。而 OpenCV (Open Source Computer Vision Library),作为一个强大的开源计算机视觉库,正是我们探索这个奇妙世界的强大工具。
本文将带你从零开始,一步步走进 Python OpenCV 的世界。我们将用通俗易懂的方式讲解核心概念,并通过实际案例手把手教学,让你轻松掌握图像处理的基本技能。准备好了吗?让我们开始这段激动人心的旅程!

一、OpenCV 简介与安装
OpenCV 是什么?
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,拥有超过 2500 个优化过的算法。这些算法可以用于检测与识别面部、识别物体、分类人脸、跟踪摄像头上的物体以及很多其他应用。
安装 OpenCV
在使用 OpenCV 前,需要先安装它。通过 pip
安装 OpenCV 非常简单:
bash
pip install opencv-python
安装完成后,你可以通过 import cv2 来调用 OpenCV。
python
import cv2
二、基本图像读取与展示
首先,我们使用 OpenCV 的 cv2.imread
方法来读取图像,然后使用 cv2.imshow
展示图像。以下代码展示了如何实现这一步骤:
python
import cv2
# 读取图像(注意替换路径为你本地的图像路径)
img = cv2.imread("sample.jpg")
# 显示图像
cv2.imshow("原始图像", img)
# 等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imread("sample.jpg")
读取指定路径的图像文件。
cv2.imshow("窗口标题", img)
用于创建一个窗口,并在其中显示加载的图像 img
cv2.waitKey(0)
告诉程序等待任意按键,否则窗口会一闪而过,0表示无限等待
cv2.destroyAllWindows()
用于关闭所有创建的窗口,也就是我们前面按下任意键,这里会控制关闭所有通过 OpenCV 创建的显示窗口。
三、图像预处理:灰度化与二值化
图像预处理是图像分析中至关重要的一步,常见的操作包括灰度化和二值化。下面分别介绍这两个操作。
灰度化
灰度化可以减少计算量,将彩色图像转换为单通道灰度图像。
在图像处理中,将彩色图像转换为灰度图是一种常见的操作。常见的转换方法有加权平均法,即根据人眼对不同颜色的敏感度不同,对红(R)、绿(G)、蓝(B)三个通道的像素值进行加权平均。在 OpenCV 中,使用 cv2.cvtColor 函数(颜色转换函数)来实现这个转换,它使用的公式大致为:Gray = 0.299 * R + 0.587 * G + 0.114 * B 。
代码如下:
python
import cv2
# 读取图像
img = cv2.imread("sample.jpg")
# 将图像转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 显示灰度图
cv2.imshow("灰度图像", gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
tip:
- cvtColor 函数中
cvt
是convert
(转换)的缩写,Color
就是 "颜色" 的意思,所以cvtColor
整体含义就是 "颜色转换"参数 cv2.COLOR_BGR2GRAY
:将 BGR 颜色空间转换为 GRAY 颜色空间。在 OpenCV 中,默认读取的图像颜色通道顺序是 BGR,而很多其他库(如matplotlib
)使用的是 RGB 顺序

二值化
二值化图是一种特殊的图像,它的每个像素只有两种可能的值,通常是 0(黑色)和 255(白色)。二值化图常用于图像分割、特征提取等任务,因为它可以简化图像信息,突出目标物体的轮廓。
threshold
函数名 threshold
是 "阈值" 的意思,这个函数主要用于对图像进行阈值处理,也就是根据设定的阈值将图像的像素值进行分类,从而实现图像的二值化或其他阈值相关的处理。所以 cv2.threshold
整体表达的就是使用 OpenCV 对图像进行阈值操作。
python
import cv2
# 读取并转换为灰度图
img = cv2.imread("sample.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
# 参数解释:0为阈值,255为最大值,当像素值大于阈值时取 255,否则取 0
ret, binary_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
# 显示二值图像
cv2.imshow("二值图像", binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
中的阈值设为 127,函数会返回阈值和转换后的图像。
cv2.THRESH_BINARY
表示简单的二值化处理,即当像素的灰度值大于阈值时,将其设置为第三个参数指定的值(通常是 255);当像素的灰度值小于等于阈值时,将其设置为 0。

四、图像边缘检测与轮廓提取
边缘检测是许多图像分析算法的重要环节。OpenCV 提供了 Canny 边缘检测方法。与此同时,我们还介绍如何提取图像中的轮廓。
边缘检测(Canny 算法)
python
import cv2
# 读取并转换为灰度图
img = cv2.imread("sample.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用 Canny 算法进行边缘检测
edges = cv2.Canny(gray_img, 100, 200)
# 显示边缘检测结果
cv2.imshow("边缘检测", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.Canny(gray_img, 100, 200)
使用设定的低、高阈值进行边缘检测。
- 低阈值和高阈值的选择会对边缘检测的结果产生显著影响。
- 若两个阈值都设置得较高,可能会遗漏一些较弱的边缘,导致检测到的边缘较少。
- 若两个阈值都设置得较低,可能会产生较多的虚假边缘,使检测结果包含过多噪声。
- 通常情况下,高阈值与低阈值的比例为 2:1 或 3:1 时能得到较好的效果。不过,具体的阈值需要根据图像的特点和实际需求进行调整。

轮廓提取
基于二值图像,可以提取图像中的轮廓。
python
import cv2
# 读取图像并转换为灰度图,再进行二值化处理
img = cv2.imread("sample.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
# 提取轮廓
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 将轮廓绘制在原图上(复制一份图像)
img_contours = img.copy()
cv2.drawContours(img_contours, contours, -1, (0, 255, 0), 2)
# 显示结果
cv2.imshow("轮廓检测", img_contours)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.findContours
方法用于检测图像中的轮廓。
cv2.drawContours
方法则在图像上绘制出所有轮廓(绿色线条表示)。

五、实例讲解:综合案例演示
下面我们通过一个综合案例来展示从图像读取到边缘检测、再到轮廓提取的完整流程。
python
import cv2
import numpy as np
# 1. 读取图像
img = cv2.imread("sample.jpg")
# 2. 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 3. 对灰度图进行 Gaussian 模糊降噪
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 4. 进行 Canny 边缘检测
edges = cv2.Canny(blurred, 50, 150)
# 5. 找出图像轮廓
ret, thresh = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 6. 在原始图像上绘制轮廓
img_contours = img.copy()
cv2.drawContours(img_contours, contours, -1, (0, 255, 0), 2)
# 7. 显示所有处理结果
cv2.imshow("原始图像", img)
cv2.imshow("灰度图像", gray)
cv2.imshow("模糊图像", blurred)
cv2.imshow("边缘检测", edges)
cv2.imshow("轮廓绘制", img_contours)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码流程说明:
读取图像:加载待处理图像。
灰度化:转换为单通道灰度图便于进一步处理。
高斯模糊:通过 GaussianBlur 降噪,减少边缘检测时的噪点。
边缘检测:使用 Canny 算法提取图像的边缘信息。
二值化与轮廓提取:先对图像二值化,再利用 findContours 提取轮廓。
绘制轮廓:将提取的轮廓绘制回原图,观察效果。
展示结果:分别展示每一步的处理效果。

总结
恭喜你!通过本文的学习,你已经迈出了 Python OpenCV 计算机视觉之旅的第一步。你学会了如何读取、显示、保存图像,了解了图像的基本属性和像素操作,掌握了图像读取、边缘检测以及灰度转换等基本操作。
这只是 OpenCV 功能的冰山一角。在接下来的学习中,你将探索更多的图像处理技术,如图像滤波、特征提取、目标检测、平移旋转等等。计算机视觉的世界充满了无限的可能,而 OpenCV 将是你探索这个世界的强大助手。
继续你的学习吧!动手实践,探索更多 OpenCV 的功能,你将能够构建出令人惊叹的计算机视觉应用。如果你在学习过程中遇到任何问题,欢迎随时提问和交流。祝你在计算机视觉的道路上越走越远!
希望这篇文章能够帮助你入门 Python OpenCV!记住,实践是最好的老师。尝试用你自己的图片运行这些代码,并尝试修改参数,看看会发生什么。祝你学习愉快!
如果这篇文章对你有所启发,期待你的点赞关注!