You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

包装封边缺陷检测:反射区域内大缺陷漏检问题的解决方案咨询

封边缺陷检测:反射区域内大缺陷漏检问题的解决方案咨询

嘿,我看了你这段缺陷检测的代码和遇到的问题——确实,反光区域的处理一直是视觉检测里的头疼事,既要过滤掉反光导致的误判,又不能把真的大缺陷给漏掉,这个平衡不好找。我结合你的现有代码逻辑,给你几个可行的思路,你可以试试:

  • 优化反光区域与缺陷的重叠判断逻辑,区分“小缺陷被反光覆盖”和“大缺陷跨反光区域”
    你现在的overlap_with_reflection函数只要缺陷和反光区域有重叠就直接跳过,这就把跨反光的大缺陷也一并过滤了。可以改成按重叠比例来判断:如果缺陷只有小部分(比如<30%)在反光区域里,那这个缺陷大概率是真实的,要保留检测;只有当缺陷大部分(比如>70%)都埋在反光区域里,才认为是反光导致的误判,直接过滤。
    给你改个函数示例:

    def overlap_with_reflection(x, w, h, reflect_ranges):
        # 缺陷区域的真实边界
        defect_l = x
        defect_r = x + w
        defect_total_area = w * h
    
        for rl, rr in reflect_ranges:
            # 计算重叠部分的边界
            overlap_l = max(defect_l, rl)
            overlap_r = min(defect_r, rr)
            if overlap_l < overlap_r:
                # 计算重叠区域的面积
                overlap_width = overlap_r - overlap_l
                overlap_area = overlap_width * h
                # 只有当重叠占比超过阈值时,才判定为需要过滤
                if overlap_area / defect_total_area > 0.7:
                    return True
        return False
    

    这样就能把“蹭到”反光区域的大缺陷保留下来,只过滤完全被反光覆盖的小干扰。

  • 给反光区域内的候选缺陷做二次验证,用局部特征区分真假
    对于落在反光区域内的缺陷候选框,不要直接跳过,而是提取局部区域做二次校验:

    1. 从原始灰度图(或提亮后的图)里抠出候选框的局部区域
    2. 用自适应阈值(cv2.adaptiveThreshold)处理局部区域,因为反光区域亮度不均匀,局部阈值比全局阈值更能捕捉真实缺陷的边缘
    3. 再结合缺陷的形状特征(比如真实的密封线误开缺陷一般是长条状,长宽比会大于某个值)、局部缺陷面积占比来判断,如果符合真实缺陷的特征,就标记为缺陷,否则过滤。
      给你加一段代码示例,放到遍历轮廓的循环里:
    # 替换原来的if overlap_with_reflection: continue逻辑
    if overlap_with_reflection(x, w, reflect_ranges):
        # 抠出局部区域
        local_gray = roi[y:y+h, x:x+w]
        # 自适应阈值处理
        local_binary = cv2.adaptiveThreshold(local_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
        # 计算局部缺陷面积
        local_defect_area = np.sum(local_binary == 255)
        # 结合面积占比和形状特征判断
        if local_defect_area / (w*h) > 0.2 and (w/h) > 3:
            # 符合真实大缺陷特征,标记出来
            cv2.rectangle(vis, (x, y), (x + w, y + h), (0, 0, 255), 2)
        continue
    

    反光区域的干扰一般是细碎无规则的,而真实大缺陷有固定的长条形状,通过局部处理就能把它们区分开。

  • 缩小反光区域的扩张范围,避免过度误判
    你现在的代码里把反光区域向外扩了100像素,这个值可能太激进了,导致很多正常缺陷被误判为和反光重叠。可以根据你的图像实际尺寸调整,比如改成20-30像素,或者更智能一点:根据X轴投影得到的反光区域宽度,动态取宽度的1/10作为扩张值,这样就不会把无关的缺陷区域也包含进来。

  • 尝试用颜色通道分离来精准识别反光
    你现在用灰度图处理,其实可以试试转成HSV或LAB颜色空间:反光区域一般是亮度高但饱和度低的区域,在HSV的S通道里会很暗,而真实的缺陷(比如开缝)因为材质差异,饱和度会和周围有明显区别。用S通道做投影和阈值处理,能更精准地识别反光区域,减少对真实缺陷的误杀。

最后提个小建议:把那些漏检的大缺陷图像单独整理出来,统计它们的面积、长宽比、和反光区域的重叠比例这些特征,用统计数据来设置阈值,比拍脑袋设参数要靠谱得多~

火山引擎 最新活动