如何在Python中找出不同形状/尺寸的两张图片的差异?
解决形状略有差异图片的对比问题
- 别直接靠
resize硬拉尺寸,先做图像对齐。单纯缩放只是改变像素密度,没修正两张图的位置、旋转或局部形变差异,这才是对比后差异量过大的核心原因。 - 用OpenCV的特征匹配流程实现精准对齐,步骤如下:
- 提取图像特征点(以ORB为例,无需额外依赖,也可替换为SIFT适配更复杂场景):
import cv2 import numpy as np # 读取灰度图 img1 = cv2.imread('img1.jpg', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('img2.jpg', cv2.IMREAD_GRAYSCALE) # 初始化ORB检测器,设置特征点数量 orb = cv2.ORB_create(500) kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) - 匹配并筛选优质特征对:
# 暴力匹配器,开启交叉校验提升匹配精度 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1, des2) # 按匹配距离排序,取前100个最优质的匹配对 matches = sorted(matches, key=lambda x: x.distance)[:100] - 计算单应性矩阵,完成图像对齐:
# 提取匹配点的坐标 pts1 = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2) pts2 = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2) # RANSAC算法计算单应性矩阵,过滤异常匹配点 M, mask = cv2.findHomography(pts2, pts1, cv2.RANSAC, 5.0) # 将第二张图对齐到第一张图的尺寸 h, w = img1.shape aligned_img2 = cv2.warpPerspective(img2, M, (w, h))
- 提取图像特征点(以ORB为例,无需额外依赖,也可替换为SIFT适配更复杂场景):
- 对齐后再做差异计算:
# 计算灰度图差异 diff = cv2.absdiff(img1, aligned_img2) # 二值化突出明显差异 _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY) # 统计差异像素总数 diff_pixel_count = np.sum(thresh > 0) print(f"差异像素数量: {diff_pixel_count}") - 补充提示:如果只是简单的平移、小角度旋转差异,也可以用模板匹配快速对齐,但特征匹配适配范围更广,能处理局部形状变化的场景。
内容的提问来源于stack exchange,提问作者Anand Bhandari
相关产品推荐
相关产品推荐

