Я пытаюсь создать программу, способную определять самый большой круг на изображении. Я использую функцию cv2.HoughCircles()
для этой цели. Но я не получаю желаемых результатов. Функция не обнаруживает круг. Я также должен извлечь извлеченный обнаруженный круг.
Исходное изображение.
Необходимые результаты.
Код, который я использую:
import cv2
import numpy as np
from matplotlib import pyplot as plt
image = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (512, 512))
cv2.imwrite("Image.png", image)
imageCopy = image.copy()
image = cv2.GaussianBlur(image, (5,5), 2)
ret, threshold_image = cv2.threshold(image, 28, 255, cv2.THRESH_BINARY_INV)
circles = cv2.HoughCircles(threshold_image, cv2.HOUGH_GRADIENT, 1, 40, param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
# Finding Biggest Circle
radius = []
for i in circles[0, :]:
radius.append(i[2])
max_radi = max(radius)
#Drawing Circles on Image
for i in circles[0, :]:
if max_radi == i[2]:
cv2.circle(imageCopy, (i[0], i[1]), (i[2]), (255, 255, 255), 5)
cv2.circle(imageCopy, (i[0], i[1]), 15, (255, 255, 255), 5)
plt.subplot(131), plt.imshow(image, cmap = 'gray')
plt.title("Original"), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(threshold_image, cmap = 'gray')
plt.title("threshold"), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(imageCopy, cmap = 'gray')
plt.title("Circles Detected"), plt.xticks([]), plt.yticks([])
plt.show()