Почему OpenCV SimpleBlobDetector не обнаруживает все большие двоичные объекты?

#python #opencv #computer-vision #object-detection #image-segmentation

#python #opencv #компьютерное зрение #обнаружение объекта #сегментация изображений

Вопрос:

Я пытался все изменить, и, похоже, ничего не работает. Даже если это не сработает для второго изображения, я бы ожидал, что оно сработает для первого. Есть идеи о том, почему это не работает?

двоичное изображение 1

двоичное изображение 2

обнаружены большие двоичные объекты для изображения 1

обнаружены большие двоичные объекты для изображения 2

Код

 import numpy as np
import cv2

binary = binary_images[0]
k_max_area=0.07; k_min_area=0.003
min_area = np.shape(img)[0]*np.shape(binary)[1]*k_min_area
max_area = np.shape(img)[0]*np.shape(binary)[1]*k_max_area

params = cv2.SimpleBlobDetector_Params()
params.minThreshold=0
params.maxThreshold=230

params.filterByArea = True
params.minArea=min_area
params.maxArea=max_area

params.filterByCircularity = False
params.filterByInertia = False
params.filterByConvexity = False
params.filterByColor=True
params.blobColor=255

ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
    detector = cv2.SimpleBlobDetector(params)
else : 
    detector = cv2.SimpleBlobDetector_create(params)

detector.empty()
keypoints = detector.detect(binary)
im_with_keypoints = cv2.drawKeypoints(binary, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(im_with_keypoints)

  

Комментарии:

1. Ваши двоичные объекты не изолированы. Многие касаются друг друга и поэтому будут считаться одним регионом. В других двоичных объектах есть пробелы. Смотрите docs.opencv.org/4.1.1/d0/d7a/classcv_1_1SimpleBlobDetector.html

2. @fmw42 Есть ли какой-либо другой способ обнаружить фигуры типа «8» в виде 2 кругов, или я должен сначала их разделить? Я хотел бы иметь возможность указывать параметры больших двоичных объектов (или кругов) и получать большие двоичные объекты (или круги) таким образом, чтобы было заключено максимальное количество белого и минимальное количество черной области.

3. Вы могли бы попробовать преобразование Хафа или водораздел.

Ответ №1:

Это происходит потому, что ваши двоичные объекты подключены. Перед обнаружением больших двоичных объектов выполните операцию открытия (размывание с последующим расширением).

 import numpy as np
kernel = np.ones((5,5),np.uint8)
binary = cv2.erode(binary,kernel,iterations = 1)