【OpenCV 图像变换实战:旋转、模板匹配与金字塔操作】
在计算机视觉领域图像变换是最基础也最核心的操作之一。无论是简单的图像旋转、精准的模板匹配还是用于图像分层处理的金字塔操作都是实现图像增强、目标检测、图像重建的关键技术。本文将结合实战代码系统讲解 OpenCV 中这三类核心图像变换技术的原理与实现。一、图像旋转两种高效实现方式图像旋转是调整图像角度的基础操作OpenCV 提供了两种常用实现方案基于 NumPy 的np.rot90和 OpenCV 原生的cv2.rotate二者各有优势可根据场景灵活选择。1.1 np.rot90 实现旋转np.rot90是 NumPy 库提供的旋转函数通过参数k控制旋转方向和角度• k1逆时针旋转 90 度• k-1顺时针旋转 90 度• k2旋转 180 度#方法1 img cv2.imread(rD:\software\Pycharm\计算机视觉\kele.png) #旋转90度k1 表示逆时针旋转90度 rotated_image1np.rot90(img,k-1) #选转90度k1表示逆时针旋转90度 rotated_image2np.rot90(img,k1) cv2.imshow(yuantu,img) cv2.imshow(rorated_image1,rotated_image1) cv2.imshow(rorated_image2,rotated_image2) cv2.waitKey(0) cv2.destroyAllWindows()此图是kele.png运行结果1.2 cv2.rotate 实现旋转OpenCV 原生的cv2.rotate函数语义更直观直接通过参数指定旋转方式#方法 rotated_imagecv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)#顺时针90度 rorated_image1cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE)#逆时针90度 rotated_image2cv2.rotate(img,cv2.ROTATE_180)#旋转180度 cv2.imshow(shun90,rotated_image) cv2.imshow(ni90,rotated_image1) cv2.imshow(180,rotated_image2) cv2.waitKey(0)如果仅需 90/180/270 度旋转cv2.rotate语义更清晰若需自定义旋转角度可结合cv2.getRotationMatrix2D和cv2.warpAffine实现。二、模板匹配多角度匹配与非极大值抑制模板匹配是在图像中寻找与模板相似区域的技术常用于目标检测。基础模板匹配仅能匹配固定角度的目标结合旋转和非极大值抑制可实现多角度、无重复的精准匹配。2.1 基础模板匹配基础模板匹配流程读取图像→灰度化→模板匹配→阈值筛选→绘制匹配框import cv2 import numpy as np # img_rgb cv2.imread(image.jpg) img_gray cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY) template cv2.imread(tem.jpg,0) h,wtemplate.shape[:2] #使用模板匹配方法cv2.matchTemplate 进行模版匹配 rescv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) #设定匹配阈值 threshold 0.75 #获取匹配结果中所有符合阈值点的坐标 locnp.where(resthreshold)#符合条件的行符合条件的列 print(loc) #遍历所有匹配点 for pt in zip(*loc[::-1]): #在原图上绘制匹配区域的矩形框 cv2.rectangle(img_rgb,pt,(pt[0]w,pt[1]h),(0,0,255),1) cv2.imshow(,img_rgb) cv2.waitKey(0)运行结果2.2 进阶多角度匹配 非极大值抑制基础匹配无法处理目标旋转的场景通过对模板进行多角度旋转并使用非极大值抑制NMS去除重复匹配框可解决该问题import cv2 import numpy as np def non_max_suppression(boxes, overlapThresh): 非极大值抑制去除重叠率过高的匹配框 if len(boxes) 0: return [] # 提取框坐标、得分和面积 x1 boxes[:, 0] y1 boxes[:, 1] x2 boxes[:, 2] y2 boxes[:, 3] scores boxes[:, 4] areas (x2 - x1 1) * (y2 - y1 1) # 按得分降序排序 order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) # 计算当前框与其他框的交集 xx1 np.maximum(x1[i], x1[order[1:]]) yy1 np.maximum(y1[i], y1[order[1:]]) xx2 np.minimum(x2[i], x2[order[1:]]) yy2 np.minimum(y2[i], y2[order[1:]]) w np.maximum(0.0, xx2 - xx1 1) h np.maximum(0.0, yy2 - yy1 1) inter w * h # 计算重叠率 ovr inter / (areas[i] areas[order[1:]] - inter) # 保留重叠率低于阈值的框 inds np.where(ovr overlapThresh)[0] order order[inds 1] return keep # 1. 读取图像和模板 img_rgb cv2.imread(image.jpg) img_gray cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template cv2.imread(tem.jpg, 0) h, w template.shape[:2] all_boxes [] # 2. 对模板进行0°、90°、180°、270°旋转并匹配 for k in [0, 1, 2, 3]: rotated_template np.rot90(template, kk) rh, rw rotated_template.shape # 模板匹配 res cv2.matchTemplate(img_gray, rotated_template, cv2.TM_CCOEFF_NORMED) # 筛选匹配点 loc np.where(res 0.75) # 收集匹配框x1,y1,x2,y2,score for pt in zip(*loc[::-1]): score res[pt[1], pt[0]] all_boxes.append([pt[0], pt[1], pt[0]rw, pt[1]rh, score]) # 3. 非极大值抑制去重 all_boxes np.array(all_boxes) keep non_max_suppression(all_boxes, overlapThresh0.3) final_boxes all_boxes[keep] # 4. 绘制最终匹配框 for box in final_boxes: x1, y1, x2, y2, _ box cv2.rectangle(img_rgb, (int(x1), int(y1)), (int(x2), int(y2)), (0,0,255), 2) cv2.imshow(多角度模板匹配, img_rgb) cv2.waitKey(0) cv2.destroyAllWindows()模板旋转覆盖 0°、90°、180°、270° 四个角度适配旋转后的目标非极大值抑制通过计算框的重叠率去除重复匹配框避免同一目标被多次检测。三、图像金字塔下采样、上采样与拉普拉斯金字塔图像金字塔是一种多尺度表示方法通过对图像进行下采样缩小和上采样放大构建不同分辨率的图像层级常用于图像融合、特征提取、图像重建等场景。3.1 高斯金字塔下采样与上采样高斯金字塔的核心是cv2.pyrDown下采样和cv2.pyrUp上采样下采样先高斯模糊再隔行隔列采样图像尺寸减半上采样先将图像尺寸翻倍补 0再进行高斯滤波图像尺寸翻倍但会模糊。import cv2 import numpy as np 高阶金字塔操作中的向下采样 # 下采样 是一种减小图像尺寸的方法它通常涉及到降低图像的分辨率即减少图像中像素的数量从而使图像看起来更小。 # 上采样 是一种增大图像尺寸的方法它通过插值和滤波技术来恢复图像的分辨率和细节通常用于图像放大或者与下采样后的图像进行比较。 # ## resize函数 是一种通用的图像尺寸调整方法它可以按照指定的目标尺寸来缩放图像不涉及金字塔结构或者特定的滤波操作。 # dst cv2.pyrDown(src [,dst, dstsize [, borderType] ]) # dst:目标图像 # src:原始图像 # dstsize:目标图像的大小 face cv2.imread(zx_min.jpg,cv2.IMREAD_GRAYSCALE) cv2.imshow(face,face) # cv2.waitKey(0) face_down_1cv2.pyrDown(face) cv2.imshow(down_1,face_down_1) # cv2.waitKey(0) face_down_2cv2.pyrDown(face_down_1) cv2.imshow(down_2,face_down_2) # cv2.waitKey(0) #高斯金字塔操作中的向上采样 #dst cv2.pyrUp(src [,dst,dstsize [, borderType] ]) # dst:目标图像 # src:原始图像 # dstsize:目标图像的大小 face_up_1cv2.pyrUp(face) cv2.imshow(up_1,face_up_1) # cv2.waitKey(0) face_up_2cv2.pyrUp(face_up_1) cv2.imshow(up_2,face_up_2) # cv2.waitKey(0)3.2 拉普拉斯金字塔图像重建拉普拉斯金字塔基于高斯金字塔构建用于存储图像的细节信息公式为通过拉普拉斯金字塔可实现图像的精准重建。上采样后的图像尺寸可能与原图像不一致需先裁剪对齐避免维度不匹配报错。#对下采用后图像进行上采样,图像变模糊无法复原 face_down_1_up cv2.pyrUp(face_down_1)#下采样G1 face_down_2_up cv2.pyrUp(face_down_2)#下采样G2 cv2.imshow(down_1_up,face_down_1_up) cv2.imshow(down_2_up,face_down_2_up) # cv2.waitKey(0) # 5. 关键修复调整尺寸匹配裁剪/缩放避免维度不匹配报错 # 修复L0原图像face 和 face_down_1_up 尺寸对齐 target_h,target_w face.shape[:2] # 以原图像尺寸为基准 # 裁剪上采样后的图像到原图像尺寸去掉多余的行/列 face_down_1_up face_down_1_up[:target_h, :target_w] # 修复L1face_down_1 和 face_down_2_up 尺寸对齐 target_h1, target_w1 face_down_1.shape[:2] face_down_2_up face_down_2_up[:target_h1, :target_w1] #拉普拉斯金字塔 L0face-face_down_1_up L1face_down_1-face_down_2_up fuyuan face_down_1_upL0 cv2.imshow(L0,L0) cv2.imshow(L1,L1) # cv2.waitKey(0) cv2.imshow(fuyuan,fuyuan) cv2.waitKey(0)下采样后再上采样的图像会丢失细节模糊而拉普拉斯金字塔存储的细节信息可弥补这一损失实现图像的精准重建。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2418831.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!