OpenCV 비전 실무13장 · Shape 분석과 ROI 처리5 / 21← 이전목차다음 →MetaContents

13장. Shape 분석과 ROI 처리

원형도

피자 가게에서 도우를 펴는 장면을 떠올려 봅시다. 같은 양의 반죽이라도 둥글게 펴면 테두리가 가장 짧고, 길쭉하거나 들쭉날쭉하게 펴면 테두리가 길어집니다. 같은 넓이를 가장 짧은 둘레로 감싸는 모양이 원입니다. 그래서 "넓이에 견주어 둘레가 얼마나 짧은가"를 재면 얼마나 원에 가까운지 알 수 있습니다.

원, 정사각형, 정삼각형, 별의 넓이와 둘레, 원형도를 견준 그림

그림의 네 모양은 왼쪽부터 원형도가 1, 0.785, 0.605, 그리고 그보다 훨씬 작은 값입니다. 모서리가 많고 둥글수록 1 에 가깝고, 뾰족하고 움푹할수록 0 에 가까워집니다. 여기서 반죽의 양이 넓이, 테두리 길이가 둘레입니다.

손으로 계산하기

원형도 = 4 × π × 넓이 ÷ (둘레 × 둘레) 입니다. π 는 약 3.14 입니다. 원이면 정확히 1 이 나오도록 4π 를 곱해 맞춘 식입니다.

모양넓이둘레4π × 넓이둘레 × 둘레원형도
반지름 10 인 원3.14 × 10 × 10 = 3142 × 3.14 × 10 = 62.812.57 × 314 = 3,94762.8 × 62.8 = 3,944약 1
한 변 10 인 정사각형10 × 10 = 10010 × 4 = 4012.57 × 100 = 1,25740 × 40 = 1,6001,257 ÷ 1,600 ≈ 0.785
한 변 10 인 정삼각형약 43.310 × 3 = 3012.57 × 43.3 = 54430 × 30 = 900544 ÷ 900 ≈ 0.605

정사각형의 값은 π ÷ 4 와 같습니다. 원의 첫 줄이 1 보다 조금 넘게 나온 것은 π 를 3.14 로 반올림했기 때문입니다.

실제 그림에서 잰 값

도형 판의 도형으로 재면 손계산과 조금 다릅니다.

도형넓이둘레원형도
팔각형2,558184.20.948
원2,212178.50.872
네모2,704208.00.785
기운 네모2,074196.90.673
세모1,344175.20.550
별1,230238.50.272

원이 1 이 아니라 0.872 이고, 팔각형(0.948)보다도 작게 나왔습니다. 그림 속의 원은 칸으로 된 계단 모양이라, arcLength 가 계단을 따라 재면 둘레가 실제 원보다 길어지기 때문입니다. 반면 팔각형의 변은 곧아서 둘레가 거의 정확하게 재어집니다. 기운 네모도 같은 까닭으로 0.785 보다 작습니다. 작은 물체일수록 이 계단의 몫이 커집니다.

짧은 예시

Python
import math

# 손계산과 같은 식을 코드로: 4π × 넓이 ÷ 둘레²
def circularity(area, perimeter):
    return 4 * math.pi * area / perimeter ** 2

print(round(circularity(math.pi * 10 ** 2, 2 * math.pi * 10), 3))   # 반지름 10 인 원 → 결과: 1.0
print(round(circularity(10 * 10, 40), 3))                           # 한 변 10 인 정사각형 → 결과: 0.785
print(round(circularity(43.3, 30), 3))                              # 한 변 10 인 정삼각형 → 결과: 0.605

math.pi 는 π 를 소수 열다섯 자리쯤까지 담은 값입니다. ** 2 는 두 번 곱하기(제곱)입니다.

주의할 점

  • 원형도만으로 원과 팔각형을 가르려 하면 틀립니다. 그림 속에서는 팔각형 쪽이 더 크게 나왔습니다. 꼭짓점 수와 함께 봅니다.
  • 원형도는 크기와 관계없는 비율이라, 큰 원과 작은 원이 같은 값을 냅니다. 다만 아주 작은 물체(지름 10칸 아래)는 계단 때문에 값이 많이 흔들립니다.
← 이전 절13장 · 근사 다각형다음 절 →13장 · 종횡비와 채움 비율