2014-10-29 2 views
3

Я использую метод OpenCV HoughCircles в Python следующим образом:OpenCV Python HoughCircles: Круги, обнаруженные за пределами границы изображения

circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,20, 
param1=50,param2=30,minRadius=0,maxRadius=0) 

Это, кажется, работает достаточно хорошо. Однако я заметил, что он обнаруживает круги, которые могут простираться за пределы границ изображения. Кто-нибудь знает, как я могу отфильтровать эти результаты?

ответ

4

Подумайте о том, что каждый круг ограничен внутри квадрата габаритов 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.

+1

спасибо за это объяснение и код. – Luca

0

Вы можете добавить функцию, которая займет центр и радиус круга, добавить их вверх/и вычесть и проверить, приведет ли это за пределы вашего изображения.

Смежные вопросы