1. 什么是OpenCV?
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,由 Intel 在1999年开发,并于2000年推出。它可以处理图像和视频中的许多常见任务,如:
图像处理(滤波、边缘检测等)
视频处理(实时视频处理等)
物体检测和识别(人脸识别、物体跟踪等)
机器学习(支持向量机、神经网络等)
目前,OpenCV 支持 C++、Python、Java 和 MATLAB 等多种编程语言,并可在多个平台上运行,如 Windows、Linux、macOS 和 Android。
2. 安装OpenCV
在安装 OpenCV 之前,需要确保已经安装了 Python。可以通过 pip 命令来安装 OpenCV:
pip install opencv-python
pip install opencv-python-headless # 不需要绘图界面的版本
3. 基本操作
3.1 导入库
首先需要导入 OpenCV 库和 numpy 库:
import cv2
import numpy as np
3.2 读取和显示图像
通过 cv2.imread() 读取图像,使用 cv2.imshow() 显示图像,并通过 cv2.waitKey(0) 保持窗口直到按下键盘任意键关闭。
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 显示图像
cv2.imshow('Image', image)
# 等待按键事件并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
3.3 保存图像
可以使用 cv2.imwrite() 来保存处理后的图像。
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 保存图像
cv2.imwrite('path_to_save_image.jpg', image)
# 显示保存信息
print("Image saved as path_to_save_image.jpg")
4. 图像处理基础
4.1 转换颜色空间
OpenCV 提供了丰富的颜色空间转换功能,如 RGB 转换为灰度图像。
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 转为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
其他常见的颜色空间转换包括:
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# BGR 到 HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow('HSV Image', hsv_image)
# BGR 到 LAB
lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
cv2.imshow('LAB Image', lab_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.2 图像缩放
可以使用 cv2.resize() 来调整图像的尺寸。
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 缩放图像到指定尺寸
resized_image = cv2.resize(image, (400, 400))
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 按比例缩放图像
height, width = image.shape[:2]
resized_image = cv2.resize(image, (int(width * 0.5), int(height * 0.5)))
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.3 图像翻转
可以使用 cv2.flip() 来翻转图像。
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 水平翻转
flipped_image = cv2.flip(image, 1)
cv2.imshow('Flipped Image', flipped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.4 边缘检测
Canny 边缘检测是边缘检测的有效方法。
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# Canny 边缘检测
edges = cv2.Canny(image, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.5 高斯模糊
使用 cv2.GaussianBlur() 来应用高斯模糊。
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 高斯模糊
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.6 形态学操作
常用的形态学操作包括腐蚀和膨胀。
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 创建一个 5x5 的核心
kernel = np.ones((5, 5), np.uint8)
# 腐蚀操作
erosion = cv2.erode(image, kernel, iterations = 1)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 膨胀操作
dilation = cv2.dilate(image, kernel, iterations = 1)
cv2.imshow('Dilation', dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
此外,还有更多的形态学操作,如开运算、闭运算等:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 创建一个 5x5 的核心
kernel = np.ones((5, 5), np.uint8)
# 开运算(先腐蚀后膨胀)
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
cv2.imshow('Opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 闭运算(先膨胀后腐蚀)
closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
cv2.imshow('Closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.7 图像平滑
图像平滑是为了减少噪声和细节,可以使用多种方法如均值滤波、中值滤波和双边滤波。
均值滤波
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 均值滤波
blurred_image = cv2.blur(image, (5, 5))
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
中值滤波
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 中值滤波
median_blurred_image = cv2.medianBlur(image, 5)
cv2.imshow('Median Blurred Image', median_blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
双边滤波
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 双边滤波
bilateral_blurred_image = cv2.bilateralFilter(image, 9, 75, 75)
cv2.imshow('Bilateral Blurred Image', bilateral_blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.8 直方图均衡化
直方图均衡化有助于增加图像的对比度。
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 将图像转换为灰度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 直方图均衡化
equalized_image = cv2.equalizeHist(gray_image)
cv2.imshow('Equalized Image', equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 图像中的基本绘制操作
OpenCV 提供了一些基本绘制函数,可以绘制线条、矩形、圆形、多边形和文本。
5.1 绘制线条
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 绘制从点 (0, 0) 到点 (511, 511) 的蓝色线条,线条粗细为 5
image_with_line = cv2.line(image.copy(), (0, 0), (511, 511), (255, 0, 0), 5)
cv2.imshow('Line', image_with_line)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.2 绘制矩形
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 绘制左上角 (384, 0) 到右下角 (510, 128) 的绿色矩形,线条粗细为 3
image_with_rectangle = cv2.rectangle(image.copy(), (384, 0), (510, 128), (0, 255, 0), 3)
cv2.imshow('Rectangle', image_with_rectangle)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.3 绘制圆形
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 绘制中心为 (447, 63) 半径为 63 的红色圆形,填充该圆
image_with_circle = cv2.circle(image.copy(), (447, 63), 63, (0, 0, 255), -1)
cv2.imshow('Circle', image_with_circle)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.4 绘制多边形
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 定义多边形的顶点
points = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
points = points.reshape((-1, 1, 2))
# 绘制多边形
image_with_polygon = cv2.polylines(image.copy(), [points], True, (0, 255, 255))
cv2.imshow('Polygon', image_with_polygon)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.5 绘制文本
import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 绘制文本
image_with_text = cv2.putText(image.copy(), 'OpenCV', (10, 500), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 255, 255), 2, cv2.LINE_AA)
cv2.imshow('Text', image_with_text)
cv2.waitKey(0)
cv2.destroyAllWindows()
6. 实例项目:边缘检测与形态学操作结合
一个典型的应用案例将边缘检测与形态学操作结合起来进行基本的图像处理。
import cv2
import numpy as np
# 读取图像
image = cv2.imread('path_to_image.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用高斯模糊
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
# 应用 Canny 边缘检测
edges = cv2.Canny(blurred_image, 50, 150)
# 定义形态学核心
kernel = np.ones((5, 5), np.uint8)
# 应用膨胀操作以增强边缘
dilated_edges = cv2.dilate(edges, kernel, iterations=1)
# 显示最终结果
cv2.imshow('Original Image', image)
cv2.imshow('Edges', edges)
cv2.imshow('Dilated Edges', dilated_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
7. 总结
OpenCV 是一个功能强大且易于使用的库,广泛应用于图像处理和计算机视觉领域。从读取和显示图像,到颜色空间转换、图像缩放、翻转、边缘检测、高斯模糊、形态学操作以及图像平滑和绘制,本文详细介绍了 OpenCV 的基础使用方法,附带了丰富的代码示例,帮助读者更直观地理解和应用。