2017-02-14 4 views
1

Я пытаюсь сегментировать пакет QFN на рентгеновском изображении печатной платы. Общее описание пакета QNF состоит в том, что он квадратный или прямоугольный в центре с прямоугольными штифтами на краю. Пример на этом изображении: QFN packageСегментация геометрических фигур

Я могу сегментировать прямоугольники на рентгеновском изображении довольно хорошо, но я не знаю, как записать условие для сегментации только пакета QFN. Пакет может быть квадратным или прямоугольным и может иметь разное количество контактов на краю. Моя идея - проверить близкую окрестность каждого прямоугольника фильтра прямоугольников, которые слишком велики и как-то проверить, все ли вокруг них все прямоугольники. Есть ли лучший подход? Или как бы вы проверили, окружен ли большой прямоугольник маленькими? Real image

Я использую Python 3.5 и OpenCV 3,1

ответ

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"