OpenCV图片操作100例:从入门到精通指南(2)

发布于:2025-07-11 ⋅ 阅读:(34) ⋅ 点赞:(0)

接上篇,本文将继续分享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】获取更多示例


网站公告

今日签到

点亮在社区的每一天
去签到