一、图像数据源读取
(一)静态图像读取
- API 函数:
cv2.imread(filename, flags)
- 作业场景:读取作业要求的图片(如作业 1 读图绘制矩形、作业 2 读图处理颜色通道 )。
- 关键参数:
flags
常用cv2.IMREAD_COLOR
(默认 BGR 读入 )、cv2.IMREAD_GRAYSCALE
(作业 2 阈值处理、作业 3 轮廓检测常用灰度图 )。 - 示例:
img = cv2.imread('task_img.jpg', cv2.IMREAD_GRAYSCALE)
(作业 2 阈值处理前置 )
(二)动态图像(视频)读取(基础)
- 摄像头 / 视频文件:
cap = cv2.VideoCapture(0)
(摄像头 )或cap = cv2.VideoCapture('video.mp4')
(视频 ),逐帧用ret, frame = cap.read()
获取,最后cap.release()
释放。 - 作业关联:若作业涉及视频(如后续拓展 ),流程一致,可用于动态画面处理(如画圆标记 )。
二、图像基础操作
(一)鼠标交互绘制(鼠标画矩形 )
- 实现逻辑:
- 定义鼠标回调函数:
def mouse_callback(event, x, y, flags, param)
,判断event
类型(如cv2.EVENT_LBUTTONDOWN
按下、cv2.EVENT_LBUTTONUP
抬起 ),记录矩形起点、终点坐标。 - 绑定回调:
cv2.setMouseCallback(window_name, mouse_callback)
。 - 循环显示图像,根据坐标绘制矩形:
cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2)
。
- 定义鼠标回调函数:
(二)颜色通道操作(分区域改颜色通道 )
- 通道拆分与合并:
- 拆分:
b, g, r = cv2.split(img)
(BGR 顺序 ),作业 1 中 “上部三分之一改红色”→ 对应区域r
通道赋值 255 。 - 合并:
img_merge = cv2.merge((b, g, r))
,将修改后的通道合并回图像。
- 拆分:
- 作业示例:
height, width = img.shape[:2] # 上部三分之一区域 img[:height//3, :, 2] = 255 # 红色通道(BGR 中 R 是第三个通道 ) img[height//3:2*height//3, :, 0] = 255 # 蓝色通道(B 是第一个通道 ) img[2*height//3:, :, 1] = 255 # 绿色通道(G 是第二个通道 )
(三)图像叠加(作业 1 要求:三种方式叠加两张图 )
- 方法 1:直接加权(
cv2.addWeighted
)res = cv2.addWeighted(img1, 0.5, img2, 0.5, 0) # 权重和为 1,0 是 gamma 值
- 方法 2:按位运算(
cv2.bitwise_and/or/not
)
需确保图像大小、通道一致,适合遮罩叠加:mask = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)[1] res = cv2.bitwise_and(img1, img2, mask=mask)
- 方法 3:手动遍历像素叠加
逐像素计算res[i,j] = alpha*img1[i,j] + beta*img2[i,j]
,效率低但灵活,作业中用于理解原理。
三、颜色空间转换
(一)基础转换(RGB ↔ HSV 等 )
- API:
cv2.cvtColor(src, code)
,作业 2 要求RGB→HSV
转换,示例:hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # OpenCV 读入是 BGR,先转 RGB 再转 HSV 更直观(或直接转 ,注意顺序 )
- 通道含义:
- HSV 中 H(0 - 180 )、S(0 - 255 )、V(0 - 255 ),作业 2 可通过调整 H 通道实现颜色筛选(如提取红色物体 )。
(二)作业场景应用(区分 R、G、B 通道 )
- 拆分通道:
b, g, r = cv2.split(img)
,单独显示 / 处理每个通道,作业 2 中观察颜色分布。 - 通道可视化:将单通道(如 R )扩展为三通道(
cv2.merge((r, r, r))
),方便在彩色窗口显示灰度通道。
四、几何变换
(一)平移、缩放、旋转、放射变换
-
平移:
M = np.float32([[1, 0, tx], [0, 1, ty]]) dst = cv2.warpAffine(img, M, (width, height))
作业 2 中按要求平移图像,如
tx=50, ty=30
右移、下移。 -
缩放:
dst = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
作业 2 需指定缩放尺寸(如
(width*2, height*2)
放大 )。 -
旋转:
M = cv2.getRotationMatrix2D((center_x, center_y), angle, scale) dst = cv2.warpAffine(img, M, (width, height))
作业 2 中旋转角度(如
angle=45
度 ),scale=1
保持尺寸。 -
放射变换:
定义变换前后的点对,计算矩阵M = cv2.getAffineTransform(src_pts, dst_pts)
,再用warpAffine
变换,作业 2 中实现复杂形变。
五、阈值处理
(一)固定阈值
- API:
ret, dst = cv2.threshold(src, thresh, maxval, type)
- 作业场景(5 种类型示例 ):
# 二值化 _, dst_bin = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY) # 反二值化 _, dst_bin_inv = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY_INV) # 截断 _, dst_trunc = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TRUNC) # 置零 _, dst_tozero = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TOZERO) # 反置零 _, dst_tozero_inv = cv2.threshold(gray_img, 127, 255, cv2.THRESH_TOZERO_INV)
作业 2 需展示每种阈值的效果,分析对图像的影响(如二值化突出黑白对比 )。
(二)自适应阈值
- API:
dst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)
- 作业对比:与固定阈值对比,展示对光照不均图像(如文档 )的优化效果。
六、平滑滤波
(一)常用滤波方法
- 均值滤波:
cv2.blur(img, (3,3))
,简单平均,作业 2 中观察模糊效果。 - 高斯滤波:
cv2.GaussianBlur(img, (3,3), 0)
,去高斯噪声,边缘保留更好。 - 中值滤波:
cv2.medianBlur(img, 3)
,去椒盐噪声(作业 2 中若有噪声图,效果显著 )。 - 双边滤波:
cv2.bilateralFilter(img, 9, 75, 75)
,保边去噪(同时考虑空间距离和颜色差异 ),作业 2 中处理纹理图像。
七、轮廓检测与物体标识
(一)轮廓检测流程
- 预处理:
- 转灰度:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- 阈值 / 边缘检测:
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
(或 Canny )
- 转灰度:
- 找轮廓:
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- 分析轮廓:
- 质心坐标:
M = cv2.moments(contour)
,cx = int(M['m10']/M['m00'])
,cy = int(M['m01']/M['m00'])
- 面积:
area = cv2.contourArea(contour)
- 最小外切圆:
(x,y), radius = cv2.minEnclosingCircle(contour)
- 质心坐标:
- 绘制与报告:
用cv2.drawContours
画轮廓,cv2.circle
画质心、外切圆,按实验报告模板整理流程、代码、结果。
八、形态学操作
(一)腐蚀与膨胀
- 腐蚀:
cv2.erode(binary, kernel, iterations=1)
,消除小噪点、细化轮廓。 - 膨胀:
cv2.dilate(binary, kernel, iterations=1)
,连接断开区域、填充空洞。 - 作业应用:作业 3 中对阈值后的二值图预处理,提升轮廓检测准确性。
九、视频处理基础
(一)核心操作
- 读视频 / 摄像头:
cap = cv2.VideoCapture(0)
,循环ret, frame = cap.read()
获取帧。 - 绘制操作:在帧上用
cv2.circle(frame, (x,y), radius, (0,255,0), 2)
画圆,实现动态标记(如跟踪鼠标点击 )。 - API 英译中:
VideoCapture
(视频捕获 )、imshow
(显示 )、waitKey
(延时 )、circle
(画圆 )等,作业 1 中需准确调用。
十、复习策略(结合作业)
- 代码复现:把三次作业代码重新跑通,梳理每一步 API 作用(如作业 1 鼠标回调、作业 2 颜色通道修改、作业 3 轮廓质心计算 )。
- 考点关联:作业中涉及的函数(
imread
、cvtColor
、threshold
、findContours
等 )是考试重点,熟记参数和应用场景。 - 流程梳理:如作业 3 轮廓检测流程(去噪→二值化→找轮廓→分析特征 ),对应复习笔记中 “轮廓检测” 模块,确保步骤清晰。
提示:复习时结合作业代码,重点关注老师要求的 “前三次作业重中之重” 内容,尤其是作业 1 的交互绘制、作业 2 的多变换组合、作业 3 的轮廓分析,这些是考试实操题的原型!