Я пытаюсь создать надежное обнаружение монет на изображениях, используя HoughCircle со следующими параметрами:
blured_roi = cv2.GaussianBlur(region_of_interest, (23, 23), cv2.BORDER_DEFAULT)
rows = blured_roi.shape[0]
circles = cv2.HoughCircles(blured_roi, cv2.HOUGH_GRADIENT, 0.9, rows/8,
param1=30, param2=50, minRadius=30, maxRadius=90)
Область интереса может быть (300x300) или (1080x1920). Так что minRadius
и maxRadius
здесь не особо помогают. Но они примерно размером с мою монету в каждом типе формы изображения.
Итак, чтобы добиться этого, я пробовал много вещей. Прежде всего, используя простое серое изображение с фильтром GaussianBlur
.
Это работает в большинстве случаев, но если границы моей монеты имеют такой же оттенок, что и фон, изображение в шкале СЕРЫЙ не поможет определить правильный радиус моего круга, взгляните на этот пример:
Во второй раз я попытался использовать края монеты для обнаружения кругов с помощью Canny Transform , но, как вы можете видеть выше, фильтр Canny не работает, как я надеялся. Поэтому я применил GaussianBlur
из (13, 13).
Я также знаю, что внутри метода HoughCircle
есть еще один сложный вызов преобразования, но я хотел быть уверен, что получу края монеты, потому что я теряю их, размывая с помощью GaussianBlur
.
Наконец, я попытался использовать обмолоченное изображение, но я не могу понять, почему оно не работает так же хорошо, как исключение, потому что на этом изображении мы можем надеяться, что никогда не будет никаких шумов, потому что это только черно-белое (?), И круг почти идеален. И применил GaussianBlur
из (9, 9).
Здесь вы можете увидеть, что не удалось обнаружить монету на обмолоченном изображении, но он работает с изображением хитрых краев. Но во многих других случаях Hough Transform при обнаружении краев дает неидеальный результат, и я чувствую себя уверенно относительно обмолоченного изображения, которое, как вы можете видеть, показывает хороший круг.
Я хотел бы понять, почему он не работает на молотом изображении (как в примере выше), и что я мог сделать, чтобы это работало.
EDIT 1: Итак, я обнаружил другой тип BORDER для указания в методе GaussianBlur
. Я подумал, что было бы действительно полезно улучшить обнаружение крутых кругов на изображении Молот, но это не так хорошо, как исключение.