[OpenCV] 얼룩 감지

5069 단어 pythonTILopencvTIL

Blob이란

몇 가지 공통 속성(회색조 값)을 공유하는 이미지의 연결된 픽셀 그룹이다. 위 이미지에서 어둡게 연결된 영역은 얼룩이며 얼룩 감지의 목표는 이러한 영역을 식별하고 표시하는 것이다.

얼룩 감지 동작 순서

SimpleBlobDetector는 이름에서 알 수 있듯이 아래에 설명된 다소 간단한 알고리즘을 기반으로 한다. 알고리즘은 매개변수에 의해 제어되며 다음 단계가 있다.

  1. Thresholding : minThreshold에서 시작하는 임계값으로 소스 이미지를 임계값 처리하여 소스 이미지를 여러 이진 이미지로 변환한다. 이러한 임계값은 thresholdStep에 의해 maxThreshold까지 증가합니다. 첫 번째 임계값은 minThreshold, 두 번째 임계값은 minThreshold + thresholdStep, 세 번째 임계값은 minThreshold + 2 x 임계값이 된다.

  2. Grouping : 각각의 이진 이미지에서 연결된 흰색 픽셀이 함께 그룹화된다. 이를 이진 blob이라고 한다.

  3. Merging : 이진 이미지에서 이진 블럽의 중심이 계산되고 minDistBetweenBlobs보다 가까운 위치에 있는 블럽이 병합된다.

  4. Center & Radius Calculation : 새로 병합된 블럽의 중심과 반지름이 계산되어 반환된다.

색상, 크기 및 모양별로 얼룩 필터링

SimpleBlobDetector의 매개변수를 설정하여 원하는 Blob 유형을 필터링할 수 있다.

순환성

얼룩이 원에 얼마나 가까운지를 측정한다. 예를 들어 정육각형은 정사각형보다 원형이 더 높다. 원형으로 필터링하려면 filterByCircularity = 1로 설정한다. 그런 다음 minCircularity 및 maxCircularity에 적절한 값을 설정한다. 원형도는 다음과 같이 정의된다.

즉, 원의 원형도는 1이고 정사각형의 원형도는 0.785 이다.

볼록성

볼록성은 (블롭의 면적 / 볼록한 껍질의 면적)으로 정의된다. 이제, 형상의 볼록한 껍질은 형체를 완전히 감싸는 가장 촘촘한 볼록한 형태이다. 볼록성으로 필터링하려면 FilterByVolxity = 1을 설정한 다음 0 ≤ minVolxity ≤ 1maxVolxity ≤ 1를 설정한다.

관성비

모양이 얼마나 길쭉한지를 측정한다는 것이다. 예를 들어 원의 경우 이 값은 1이고 타원의 경우 0과 1 사이이며 선의 경우 0이다. 관성 비율로 필터링하려면 filterByInertia = 1 로 설정하고 0 ≤ minInertiaRatio ≤ 1maxInertiaRatio ≤ 1 로 설정한다.

매개변수 설정

params = cv2.SimpleBlobDetector_Params()

# Change thresholds
params.minThreshold = 10;
params.maxThreshold = 200;

# Filter by Area.
params.filterByArea = True
params.minArea = 1500

# Filter by Circularity
params.filterByCircularity = True
params.minCircularity = 0.1

# Filter by Convexity
params.filterByConvexity = True
params.minConvexity = 0.87

# Filter by Inertia
params.filterByInertia = True
params.minInertiaRatio = 0.01

# Create a detector with the parameters
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
	detector = cv2.SimpleBlobDetector(params)
else : 
	detector = cv2.SimpleBlobDetector_create(params)

좋은 웹페이지 즐겨찾기