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

Python实现PCB图片差异对比代码报错求助

PCB图片差异对比代码报错修复与功能实现

报错直接原因

cv2.imshow()函数要求必须传入两个参数:第一个是窗口名称(字符串类型),第二个是要显示的图像矩阵。原代码中多次调用cv2.imshow时只传了图像矩阵,导致参数缺失触发报错。

其他隐藏问题及修复点

除了参数错误,代码还有几个影响功能的问题:

  • cv2.medianBlur()参数冗余:该函数仅需传入图像和核大小(奇数),原代码多传了一个无效参数。
  • 图像数据类型不匹配:np.where生成的defects是int型数组,OpenCV显示图像需要uint8类型,需转换。
  • 通道维度不兼容:defects是单通道灰度图,直接和3通道彩色图做np.where会报错,需将其转为3通道。
  • 重复计算冗余:原代码重复计算差异掩码,可直接复用已定义的defects变量。

修正后的完整代码

import cv2
import numpy as np

# 读取参考图和待检测图
ref = cv2.imread('Reference/Reference.jpg')
img = cv2.imread('WithDefects/WithDefects.jpg')

# 检查图片是否成功读取
if ref is None or img is None:
    print("Error: 无法读取图片,请检查文件路径是否正确")
    exit()

# 转为灰度图
ref_gray = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 计算灰度差异并模糊降噪
diff = np.abs(ref_gray - img_gray)
diff_blur = cv2.medianBlur(diff, 3)  # 修复medianBlur参数

# 生成差异掩码,转换为uint8类型
defects = np.where(diff_blur > 50, 255, 0).astype(np.uint8)

# 把单通道掩码转为3通道,和原图像维度匹配
defects_3ch = cv2.cvtColor(defects, cv2.COLOR_GRAY2BGR)

# 在原图像上用红色标记差异区域
img_with_defects = np.where(defects_3ch == 255, (0, 0, 255), img)

# 显示所有窗口(添加窗口名称参数)
cv2.imshow('参考图', ref)
cv2.imshow('待检测图', img)
cv2.imshow('灰度差异图', diff_blur)
cv2.imshow('差异掩码', defects)
cv2.imshow('标记差异后的图像', img_with_defects)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码说明

  1. 图片读取检查:添加判断避免因路径错误导致后续代码崩溃。
  2. medianBlur参数修正:移除多余的第三个参数,只保留核大小3。
  3. 数据类型转换:将defects转为uint8,符合OpenCV图像格式要求。
  4. 通道匹配:把单通道差异掩码转为3通道,确保和彩色原图像做np.where时维度一致。
  5. 规范imshow调用:每个imshow都传入窗口名称和图像矩阵,符合函数要求。

内容的提问来源于stack exchange,提问作者Eugenija Antonovaitė

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:50:21