Как сделать более точным поиск центра окружности в изображении и как найти радиус найденных контуров?

задача была в поиске центра в изображении, на котором изображены окружности с разным шумом. На данный момент я пытаюсь использовать OpenCV для поиска контуров и от максимумов/минимумов найти центр, где данный метод может найти более или менее точные координаты центра окружностей, но на некоторых изображениях из-за большого количества шумов не находит центр. Также хотелось бы найти координаты окружности с шагом примерно 10-15 градусов либо координатам центра окружности задать значения (0, 0) и после найти значения окружности, например, если окружность радиусом 3, то координаты (0, 3); (1, 1.73) и т.д. Как можно это реализовать и возможно ли на python OpenCV? Отрывок кода:

import numpy as np
import cv2

im = cv2.imread('Laser6238.png')
height, width, depth = im.shape
#print(height, width, depth)
thresh = 25
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(imgray,(5,5),0)
edges = cv2.Canny(blur,thresh,thresh*2)
contours, hierarchy = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#cnt = contours[200]

cnt = max(contours, key=cv2.contourArea)

#cnt = contours(10)
print(contours)
print(cnt)
"""
contours = np.arange(200).reshape((4,5,10))

cnt = np.arange(200).reshape((4,5,10))
"""
cv2.drawContours(im,contours,-2,(0,255,0),1)

"""
np.savetxt('test2.txt', contours)
np.savetxt('test3.txt', cnt)
cv2.drawContours(im,contours,-2,(0,255,0),1)
"""
#centroid_x = M10/M00 and centroid_y = M01/M00
M = cv2.moments(cnt)
x = int(M['m10']/M['m00'])
y = int(M['m01']/M['m00'])
print("Coordinate center (x,y):", int(x),int(y))
"""
np.savetxt('test1.txt', imgray, fmt='%d')
#print(width/2.0,height/2.0)
#print(width/2-x,height/2-y)
#R = math.sqrt((x[i] - x)**2 + (y[i] - y)**2)
#print(R)
"""
"""
((x, y), radius) = cv2.minEnclosingCircle(cnt)
print(radius)
cv2.putText(im,"radius", (int(x)+int(radius/15),int(y)+int(radius/15)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255))
mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#print(pixelpoints)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)
#print(min_val, max_val, min_loc, max_loc)
"""
cv2.circle(im, (int(x), int(y)), 0, (0, 0, 255), 5)
cv2.putText(im,"center", (int(x),int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255))
#cv2.circle(im,(int(width/2),int(height/2)),0,(255,0,0),10)
#cv2.putText(im,"center of image", (int(width/2),int(height/2)), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0))
cv2.imshow('contour',im)
cv2.waitKey(0)

Ответы (0 шт):