13장. Shape 분석과 ROI 처리
원형도
피자 가게에서 도우를 펴는 장면을 떠올려 봅시다. 같은 양의 반죽이라도 둥글게 펴면 테두리가 가장 짧고, 길쭉하거나 들쭉날쭉하게 펴면 테두리가 길어집니다. 같은 넓이를 가장 짧은 둘레로 감싸는 모양이 원입니다. 그래서 "넓이에 견주어 둘레가 얼마나 짧은가"를 재면 얼마나 원에 가까운지 알 수 있습니다.
그림의 네 모양은 왼쪽부터 원형도가 1, 0.785, 0.605, 그리고 그보다 훨씬 작은 값입니다. 모서리가 많고 둥글수록 1 에 가깝고, 뾰족하고 움푹할수록 0 에 가까워집니다. 여기서 반죽의 양이 넓이, 테두리 길이가 둘레입니다.
손으로 계산하기
원형도 = 4 × π × 넓이 ÷ (둘레 × 둘레) 입니다. π 는 약 3.14 입니다. 원이면 정확히 1 이 나오도록 4π 를 곱해 맞춘 식입니다.
| 모양 | 넓이 | 둘레 | 4π × 넓이 | 둘레 × 둘레 | 원형도 |
|---|---|---|---|---|---|
| 반지름 10 인 원 | 3.14 × 10 × 10 = 314 | 2 × 3.14 × 10 = 62.8 | 12.57 × 314 = 3,947 | 62.8 × 62.8 = 3,944 | 약 1 |
| 한 변 10 인 정사각형 | 10 × 10 = 100 | 10 × 4 = 40 | 12.57 × 100 = 1,257 | 40 × 40 = 1,600 | 1,257 ÷ 1,600 ≈ 0.785 |
| 한 변 10 인 정삼각형 | 약 43.3 | 10 × 3 = 30 | 12.57 × 43.3 = 544 | 30 × 30 = 900 | 544 ÷ 900 ≈ 0.605 |
정사각형의 값은 π ÷ 4 와 같습니다. 원의 첫 줄이 1 보다 조금 넘게 나온 것은 π 를 3.14 로 반올림했기 때문입니다.
실제 그림에서 잰 값
도형 판의 도형으로 재면 손계산과 조금 다릅니다.
| 도형 | 넓이 | 둘레 | 원형도 |
|---|---|---|---|
| 팔각형 | 2,558 | 184.2 | 0.948 |
| 원 | 2,212 | 178.5 | 0.872 |
| 네모 | 2,704 | 208.0 | 0.785 |
| 기운 네모 | 2,074 | 196.9 | 0.673 |
| 세모 | 1,344 | 175.2 | 0.550 |
| 별 | 1,230 | 238.5 | 0.272 |
원이 1 이 아니라 0.872 이고, 팔각형(0.948)보다도 작게 나왔습니다. 그림 속의 원은 칸으로 된 계단 모양이라, arcLength 가 계단을 따라 재면 둘레가 실제 원보다 길어지기 때문입니다. 반면 팔각형의 변은 곧아서 둘레가 거의 정확하게 재어집니다. 기운 네모도 같은 까닭으로 0.785 보다 작습니다. 작은 물체일수록 이 계단의 몫이 커집니다.
짧은 예시
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.605math.pi 는 π 를 소수 열다섯 자리쯤까지 담은 값입니다. ** 2 는 두 번 곱하기(제곱)입니다.
주의할 점
- 원형도만으로 원과 팔각형을 가르려 하면 틀립니다. 그림 속에서는 팔각형 쪽이 더 크게 나왔습니다. 꼭짓점 수와 함께 봅니다.
- 원형도는 크기와 관계없는 비율이라, 큰 원과 작은 원이 같은 값을 냅니다. 다만 아주 작은 물체(지름 10칸 아래)는 계단 때문에 값이 많이 흔들립니다.