각 원의 치수가 정사각형 인 것으로 생각하십시오. 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