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】获取更多示例