第二章:OpenCV基础知识
2.1 OpenCV中的数据结构和基本概念
2.1.1 Mat对象与图像表示
在OpenCV中,cv::Mat
是最重要的数据结构,用于表示图像和多维数组。
Mat的基本结构:
- 数据部分:存储像素数据。
- 元信息:包含图像的行数、列数、通道数、数据类型等。
创建Mat对象的常用方法:
- 从文件读取图像:
cpp
cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
- 创建空白图像:
cpp
cv::Mat blank = cv::Mat::zeros(500, 500, CV_8UC3);
- 转换数据类型:
cpp
cv::Mat converted; img.convertTo(converted, CV_32F);
Mat对象的常用方法:
rows
:行数cols
:列数channels()
:通道数type()
:数据类型
Python示例:
python
import cv2
import numpy as np
# 创建一个500x500的黑色图像
img = np.zeros((500, 500, 3), dtype=np.uint8)
# 打印图像信息
print(f"Rows: {img.shape[0]}, Cols: {img.shape[1]}, Channels: {img.shape[2]}")
2.1.2 图像的基本操作
-
读取图像
- 读取彩色图像:
cv2.IMREAD_COLOR
- 读取灰度图像:
cv2.IMREAD_GRAYSCALE
- 读取原始图像:
cv2.IMREAD_UNCHANGED
python
img = cv2.imread("image.jpg", cv2.IMREAD_COLOR)
- 读取彩色图像:
-
显示图像
python
cv2.imshow("Display window", img) cv2.waitKey(0) # 按任意键关闭窗口 cv2.destroyAllWindows()
-
保存图像
python
cv2.imwrite("output.jpg", img)
-
访问像素值
python
# 访问特定像素 pixel = img[100, 100] print(f"Pixel value: {pixel}") # 修改像素值 img[100, 100] = [255, 0, 0] # 将像素设置为蓝色
2.2 OpenCV中的基本绘图函数
OpenCV提供了一组绘图函数,可以直接在图像上绘制线条、形状和文本。
2.2.1 画线
python
cv2.line(img, (50, 50), (450, 50), (0, 255, 0), thickness=2)
2.2.2 画矩形
python
cv2.rectangle(img, (100, 100), (400, 300), (255, 0, 0), thickness=3)
2.2.3 画圆
python
cv2.circle(img, (250, 250), 50, (0, 0, 255), thickness=-1) # 填充圆
2.2.4 添加文字
python
cv2.putText(img, "Hello, OpenCV!", (50, 400), cv2.FONT_HERSHEY_SIMPLEX,
fontScale=1, color=(255, 255, 255), thickness=2)
2.3 图像的颜色空间
2.3.1 常见颜色空间
- BGR:OpenCV默认的颜色空间。
- Gray:灰度图像。
- HSV:色调(Hue)、饱和度(Saturation)、亮度(Value)。
- Lab:亮度(L)、色差(a、b)。
2.3.2 颜色空间转换
python
# BGR转灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# BGR转HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
2.4 图像处理基础
图像处理是OpenCV的核心功能之一,以下介绍一些常用的图像处理操作。
2.4.1 图像平滑与模糊
图像平滑用于减少噪声,使图像更加柔和。常见的平滑方法包括均值滤波、高斯滤波和中值滤波。
1. 均值滤波
通过邻域内像素的平均值替换中心像素值。
python
blurred = cv2.blur(img, (5, 5)) # 5x5的卷积核
2. 高斯滤波
使用高斯核对图像进行卷积,平滑效果更自然。
python
gaussian = cv2.GaussianBlur(img, (5, 5), sigmaX=0)
3. 中值滤波
使用邻域内像素的中值代替中心像素值,特别适合去除椒盐噪声。
python
median = cv2.medianBlur(img, 5) # 核大小为5
2.4.2 边缘检测
边缘检测用于识别图像中显著的变化区域。
1. Sobel算子
计算图像的一阶或二阶导数,用于检测水平和垂直方向的边缘。
python
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) # x方向
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) # y方向
2. Canny边缘检测
通过计算梯度并应用双阈值筛选来提取图像边缘。
python
edges = cv2.Canny(img, threshold1=100, threshold2=200)
2.4.3 形态学操作
形态学操作是基于图像结构元素进行的图像处理技术,常用于去噪、填充小孔等。
1. 腐蚀(Erosion)
通过最小值滤波器缩小白色区域。
python
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
eroded = cv2.erode(img, kernel, iterations=1)
2. 膨胀(Dilation)
通过最大值滤波器扩大白色区域。
python
dilated = cv2.dilate(img, kernel, iterations=1)
3. 开运算与闭运算
- 开运算:先腐蚀后膨胀,用于去除小噪点。
- 闭运算:先膨胀后腐蚀,用于填补小孔。
python
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)