Вы можете улучшить фильтрацию нижних частот перед началом сегментации.
асть проекта, над которым я работаю, мне нужно найти центральную точку некоторых «пятен» на изображении, используя OpenCV с Python. У меня возникли некоторые проблемы, и я был бы очень признателен за любую помощь или понимание :)
Мой текущий метод заключается в том, чтобы: получить контуры изображений, наложить на них эллипсы, использовать детектор BLOB-объектов, чтобы найти центр каждого из них. Это работает довольно хорошо, но иногда у меня есть посторонние пятна, которые я должен игнорировать, и иногда пятна касаются друг друга.
Вот пример того, когда все идет хорошо:Хорошее исходное изображение: После извлечения контуров: С обнаруженными каплями:
И когда он работает плохо (вы видите, что он неправильно наложил эллипс на три капли и обнаружил тот, который мне не нужен):Неверное исходное изображение: После извлечения контуров: С обнаруженными каплями:
Это код, который я сейчас использую. Я не уверен в любом другом варианте.
def process_and_detect(img_path):
img = cv2.imread(path)
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 50, 150, 0)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
drawn_img = np.zeros(img.shape, np.uint8)
min_area = 50
min_ellipses = []
for cnt in contours:
if cv2.contourArea(cnt) >= min_area:
ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(drawn_img,ellipse,(0,255,0),-1)
plot_img(drawn_img, size=12)
# Change thresholds
params = cv2.SimpleBlobDetector_Params()
params.filterByColor = True
params.blobColor = 255
params.filterByCircularity = True
params.minCircularity = 0.75
params.filterByArea = True
params.minArea = 150
# Set up the detector
detector = cv2.SimpleBlobDetector_create(params)
# Detect blobs.
keypoints = detector.detect(drawn_img)
for k in keypoints:
x = round(k.pt[0])
y = round(k.pt[1])
line_length = 20
cv2.line(img, (x-line_length, y), (x+line_length, y), (255, 0, 0), 2)
cv2.line(img, (x, y-line_length), (x, y+line_length), (255, 0, 0), 2)
plot_img(img, size=12)
Большое спасибо за чтение этого, я искренне надеюсь, что кто-то может помочь мне или указать мне правильное направление. Спасибо!