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()
代码说明
- 图片读取检查:添加判断避免因路径错误导致后续代码崩溃。
medianBlur参数修正:移除多余的第三个参数,只保留核大小3。- 数据类型转换:将
defects转为uint8,符合OpenCV图像格式要求。 - 通道匹配:把单通道差异掩码转为3通道,确保和彩色原图像做
np.where时维度一致。 - 规范
imshow调用:每个imshow都传入窗口名称和图像矩阵,符合函数要求。
内容的提问来源于stack exchange,提问作者Eugenija Antonovaitė
相关产品推荐
相关产品推荐

