- Image Moment는 대상을 구분할 수 있는 특징을 의미합니다.. 특징으로는 Area, Perimeter, 중심점 등이 있습니다. Image Moments는 대상을 구분한 후, 다른 대상과 구분하기 위해 대상을 설명(describe)하는 자료로 사용됩니다.
- Contour면적은 moments의
m00
값이거나cv2.contourArea()
함수로 구할 수 있다.
Contour Perimeter
Contour의 둘레 길이를 구할 수 있습니다. 사각형의 경우는 둘레길이의 합이 됩니다. 아래 함수의 2번째 argument가 true이면 폐곡선 도형을 만들어 둘레길이를 구하고, False이면 시작점과 끝점을 연결하지 않고 둘레 길이를 구합니다.
>>> cv2.arcLength(cnt, True)
750.0
>>> cv2.arcLength(cnt, False)
494.0
Contour Approximation
cv2.findContours()
함수에 의해서 찾은 contours line은 각각의 contours point를 가지고 있습니다. 이 Point를 연결하여 Line을 그리게 됩니다. 이때 이 point의 수를 줄여 근사한 line을 그릴 때 사용되는 방법입니다.
Point의 수를 줄이는데 사용되는 방식은 Douglas-Peucker algorithm 입니다.
근사치를 찾는데 사용되는 함수는 cv2.approxPolyDP()
입니다.
cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])
- curve – contours point array
- epsilon – original cuve와 근사치의 최대거리. 최대거리가 클 수록 더 먼 곳의 Point까지 고려하기 때문에 Point수가 줄어듬.
- closed – 폐곡선 여부
Convex Hull
Convex Hull이란 contours point를 모두 포함하는 볼록한 외관선을 의미합니다. Contour Approximation과 유사한 결과지만, 방법은 전혀 다릅니다.
cv2.convexHull(array)
Checking Convexity
cv2.isContourConvex()
함수는 contour가 convex인지 아닌지 판단하여 True 또는 False를 Return합니다. 여기서 convex란 contour line이 볼록하거나 최소한 평평한 것을 의미합니다.(오목한 부분이 없는 것입니다.)
위 예제에는 2개의 contour가 있는데, 첫번째는 이미지의 전체 외곽선(사각형)이고 두번째는 손 모양의 contour line입니다. 그래서 결과는 아래와 같습니다.
>>> cv2.isContourConvex(contours[0]) # 외곽선 contour line
True
>>> cv2.isContourConvex(contours[1]) # 손 모양 contour line
False
Bounding Rectangle
Contours Line을 둘러싸는 사각형을 그리는 방법입니다. 사각형을 그리는 방법은 2가지가 있습니다.
- Straight Bounding Rectangle : 대상의 Rotation은 무시한 사각형 모양입니다.
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
- Rotated Rectangle : 대상을 모두 포함하면서, 최소한의 영역을 차지하는 사각형 모양입니다.
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
im = cv2.drawContours(im,[box],0,(0,0,255),2)
Minumum Enclosing Circle
Contours line을 완전히 포함하는 원 중 가장 작은 원을 그릴 수 있습니다.
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)
Fitting an Ellipse
Contours Line을 둘러싸는 타원을 그릴 수 있습니다.
ellipse = cv2.fitEllipse(cnt)
im = cv2.ellipse(im,ellipse,(0,255,0),2)
'Python > Image vision' 카테고리의 다른 글
OCR 이미지 문자열 추출 (Tesseract) (0) | 2020.01.20 |
---|---|
Morphological Transformations (0) | 2020.01.20 |
Image Contours (0) | 2020.01.20 |
Image Smoothing (0) | 2020.01.20 |
이미지 임계처리 (Thresholding) (0) | 2020.01.20 |