2014-10-29 1 views
3

외부 감지 원은 파이썬에서 OpenCV의 HoughCircles 방법을 사용하고 있습니다 :OpenCV의 파이썬 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 

rowscols은 이미지의 행과 열을합니다. 이제 실제로해야 할 일은 감지 된 결과의 모든 원을 순환하고 각 원의 중심이 위에 지정된 두 가지 부등식 내에 있는지 확인하여 이미지 경계 바깥으로 나가는 원을 필터링하는 것입니다. 원이 두 개의 부등식 내에 있으면이 원을 저장합니다. 불평등을 만족시키지 못하는 서클은 최종 결과에 포함시키지 않습니다.

는, 코드에이 논리를 넣어 같은 것을 수행합니다

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

원의 반지름과 중심을 취하는 함수를 추가하여 /를 빼고 이미지의 경계를 벗어나는 지 확인하십시오.