Morphological Operations (๋ชจํด๋ก์ง ์ฐ์ฐ)
๋ชจํด๋ก์ง ์ฐ์ฐ์ ์ด๋ฏธ์ง ๋ด ๊ฐ์ฒด์ ํํ, ํฌ๊ธฐ, ๊ตฌ์กฐ ๋ฑ์ ๋ถ์ํ๊ฑฐ๋ ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ด๋ค. ์ฃผ๋ก ๋ฐ์ด๋๋ฆฌ ์ด๋ฏธ์ง(ํ๋ฐฑ ์ด๋ฏธ์ง)์์ ์ฌ์ฉ๋๋ฉฐ, ๊ฐ์ฒด์ ํํ๋ฅผ ๋ถ์ํ์ฌ ์ด๋ฏธ์ง ๋ด์ ๊ตฌ๋ฉ์ ์ฑ์ฐ๊ฑฐ๋, ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ฑฐ๋, ๊ฐ์ฒด ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์กฐ์ ํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์๋ค.
์ด๋ฌํ ๋ชจํด๋ก์ง ์ฐ์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ์กฐ ์์(structuring element)๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋๋๋ฐ ๊ตฌ์กฐ ์์๋ ์ด๋ฏธ์ง ๋ด์์ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฒฐ์ ํ๋ ๊ธฐ์ค์ด ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ์กฐ ์์๋ ์ฌ๊ฐํ, ์, ์ญ์๊ฐ ๋ฑ์ ํํ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ชจ์๊ณผ ํฌ๊ธฐ๋ ์์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ ํ๋๋ค.
๋ชจํด๋ก์ง ์ฐ์ฐ์๋ ๋ค์ํ ์ข ๋ฅ๊ฐ ์์ง๋ง, ๋ํ์ ์ผ๋ก ํฝ์ฐฝ(dilation), ์นจ์(erosion), ์ด๊ธฐ(opening), ๋ซ๊ธฐ(closing) ๋ฑ์ด ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ํ์ฅ์ํค๋ dilation ์ฐ์ฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ถ์์ํค๋ erosion ์ฐ์ฐ์ ์ฌ๋ฌ ์กฐํฉ์ ํตํด ๋ค์ํ ์ฐ์ฐ์ ์ํํ๋ค.
OpenCV ๋ชจํด๋ก์ง ์ฐ์ฐ
OpenCV์์๋ ํฝ์ฐฝ(dilation), ์นจ์(erosion), ์ด๊ธฐ(opening), ๋ซ๊ธฐ(closing), ๊ทธ๋ผ๋์ธํธ(gradient) ๋ฑ์ ๋ค์ํ ๋ชจํด๋ก์ง ์ฐ์ฐ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
- ํฝ์ฐฝ(dilation)
- kernel์ ์ด๋ฏธ์ง ์์ ๋ชจ๋ ํฝ์ ์ ์ ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ํ์ฅ
- ๊ฐ์ฒด ๋ด๋ถ์ ์์ ๊ตฌ๋ฉ์ ์ฑ์ฐ๋ ๋ฐ์ ์ ์ฉ
- ์์) ํ๊ด ์ด๋ฏธ์ง์์ ํ๊ด ๋ด๋ถ๋ฅผ ์ฑ์ฐ๋ ๋ฐ ์ฌ์ฉ
- ์นจ์ (erosion)
- kernel์ ์ด๋ฏธ์ง ์์ ๋ชจ๋ ํฝ์ ์ ์ ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ถ์
- ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋ ๊ฒฝ๊ณ๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ง๋๋ ๋ฐ์ ์ ์ฉ
- ์์) ๊ธธ์ญํ ๊ฐ์ฒด์ ๋ ๋ถ๋ถ์ ๋ถ๋๋ฝ๊ฒ ๋ง๋๋ ๋ฐ ์ฌ์ฉ
- ์ด๊ธฐ (opening)
- erosion ์ฐ์ฐ์ ์ํํ ํ์ dilation ์ฐ์ฐ์ ์ํ
- ์ด๋ ๊ฐ์ฒด ๋ด๋ถ์ ์์ ๊ตฌ๋ฉ์ ์ฑ์ฐ๋ ๋ฐ์ ์ ์ฉ
- ์์) ๋ฐ๋ฅ์ ๋ฌผ์ฒด๊ฐ ์๋ ์ด๋ฏธ์ง์์ ๋ฌผ์ฒด์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์์ ๊ตฌ๋ฉ์ ์ฑ์ฐ๋ ๋ฐ ์ฌ์ฉ
- ๋ซ๊ธฐ (closing)
- dilation ์ฐ์ฐ์ ์ํํ ํ์ erosion ์ฐ์ฐ์ ์ํ
- ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๊ฑฐ๋ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๋ฐ์ ์ ์ฉ
- ์์) ์ฌ๋ฌ ๊ฐ์ ๋ฌผ์ฒด๊ฐ ๋ถ์ด์๋ ์ด๋ฏธ์ง์์ ๋ฌผ์ฒด๋ฅผ ์ฐ๊ฒฐํ๊ณ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๋ฐ ์ฌ์ฉ
- ๊ทธ๋ผ๋์ธํธ (gradient)
- dilation ์ฐ์ฐ ๊ฒฐ๊ณผ์ ์นจ์ ์ฐ์ฐ ๊ฒฐ๊ณผ์ ์ฐจ์ด๋ฅผ ๊ตฌํด์ ๊ฐ์ฒด์ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์กฐ
- ํํ (top hat)
- opening ์ฐ์ฐ ๊ฒฐ๊ณผ์ ์๋ณธ ์ด๋ฏธ์ง์ ์ฐจ์ด๋ฅผ ๊ตฌํด์ ๊ฐ์ฒด์ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์กฐ
- ๋ธ๋ํ (black hat)
- closing ์ฐ์ฐ ๊ฒฐ๊ณผ์ ์๋ณธ ์ด๋ฏธ์ง์ ์ฐจ์ด๋ฅผ ๊ตฌํด์ ๊ฐ์ฒด์ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์กฐ
๋ชจํด๋ก์ง ์ฐ์ฐ ์์
- dilation & erosion : iteration ์ผ๋ก ํฝ์ฐฝ/์นจ์ ์ ์ ๋ ์กฐ์
- opening & closing & gradient : kernel ์ฌ์ด์ฆ๋ก ์กฐ์
import cv2
image = cv2.imread('sampl.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
eroded = cv2.erode(gray_image, None, iterations = 1)
dilated = cv2.dilate(gray_image, None, iterations = 1)
kernel_size = (3, 3)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
opening = cv2.morphologyEx(gray_image, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(gray_image, cv2.MORPH_CLOSE, kernel)
gradient = cv2.morphologyEx(gray_image, cv2.MORPH_GRADIENT, kernel)โ
ํฝ์ฐฝ(dilation) & ์นจ์(erosion)
์ด๊ธฐ(opening) & ๋ซ๊ธฐ(closing)
๊ทธ๋ผ๋์ธํธ (gradient)
์ด๋ฏธ์ง ์ถ์ฒ : https://pyimagesearch.com/2021/04/28/opencv-morphological-operations/
๋ค์ํ ์์
- ์ด๋ฏธ์ง์์ ๋ ธ์ด์ฆ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ํ ์คํธ๋ฅผ ์ ๋ช ํ๊ฒ ์ ์ฒ๋ฆฌํ๋ ๋ฑ์ ์์ ์ ์ฌ์ฉ
- ์๋ฃ ์์์์ ํ๊ด ๋ถ๋ฆฌ, ์ข ์ ๊ฒ์ถ, ๋ผ ๊ตฌ๋ถ ๋ฑ์๋ ์ฌ์ฉ