【OpenCV入门实战】使用Python和OpenCV实现基础图像处理与计算机视觉应用
OpenCV环境配置与基础操作
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。在开始使用之前,我们首先需要安装它。对于Python用户,可以通过pip命令轻松安装:pip install opencv-python。安装完成后,在Python脚本中通过import cv2即可导入库。最基本的操作是读取、显示和保存图像。使用cv2.imread()函数读取图像,它会将图像加载为一个NumPy数组;cv2.imshow()函数会创建一个窗口来显示图像;最后使用cv2.imwrite()将处理后的图像保存到指定路径。需要注意的是,OpenCV默认使用BGR颜色模式,而非常见的RGB模式。
读取并显示图像
下面的代码演示了如何读取一张图片并将其显示在窗口中:
import cv2# 读取图像img = cv2.imread('image.jpg')# 显示图像cv2.imshow('Example Image', img)# 等待按键后关闭窗口cv2.waitKey(0)cv2.destroyAllWindows()
图像的基本变换
图像处理的核心任务之一是对图像进行几何变换,这包括缩放、旋转、平移等。OpenCV提供了简便的函数来实现这些操作。图像缩放使用cv2.resize()函数,可以指定目标尺寸或缩放比例。图像旋转则需要先通过cv2.getRotationMatrix2D()获取旋转矩阵,然后使用cv2.warpAffine()应用这个变换。这些变换是许多复杂计算机视觉任务的基础,如图像对齐和数据增强。
图像的缩放与旋转
以下是实现图像缩放和旋转的示例代码:
# 缩放图像至原图的一半resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)# 以图像中心为原点旋转45度(h, w) = img.shape[:2]center = (w // 2, h // 2)M = cv2.getRotationMatrix2D(center, 45, 1.0)rotated_img = cv2.warpAffine(img, M, (w, h))
图像色彩空间转换与阈值处理
将图像从一种色彩空间转换到另一种是常见的预处理步骤。最常用的转换是从BGR到灰度图(cv2.COLOR_BGR2GRAY)或从BGR到HSV(cv2.COLOR_BGR2HSV)。HSV色彩空间对于基于颜色的物体分割非常有用。阈值处理则是将灰度图像二值化的关键步骤,cv2.threshold()函数通过设定一个阈值,将像素值高于阈值的设为白色(255),低于的设为黑色(0),从而创建出黑白分明的图像,便于后续的边缘检测或轮廓查找。
转换为灰度图并应用阈值
此代码段展示了色彩空间转换和简单阈值处理:
# 转换为灰度图像gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 应用阈值,像素值大于127的设为255,小于的设为0ret, thresh_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
边缘检测与轮廓查找
边缘检测是识别图像中物体边界的技术。Canny边缘检测算法是其中最著名的方法之一,在OpenCV中通过cv2.Canny()函数实现。它需要设置两个阈值,用于检测强边缘和弱边缘。找到边缘后,我们通常希望找到这些边缘所构成的轮廓。cv2.findContours()函数能够从二值图像中提取轮廓,返回一个包含所有轮廓点的列表。这些轮廓可以用于物体计数、形状分析等应用。
Canny边缘检测与轮廓绘制
以下代码实现了边缘检测并在原图上绘制出找到的轮廓:
# 使用Canny算法检测边缘edges = cv2.Canny(gray_img, 50, 150)# 查找轮廓contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 在原图副本上绘制所有轮廓contour_img = img.copy()cv2.drawContours(contour_img, contours, -1, (0, 255, 0), 2)
人脸检测实战应用
作为计算机视觉的经典应用,人脸检测可以展示OpenCV的强大功能。OpenCV提供了预训练好的Haar级联分类器,用于检测图像或视频流中的人脸。首先需要加载分类器文件(通常是一个.xml文件),然后使用cv2.CascadeClassifier.detectMultiScale()方法在灰度图像中进行检测。该方法会返回一个列表,其中包含每个检测到的人脸区域的矩形坐标(x, y, width, height),最后我们可以用cv2.rectangle()函数将这些矩形框绘制在原始图像上。
使用Haar级联分类器检测人脸
这是一个完整的人脸检测示例:
# 加载预训练的人脸检测器face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')# 确保图像为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测人脸faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 在图像上绘制人脸框for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)# 显示结果cv2.imshow('Face Detection', img)cv2.waitKey(0)更多推荐
所有评论(0)