You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中找出不同形状/尺寸的两张图片的差异?

解决形状略有差异图片的对比问题
  • 别直接靠resize硬拉尺寸,先做图像对齐。单纯缩放只是改变像素密度,没修正两张图的位置、旋转或局部形变差异,这才是对比后差异量过大的核心原因。
  • 用OpenCV的特征匹配流程实现精准对齐,步骤如下:
    1. 提取图像特征点(以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)
      
    2. 匹配并筛选优质特征对:
      # 暴力匹配器,开启交叉校验提升匹配精度
      bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
      matches = bf.match(des1, des2)
      # 按匹配距离排序,取前100个最优质的匹配对
      matches = sorted(matches, key=lambda x: x.distance)[:100]
      
    3. 计算单应性矩阵,完成图像对齐:
      # 提取匹配点的坐标
      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))
      
  • 对齐后再做差异计算:
    # 计算灰度图差异
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:30:46