Учитывая показанный пример изображения, я очень скептически относился к следующему утверждению:
, на котором я уже использовал морфологические операции открытия / закрытия (это настолько чисто, насколько я могу это понять,поверьте мне в этом)
И, прочитав ваш комментарий,
Для точности мне нужно, чтобы он соответствовал с точностью около 2 пикселей
Я был почти уверен, что может быть хорошее приближение с использованием морфологических операций.
Пожалуйста, взгляните на следующий код:
import cv2
# Load image (as BGR for later drawing the circle)
image = cv2.imread('images/hvFJF.jpg', cv2.IMREAD_COLOR)
# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Get rid of possible JPG artifacts (when do people learn to use PNG?...)
_, gray = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
# Downsize image (by factor 4) to speed up morphological operations
gray = cv2.resize(gray, dsize=(0, 0), fx=0.25, fy=0.25)
# Morphological Closing: Get rid of the hole
gray = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)))
# Morphological opening: Get rid of the stuff at the top of the circle
gray = cv2.morphologyEx(gray, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (121, 121)))
# Resize image to original size
gray = cv2.resize(gray, dsize=(image.shape[1], image.shape[0]))
# Find contours (only most external)
cnts, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# Draw found contour(s) in input image
image = cv2.drawContours(image, cnts, -1, (0, 0, 255), 2)
cv2.imwrite('images/intermediate.png', gray)
cv2.imwrite('images/result.png', image)
Промежуточное изображение выглядит так:
И, конечный результат выглядит так:
СЯ думаю, что ваш имидж довольно велик, если его уменьшить, то это не повредит.Ускорены следующие морфологические операции, которые могут представлять интерес для вашей обстановки.
Согласно вашему заявлению:
ПРИМЕЧАНИЕ: У меня нет предварительной информации о размере круга [...]
В большинстве случаев вы можете найти подходящее приближение для указанных выше размеров ядра по вашим данным.Поскольку приведен только один пример изображения, мы не можем знать изменчивость по этому вопросу.
Надеюсь, это поможет!