Подумайте о том, что каждый круг ограничен внутри квадрата габаритов 2r x 2r
где r
- радиус круга. Кроме того, центр этой коробки находится по адресу (x,y)
, который также соответствует тому, где находится центр круга на изображении. Чтобы увидеть, находится ли круг внутри границ изображения, вам просто нужно убедиться, что поле, содержащее круг, не выходит за пределы изображения. Математически говоря, вы должны обеспечить, чтобы:
r <= x <= cols-1-r
r <= y <= rows-1-r # Assuming 0-indexing
rows
и cols
являются строки и столбцы изображения. Все, что вам действительно нужно сделать, - это цикл через каждый круг в обнаруженном результате и отфильтровать те круги, которые выходят за границы изображения, проверяя, находится ли центр каждого круга в двух указанных выше неравенствах. Если круг находится в пределах двух неравенств, вы сохраните этот круг. Любые круги, которые не удовлетворяют неравенствам, вы не включаете это в конечный результат.
Чтобы поместить эту логику в код, сделать что-то вроде этого:
import cv # Load in relevant packages
import cv2
import numpy as np
img = cv2.imread(...,0) # Load in image here - Ensure 8-bit grayscale
final_circles = [] # Stores the final circles that don't go out of bounds
circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) # Your code
rows = img.shape[0] # Obtain rows and columns
cols = img.shape[1]
circles = np.round(circles[0, :]).astype("int") # Convert to integer
for (x, y, r) in circles: # For each circle we have detected...
if (r <= x <= cols-1-r) and (r <= y <= rows-1-r): # Check if circle is within boundary
final_circles.append([x, y, r]) # If it is, add this to our final list
final_circles = np.asarray(final_circles).astype("int") # Convert to numpy array for compatability
Специфическая вещь о cv2.HoughCircles
является то, что она возвращает 3D-матрицу, где первый размер одноэлементно размер. Чтобы устранить этот синглтонный размер, я сделал circles[0, :]
, что приведет к 2D-матрице. Каждая строка этой новой 2D-матрицы содержит кортеж (x, y, r)
и характеризует, где круг находится на вашем изображении, а также его радиус. Я также преобразовал центры и радиусы в целые числа, так что, если вы решите их впоследствии нарисовать, вы сможете сделать это с помощью cv2.circle
.
спасибо за это объяснение и код. – Luca