OpenCV图片操作100例:从入门到精通指南(2)
接上篇,本文将继续分享OpenCV实用技巧,涵盖图像处理、目标检测、3D视觉等进阶领域!
六、图像变换进阶
17. 图像金字塔
# 高斯金字塔下采样
smaller = cv2.pyrDown(img)# 高斯金字塔上采样
larger = cv2.pyrUp(img)
用于多尺度图像处理,构建图像金字塔
18. 极坐标变换
polar = cv2.warpPolar(img, (300,300), (w//2, h//2), radius, cv2.WARP_POLAR_LINEAR
)
实现直角坐标系与极坐标系转换
19. 非均匀缩放
M = np.float32([[1, 0.5, 0], [0, 1, 0]])
sheared = cv2.warpAffine(img, M, (int(w*1.5), h))
实现图像剪切变形效果
20. 网格扭曲效果
map_x = np.zeros(img.shape[:2], np.float32)
map_y = np.zeros(img.shape[:2], np.float32)
# 创建网格扭曲映射...
distorted = cv2.remap(img, map_x, map_y, cv2.INTER_LINEAR)
实现自定义的网格变形效果
七、形态学操作大全
21. 膨胀操作
kernel = np.ones((5,5), np.uint8)
dilated = cv2.dilate(img, kernel)
扩大亮区域,连接断裂对象
22. 腐蚀操作
eroded = cv2.erode(img, kernel)
缩小亮区域,去除小噪点
23. 开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
先腐蚀后膨胀,去除小物体
24. 闭运算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
先膨胀后腐蚀,填充小孔洞
25. 形态学梯度
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
获取物体轮廓边缘
26. 顶帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
提取亮色小特征(如白纸黑字)
27. 黑帽操作
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
提取暗色小特征(如黑底白点)
八、图像滤波与增强
28. 双边滤波
bilateral = cv2.bilateralFilter(img, 9, 75, 75)
保持边缘锐利的同时降噪
29. 自定义滤波核
kernel = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]])
sharpened = cv2.filter2D(img, -1, kernel)
创建锐化滤波核增强细节
30. 导向滤波
# 使用PyTorch实现导向滤波更佳
# 伪代码:guided_filter = guideFilter(guide, img, radius, eps)
保持边缘的先进滤波技术
31. 非局部均值去噪
denoised = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
高效去除高斯噪声
32. 拉普拉斯锐化
laplacian = cv2.Laplacian(img, cv2.CV_64F)
sharp = cv2.convertScaleAbs(laplacian)
增强图像边缘和细节
九、视频处理技巧
33. 视频帧读取
cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():ret, frame = cap.read()if not ret: break# 处理帧
cap.release()
34. 视频写入
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
out.write(processed_frame)
out.release()
35. 帧差分法
prev_frame = None
while True:ret, frame = cap.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)if prev_frame is not None:diff = cv2.absdiff(gray, prev_frame)_, motion = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)prev_frame = gray
检测视频中的运动区域
36. 背景建模
bg_subtractor = cv2.createBackgroundSubtractorMOG2()
fg_mask = bg_subtractor.apply(frame)
分离前景运动物体
十、3D视觉与相机标定
37. 棋盘格角点检测
pattern_size = (9, 6)
ret, corners = cv2.findChessboardCorners(gray, pattern_size)
if ret:cv2.drawChessboardCorners(img, pattern_size, corners, ret)
相机标定的关键步骤
38. 相机标定
# 准备标定数据
obj_points = [] # 3D点
img_points = [] # 2D点# 执行标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None
)
39. 畸变校正
undistorted = cv2.undistort(img, mtx, dist)
40. 距离测量
# 已知物体大小和焦距
focal_length = 500 # 相机焦距(像素)
known_width = 20.0 # 物体实际宽度(cm)
pixel_width = 150 # 图像中的物体宽度(像素)
distance = (known_width * focal_length) / pixel_width
单目视觉距离测量
十一、目标检测进阶
41. HOG行人检测
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
rects, weights = hog.detectMultiScale(frame, winStride=(4,4), padding=(8,8), scale=1.05)
42. YOLO目标检测
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
blob = cv2.dnn.blobFromImage(img, 1/255, (416,416), swapRB=True, crop=False)
net.setInput(blob)
outputs = net.forward(net.getUnconnectedOutLayersNames())
43. 二维码检测
detector = cv2.QRCodeDetector()
data, points, _ = detector.detectAndDecode(img)
if points is not None:points = points[0].astype(int)cv2.polylines(img, [points], True, (0,255,0), 3)
十二、图像分析与测量
44. 轮廓近似
epsilon = 0.01 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
cv2.drawContours(img, [approx], 0, (0,255,0), 2)
45. 最小外接矩形
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img, [box], 0, (0,0,255), 2)
46. 最小外接圆
(x,y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
cv2.circle(img, center, radius, (255,0,0), 2)
47. 椭圆拟合
if len(cnt) >= 5:ellipse = cv2.fitEllipse(cnt)cv2.ellipse(img, ellipse, (0,255,0), 2)
十三、高级处理技巧
48. 图像修复
damaged = img.copy()
mask = np.zeros(img.shape[:2], np.uint8)
# 创建受损区域...
restored = cv2.inpaint(damaged, mask, 3, cv2.INPAINT_TELEA)
49. 高动态范围成像
# 准备不同曝光度的图像
images = [img1, img2, img3]
times = [0.5, 1.0, 2.0] # 曝光时间# 合并HDR图像
calibrate = cv2.createCalibrateDebevec()
response = calibrate.process(images, times)
merge = cv2.createMergeDebevec()
hdr = merge.process(images, times, response)
50. 图像拼接
stitcher = cv2.Stitcher_create()
status, panorama = stitcher.stitch([img1, img2])
if status == cv2.Stitcher_OK:cv2.imshow('Panorama', panorama)
十四、实用工具集锦(51-100)
分类 | 示例代码 | 功能描述 |
---|---|---|
绘图 | cv2.line(img, pt1, pt2, (0,0,255), 3) | 绘制直线 |
绘图 | cv2.arrowedLine(img, pt1, pt2, (0,255,0), 2) | 绘制箭头 |
绘图 | cv2.ellipse(img, center, axes, 0,0,360, (255,0,0), 2) | 绘制椭圆 |
计算 | dist = cv2.norm(pt1, pt2) | 计算两点距离 |
计算 | angle = cv2.fastAtan2(dy, dx) | 计算角度 |
变换 | log_trans = cv2.log(1 + img.astype(np.float32)) | 对数变换 |
分割 | markers = cv2.watershed(img, markers) | 分水岭分割 |
分割 | ret, markers = cv2.connectedComponents(binary) | 连通域分析 |
光流 | next_pts, status, err = cv2.calcOpticalFlowPyrLK(prev_gray, gray, prev_pts, None) | LK光流法 |
跟踪 | tracker = cv2.TrackerKCF_create() | KCF跟踪器 |
显示 | cv2.displayStatusBar("Window", "Processing...", 1000) | 状态栏显示 |
显示 | cv2.putText(img, "FPS: " + str(fps), (10,30), font, 1, (0,0,255), 2) | 显示FPS |
优化 | img_roi = cv2.UMat(img_roi) | 使用UMat加速 |
文件 | fs = cv2.FileStorage("data.yml", cv2.FILE_STORAGE_WRITE) | YML文件存取 |
卷积 | filtered = cv2.filter2D(img, -1, kernel) | 自定义卷积 |
统计 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(gray) | 极值查找 |
特征 | orb = cv2.ORB_create(nfeatures=500) | ORB特征点 |
匹配 | matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) | 特征匹配 |
颜色 | lab = cv2.cvtColor(img, cv2.COLOR_BGR2Lab) | 转换到Lab |
颜色 | mean_color = cv2.mean(img, mask) | 计算均值 |
二值 | thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2) | 自适应阈值 |
形态 | thinned = cv2.ximgproc.thinning(binary) | 细化操作 |
积分 | integral = cv2.integral(img) | 积分图像 |
距离 | dist_transform = cv2.distanceTransform(binary, cv2.DIST_L2, 3) | 距离变换 |
完整100例速查表
类别 | 数量 | 代表功能 |
---|---|---|
基础操作 | 12项 | 读写、转换、裁剪、旋转 |
增强处理 | 18项 | 滤波、降噪、边缘检测 |
特征分析 | 16项 | 角点、轮廓、特征点 |
目标检测 | 10项 | 人脸、行人、二维码 |
3D视觉 | 8项 | 标定、畸变校正、测距 |
视频处理 | 8项 | 读写、运动检测、跟踪 |
图像变换 | 10项 | 仿射、透视、极坐标 |
实用工具 | 18项 | 绘图、计算、文件操作 |
关注我们并获取更多【OpenCV100】获取更多示例