几何形状的分割

时间:2017-02-14 15:22:31

标签: opencv rectangles image-segmentation

我正在尝试在PCB的X射线图像上分割QFN封装。 QNF封装的一般描述是它的中心是正方形或矩形,边缘有矩形引脚。示例位于此图片上:QFN package

我可以很好地分割X射线图像上的矩形,但我不知道如何编写条件来仅分割QFN包。封装可以是方形或矩形,边缘上可以有不同数量的引脚。我的想法是检查每个矩形的近邻过滤掉过大的矩形,并以某种方式检查剩下的矩形是否全部都在。有更好的方法吗?或者你如何检查大矩形是否被小的矩形包围? Real image

我正在使用python 3.5和OpenCV 3.1

1 个答案:

答案 0 :(得分:0)

这将会有点长,我会给你一些基本的技术和指南,以及一些提高QNF包检测准确性的高级建议。

假设您已将红色标记的轮廓存储在变量contours中。

首先定义要过滤的轮廓区域的上限和下限。根据给定的图像,中心区域的区域范围是:

CHIP_CENTER_AREA_LOWER, CHIP_CENTER_AREA_UPPER = 20*1000, 25*1000

因此,我们迭代所有轮廓并过滤具有上述范围的面积的轮廓,它将消除较小的轮廓,并且我们将仅检查较大的轮廓。

probable_chip_center_contour_idx = []
for i in xrange(len(contours)):
    cnt = contours[i]
    area = cv2.contourArea(cnt)
    if CHIP_CENTER_AREA_LOWER < area < CHIP_CENTER_AREA_UPPER:
        probable_chip_center_contour_idx.append(i)

现在在根据区域过滤掉可能的轮廓后,我们将检查相邻轮廓(针脚)的数量。那些预期在给定半径内预期相邻轮廓数量的中心轮廓将是最终结果。

radius = 80
EXPECTED_NEIGHBOURING_PINS = 28
for i in probable_chip_center_contour_idx:
    cnt = contours[i]
    cnt_bounding_rect = cv2.boundingRect(cnt)
    extended_cnt_bounding_rect = [cnt_bounding_rect[0] - radius, cnt_bounding_rect[1] - radius,
                                  cnt_bounding_rect[2] + 2*radius, cnt_bounding_rect[3] + 2*radius]
    neighbouring_contours = 0
    for probable_neighbouring_contour in contours:
        probable_bounding_rect = cv2.boundingRect(probable_neighbouring_contour)
        if is_rect_inside(probable_bounding_rect, extended_cnt_bounding_rect):
            neighbouring_contours += 1
    if neighbouring_contours > EXPECTED_NEIGHBOURING_PINS:
        print "QFN Found"