๐ ๋ณธ ์์ ๋ Window10์ VSCode, Python3.11.0๋ก ์์ฑ๋์์ต๋๋ค.
๋ ์ด๋ธ๋ง(Labeling)
์ด์ ํฌ์คํธ์์ ์์์ ์ด์งํ๋ฅผ ํตํด ์ฃผ์ ๊ฐ์ฒด์ ๋ฐฐ๊ฒฝ์ ๊ตฌ๋ถํ ์ ์์๋ค.
์ด๋ ๊ฒ ๊ฐ์ฒด์ ๋ฐฐ๊ฒฝ์ ๊ตฌ๋ถ ํ ๋ค์ ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถํ๊ณ ๋ถ์ํ๋ ์์ ์ด ํ์ํ๋ค.
์ด ์์ ์ ์ํํ๋ ๊ฒ์ ๋ ์ด๋ธ๋ง(Labeling)์ด๋ผ๊ณ ํ๋ค.
- ์์ ๋ด์ ์กด์ฌํ๋ ๊ฐ์ฒด ํฝ์ ์งํฉ์ ๊ณ ์ ๋ฒํธ๋ฅผ ๋งค๊ธฐ๋ ์์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์ ๋ ์ด๋ธ๋ง(Connected Components Labeling)์ด๋ผ๊ณ ๋ ํ๋ค.
์ด๋ฅผ ํตํด ๊ฐ ๊ฐ์ฒด์ ์์น, ํฌ๊ธฐ ๋ฑ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ์์ ์ ๊ฐ์ฒด ์ธ์์ ์ํ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
์์์ ๋ ์ด๋ธ๋ง์ ์ผ๋ฐ์ ์ผ๋ก ์ด์งํ๋๋ ์์์์ ์ํ๋๋ค. ์ด๋ ๊ฒ์์ ํฝ์ ์ ๋ฐฐ๊ฒฝ์ผ๋ก ๊ฐ์ฃผํ๊ณ , ํฐ์ ํฝ์ ์ ๊ฐ์ฒด๋ก ๊ฐ์ฃผํ๋ค.
ํ๋์ ๊ฐ์ฒด๋ ํ ๊ฐ ์ด์์ ์ธ์ ํ ํฝ์ ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๋ชจ๋ ํฝ์ ์๋ ๊ฐ์ ๋ ์ด๋ธ ๋ฒํธ๊ฐ ์ง์ ๋๋ค.
ํน์ ํฝ์ ๊ณผ ์ด์ํ ํฝ์ ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ ์ํ ์ ์๋ค.
- 4-๋ฐฉํฅ ์ฐ๊ฒฐ์ฑ(4-way connectivity) : ํน์ ํฝ์ ์ ์ํ์ข์ฐ๋ก ๋ถ์ด ์๋ ํฝ์ ๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ์ ์
- 8-๋ฐฉํฅ ์ฐ๊ฒฐ์ฑ(8-way connectivity) : ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋ ํฝ์ ๋ฟ๋ง ์๋๋ผ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ธ์ ํ ํฝ์ ๋ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ์ ์.
๋ ์ด๋ธ๋ง ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
import cv2
import random
# ์ด๋ฏธ์ง ๋ก๋
image = cv2.imread('test.png')
if image is None:
print("์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค.")
exit()
sp = image.shape
image = cv2.resize(image,(int(sp[1]*0.5),int(sp[0]*0.5)),cv2.INTER_LANCZOS4)
# ๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# ์ด์งํ
_, thresh = cv2.threshold(gray, 162, 255, cv2.THRESH_BINARY)
cv2.imshow("thres",thresh)
# ์ฐ๊ฒฐ๋ ์ปดํฌ๋ํธ ์ฐพ๊ธฐ
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh, connectivity=8)
# ๋ฐ์ด๋ฉ ๋ฐ์ค ๊ทธ๋ฆฌ๊ธฐ
for i in range(1, num_labels): # 0์ ๋ฐฐ๊ฒฝ์ด๋ฏ๋ก 1๋ถํฐ ์์
# ๋ฐ์ด๋ฉ ๋ฐ์ค ์ ๋ณด
x = stats[i, cv2.CC_STAT_LEFT]
y = stats[i, cv2.CC_STAT_TOP]
w = stats[i, cv2.CC_STAT_WIDTH]
h = stats[i, cv2.CC_STAT_HEIGHT]
# ๋๋ค ์์ ์์ฑ
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
# ๋ฐ์ด๋ฉ ๋ฐ์ค ๊ทธ๋ฆฌ๊ธฐ
cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
# ์ค์ฌ์ ๊ณ์ฐ
cX = int(centroids[i, 0])
cY = int(centroids[i, 1])
# ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ์ถ๋ ฅ
cv2.imshow('Labeled Image with Bounding Boxes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
์ธ๊ฐ์ ๊ฒ์ถ(Contour)
๊ฐ์ฒด์ ์ธ๊ฐ์ ์ ๊ฐ์ฒด ์์ญ ํฝ์ ์ค์์ ๋ฐฐ๊ฒฝ ์์ญ๊ณผ ์ธ์ ํ ์ผ๋ จ์ ํฝ์ ์ ์๋ฏธํ๋ค.
๋ณดํต ๊ฒ์ ๋ฐฐ๊ฒฝ ๋ด ํฐ์ ๊ฐ์ฒด ์์ญ์ ๊ฐ์ฅ ์ต์ธ๊ณฝ์ ์๋ ํฝ์ ์ ์ฐพ์ ์ธ๊ฐ์ ์ผ๋ก ์ ์ํ๋ค.
๋ ํฐ์ ๊ฐ์ฒด ์์ญ ๋ด ๊ฒ์์์ผ๋ก ํ(hole)์ด ์๋ ๊ฒฝ์ฐ ํ์ ๋๋ฌ์ผ ๊ฐ์ฒด ํฝ์ ๋ค๋ ์ธ๊ฐ์ ์ด ๋ ์ ์๋ค.
import cv2
import numpy as np
import random
# ์ด๋ฏธ์ง ๋ก๋
image = cv2.imread('test.png')
sp = image.shape
image = cv2.resize(image,(int(sp[1]*0.5),int(sp[0]*0.5)),cv2.INTER_LANCZOS4)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# ์ด์งํ
_, thresh = cv2.threshold(gray, 162, 255, cv2.THRESH_BINARY)
cv2.imshow("thres",thresh)
# ์ค๊ณฝ์ ์ฐพ๊ธฐ (8-way connectivity)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# ์ค๊ณฝ์ ์ ๋ผ๋ฒจ ๋ถ์ด๊ธฐ
for i, contour in enumerate(contours):
# ์ค๊ณฝ์ ์ ์ค์ฌ์ ๊ณ์ฐ
M = cv2.moments(contour)
if M['m00'] != 0:
cX = int(M['m10'] / M['m00'])
cY = int(M['m01'] / M['m00'])
else:
cX, cY = 0, 0
# ๋๋ค ์์ ์์ฑ
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
# ์ค๊ณฝ์ ๊ทธ๋ฆฌ๊ธฐ
cv2.drawContours(image, contours, i, color, 2)
# ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ์ถ๋ ฅ
cv2.imshow('Labeled Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
๋๊ธ๋ผ์ค-ํฌ์ด์ปค(Douglas-Peucker) ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ธ๊ฐ์ ์ ๋จ์ํ ํ ์ ์๋ค.
import cv2
import random
# ์ด๋ฏธ์ง ๋ก๋
image = cv2.imread('test.png')
if image is None:
print("์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค.")
exit()
sp = image.shape
image = cv2.resize(image,(int(sp[1]*0.5),int(sp[0]*0.5)),cv2.INTER_LANCZOS4)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.Canny(gray,50,200)
cv2.imshow("thres",thresh)
# ์ธ๊ณฝ์ ์ฐพ๊ธฐ
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# ์ธ๊ณฝ์ ๊ทผ์ฌํ
for contour in contours:
# ํ์ฉ ์ค์ฐจ ์ค์
epsilon = 0.02 * cv2.arcLength(contour, True) # ์ฃผ๋ณ ๊ธธ์ด์ ๋น๋ก
approx = cv2.approxPolyDP(contour, epsilon, True)
# ๋๋ค ์์ ์์ฑ
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
# ๊ทผ์ฌํ๋ ์ธ๊ณฝ์ ๊ทธ๋ฆฌ๊ธฐ
cv2.drawContours(image, [approx], -1, color, 2)
# ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ์ถ๋ ฅ
cv2.imshow('Approximated Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
์ธ๊ฐ์ ์ ์ผ์ ๋น์จ๋ก ๊ทผ์ฌํํ๋ค.
'AI > Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Computer Vision] ์ง์ญ ํน์ง์ ๊ฒ์ถ๊ณผ ๋งค์นญ (0) | 2024.09.07 |
---|---|
[Computer Vision] ๊ฐ์ฒด ๊ฒ์ถ๊ณผ ์์ฉ (0) | 2024.09.06 |
[Computer Vision] ์์์ ์ด์งํ์ ๋ชจํด๋ก์ง (0) | 2024.09.03 |
[Computer Vision] ์ปฌ๋ฌ ์์ ์ฒ๋ฆฌ (0) | 2024.09.02 |
[Computer Vision] ์์ง(Edge) ๊ฒ์ถ (0) | 2024.09.02 |