如何使用Python OpenCV获取电子芯片图像中所需的元件ROI
芯片小尺寸元件ROI提取修复方案
你现有代码的核心问题是形态学操作强度过高,直接抹去了小尺寸元件的轮廓,同时缺少轮廓尺寸筛选步骤,导致漏检、误检问题。
参考资料
输入原图

当前实现输出

预期输出效果

修改后可运行代码
import cv2 import os # 加载图像、灰度化、自适应阈值处理 image = cv2.imread('4.jpg') result = image.copy() gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,51,9) # 填充封闭轮廓 cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(thresh, [c], -1, (255,255,255), -1) # 调整形态学操作参数,降低强度保留小元件 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) # 提取轮廓后增加面积过滤,仅保留符合元件尺寸的区域 cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] # 可根据实际元件尺寸调整面积阈值 min_area = 50 max_area = 10000 for c in cnts: area = cv2.contourArea(c) if min_area < area < max_area: x,y,w,h = cv2.boundingRect(c) cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3) cv2.imshow('thresh', thresh) cv2.imshow('opening', opening) cv2.imshow('image', image) cv2.waitKey() cv2.destroyAllWindows()
核心修改说明
- 把原99的形态学核缩小为33,迭代次数从4次调整为1次,避免小尺寸元件的轮廓被过度腐蚀消除
- 新增轮廓面积过滤逻辑,可根据实际元件的大小调整
min_area和max_area参数,过滤掉背景噪声和过大的非元件区域 - 新增窗口销毁逻辑,避免程序运行后残留窗口进程
运行上述代码即可得到接近预期的ROI标注效果,若存在个别漏检或误检,微调面积阈值和形态学迭代次数即可适配。
内容的提问来源于stack exchange,提问作者Hasnain Khan
相关产品推荐
相关产品推荐

