-
์์ง ๊ฒ์ถ(1) - 1์ฐจ·2์ฐจ ๋ฏธ๋ถ, Prewitt, SobelAI\ML\DL/Computer Vision 2023. 8. 6. 21:32๋ฐ์ํ
โฃ
์์ง ๊ฒ์ถ(edge detection)์ ์ปดํจํฐ ๋น์ ์ด ์ด์ฐฝ๊ธฐ๋ถํฐ ์ค์ํ๊ฒ ๋ค๋ฃจ์ด์จ ์ฐ๊ตฌ ์ฃผ์ ๋ค.
์์ง๋ ๋ฌผ์ฒด ๊ฒฝ๊ณ์ ์๋ ์ ์ด๋ค. ์์ง๋ฅผ ์๋ฒฝํ๊ฒ ๊ฒ์ถํด ๋ฌผ์ฒด์ ๊ฒฝ๊ณ๋ฅผ ํ๊ณก์ ์ผ๋ก ๋ฐ๋ผ ์ ์๋ค๋ฉด ๋ถํ ๋ฌธ์ ๊ฐ ์ ์ ๋ก ํ๋ฆฐ๋ค. ๋ฐ๋๋ก ์์ญ ๋ถํ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ฒฝํด ๋ฌผ์ฒด๋ฅผ ๋ ๋ฆฝ๋ ์์ญ์ผ๋ก ๋ถํ ํ๋ฉด ์์ง ๊ฒ์ถ ๋ฌธ์ ๊ฐ ์ ์ ๋ก ํ๋ฆฐ๋ค. ๋ฐ๋๋ก ์์ญ ๋ถํ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ฒฝํด ๋ฌผ์ฒด๋ฅผ ๋ ๋ฆฝ๋ ์์ญ์ผ๋ก ๋ถํ ํ๋ฉด ์์ง ๊ฒ์ถ ๋ฌธ์ ๊ฐ ์ ์ ๋ก ํ๋ฆฐ๋ค. ๋ฐ๋ผ์ ๋์ ์๋ ๋ฌธ์ ๋ค.
ํ์ง๋ง ๋์ ์์ ํ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋ฌธ์ ํด๊ฒฐ์ ๋ชจ์ํ๋ค. ์์ง ๊ฒ์ถ์ ํน์ฑ์ด ํฌ๊ฒ ๋ค๋ฅธ ํ์์ ์ง์คํ๋ ๋ฐ๋ฉด ์์ญ ๋ถํ ์ ๋น์ทํ ํ์๋ฅผ ๋ฌถ๋ ๋ฐฉ์์ ์ ํธํ๋ค.Edge๋ ์ค๊ณฝ์ ์ด๋ค! ์์ง ๊ฒ์ถ ์์ ๏นก
1.1. ์์ง ๊ฒ์ถ
์์ง ๊ฒ์ถ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌผ์ฒด ๋ด๋ถ๋ ๋ช ์์ด ์์ํ ๋ณํ๊ณ ๋ฌผ์ฒด ๊ฒฝ๊ณ๋ ๋ช ์์ด ๊ธ๊ฒฉํ ๋ณํ๋ ํน์ฑ์ ํ์ฉํ๋ค.
๋ฌผ์ฒด์ ๊ฒฝ๊ณ์์ ๊ธ๊ฒฉํ ๋ช ์(๋ฐ๊ธฐ) '๋ณํ'๊ฐ ์๊ธฐ๋ฏ๋ก ์ด๋ค ํจ์์ ๋ณํ๋์ ์ธก์ ํ๋ ๋ฏธ๋ถ์ ํ์ฉํ ์ ์๊ฒ ๋ค.
๋ฏธ๋ถ์ ์ด์ฉํ ์์ง ๊ฒ์ถ ๋ฐฉ๋ฒ์๋ 1์ฐจ ๋ฏธ๋ถ์ ์ด์ฉํ ๊ฒ์ถ ๋ฐฉ๋ฒ๊ณผ 2์ฐจ ๋ฏธ๋ถ์ ์ด์ฉํ ๊ฒ์ถ ๋ฐฉ๋ฒ์ด ์๋ค.
2์ฐจ ๋ฏธ๋ถ์ 1์ฐจ ๋ฏธ๋ถ์ผ๋ก ์ป์ ๊ฒฐ๊ณผ์ ๋ฏธ๋ถ์ ํ ๋ฒ ๋ ์ถ๊ฐํ ๊ฒ์ธ๋ฐ, 1์ฐจ ๋ฏธ๋ถ์ ์ปจ๋ณผ๋ฃจ์ ์ ๋ ๋ฒ ์ ์ฉํด์ ์์์ ์ป์ ์ ์์ง๋ง 2์ฐจ ๋ฏธ๋ถ์ ํ๋ฉด ํ ๋ฒ์ ์ปจ๋ณผ๋ฃจ์ ์ผ๋ก ๊ตฌํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋ฐฐ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ ์ ์๋ค.
๋ฏธ๋ถ ์์์ ๋์งํธ ์์์ ์ ์ฉํ ๋๋ ์ด๋ป๊ฒ ํ ๊น?
์ ์ ์ขํ๋ฅผ ์ฐ๋ ๋์งํธ ์์์์๋ x์ ์ต์ ๋ณํ๋์ด 1์ด๋ฏ๋ก $ \delta x=1$ ๋ก ํ๋ค.
๋ค์ ์์ ๋์งํธ ์์์ ๋ฏธ๋ถํ๋ ์์ด๋ค. ์ด ์์ ์์ $f$์ ์ ์ฉํ๋ ์ผ์ ํํฐ $u$๋ก ์ปจ๋ณผ๋ฃจ์ ์ ํ์ฌ ๊ตฌํํ๋ค. ํํฐ $u$๋ฅผ ์์ง ์ฐ์ฐ์ (edge operator) ๋ผ๊ณ ํ๋ค.1์ฐจ ๋ฏธ๋ถ์ ๋์งํธ ์์์ ๋ฏธ๋ถ(ํํฐ u๋ก ์ปจ๋ณผ๋ฃจ์ ) 1์ฐจ ๋ฏธ๋ถ ํํฐ๋ฅผ ํต๊ณผํ๋ฉด ๋ด์ฐ๋ฆฌ๊ฐ ์๊ธด๋ค.
1์ฐจ ๋ฏธ๋ถ ์์ ์ด๋ ํํฐ $u$์ธ [-1 1] ๊ฐ $f(x+1)-f(x)$ ์ ๋์๋๋ ๊ฒ์๋ ํํฐ์ ๊ฐ ํจ์์ ๊ณ์ ๊ฐ์๋ ๊ด๋ จ์ฑ์ด ์๋ค.
x๋ ๊ธฐ์ค์ด ๋๋ ๊ฐ
x - 1์ ๊ธฐ์ค๊ฐ ํ ์นธ ์ ์ ๊ฐ
x + 1์ ๊ธฐ์ค๊ฐ ํ ์นธ ์ดํ์ ๊ฐ
์ผ๋ก ๊ฐ๋จํ๊ฒ ํ ์ ์๋ค.๋ฏธ๋ถ ์๊ณผ ํํฐ ์ฌ์ด์ ๊ด๊ณ ์์ ์ค๊ณํ ์์ง ์ฐ์ฐ์ [-1 1] ์ ๋๋ฌด ์๊ณ ๋์นญ์ด ์๋ ๋ฌธ์ ๊ฐ ์๋ค. ๊ทธ๋์ ์ค์ ๋ก๋ [-1 0 1]๋ก ํ์ฅ์ ํด์ ์ฌ์ฉํ๋ค.
๋ 1์ฐจ์ ์ฐ์ฐ์๋ฅผ 2์ฐจ์์ผ๋ก ํ์ฅํ ์ ์๋ค. 2์ฐจ์์์๋ x ๋ฐฉํฅ๊ณผ y ๋ฐฉํฅ์ ๋ ๋ฐฉํฅ์ ๋ํด์ ๋ฏธ๋ถํ ๊ทธ๋๋์ธํธ๋ฅผ ์ฐ์ฐ์๋ก ์ฌ์ฉํ์ฌ ํ์ฅ์ ํ๋ค.
2์ฐจ ๋ฏธ๋ถ์์ ๊ตฌํํ๋ ํํฐ ์ด๋ค ํํฐ $u_{x}$ ์ $u_{y}$๋ฅผ 3x3 ํฌ๊ธฐ๋ก ํ์ฅํ๋ฉด ์ฃผ๋ณ ์์ญ์ ์ ๋ณด๋ฅผ ํจ๊ป ๊ณ ๋ คํ์ฌ ์์์ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ก์ธํด ์ก์๊ณผ ์์ ๋ณ๋์ฑ์ ์ผ๋ถ ํก์ํ๋ฉด์, ํฝ์ ๊ฐ์ ๋ณํ๊ฐ ๋ถ๋๋ฝ๊ฒ ์ด์ด์ง๋ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
๋ค์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ์์ง ์ฐ์ฐ์ (ํํฐ) ์ด๋ค.
1) ํ๋ ์(Prewitt) ์ฐ์ฐ์Prewitt ํํฐ 2) ์๋ฒจ(Sobel) ์ฐ์ฐ์
์๋ฒจ ์ฐ์ฐ์ ๋ ธ์ด์ฆ๊ฐ ์๋ ์์์์ ์์ง๋ฅผ ๊ฒ์ถํ๋๋ฐ ๋ํ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ฐ์ฐ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๊ธฐ ๋ณํ์จ(๊ธฐ์ธ๊ธฐ)์ ๊ฒ์ถํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ ๋์ถํ ํ์๊ฐ์ ๋น๊ต์ ํ๊ท ํ์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ ธ์ด์ฆ์ ๋์ฒด์ ์ผ๋ก ๊ฐํ๋ค.
์๋ฒจ ์ฐ์ฐ์๋ ๋ณด๋ค ๊ฐ๊น์ด ์ํ์ข์ฐ ํ์์ ๊ฐ์ค์น 2๋ฅผ ์ค๋ค.
์๋ฒจ ํํฐ๋ y์ถ์ ๊ธฐ์ค์ผ๋ก x ์์น๋ง ๋ณํ์ํค๋ ์์ง ํํฐ (x๋ฏธ๋ถ) ์,
x์ถ์ ๊ธฐ์ค์ผ๋ก y ์์น๋ง ๋ณํ์ํค๋ ์ํ ํํฐ (y๋ฏธ๋ถ) ๋ก ๋๋์ด์ ธ ์๋ค.์ค๊ณฝ์ ๊ฒ์ถ์ ์ํด์๋ ๋ ํํฐ (๋ ๋ฐฉํฅ์ ๋ฏธ๋ถ) ๋ฅผ ํฉ์ณ์ ์ด์ฉํด์ผ ํ๋ค.
ํํฐ์ ํฌ๊ธฐ๋ฅผ ํค์ธ ์๋ ์์ง๋ง ์ข์ ํจ๊ณผ๋ฅผ ๋ด์ง ๋ชปํด์ ๋ณดํต 3x3 ํํฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
์๋ฒจ ํํฐ ๋๊ฐ์ ์ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ 3, ์๋์ชฝ์ 1์ธ ๊ฐ์์ ์์์ ์๋ฒก ์์ง ์ฐ์ฐ์๋ฅผ ์ ์ฉํ๋ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
(4,4) ํ์ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ (3x3 ํฌ๊ธฐ) ์์ญ์ x๋ฐฉํฅ, y๋ฐฉํฅ ํํฐ๋ก ํ๋ฒ์ฉ ๊ธ์ ๊ฒฐ๊ณผ 6๊ณผ -6์ด๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ณ
์ด ๊ณผ์ ์ ์์ ์ ์ฒด์ ๋ฐ๋ณตํ๋ฉด ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ ์ด ๊ทธ์ด์ง๋ค.
์๋ฒจ ์ฐ์ฐ์ ํํฐ ์ ์ฉ ๊ณผ์ ๋ ๋ฐฉํฅ์ ๋ฏธ๋ถ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น ๊ฒ์ ์์ง ๊ฐ๋ (Edge strength, ํน์ Gradient magnitude)๋ผ๊ณ ํ๋ค.
$$\textrm{Edge strength}=\sqrt{{f_{x}^{'}}^{2}+{f_{y}^{'}}^{2}}$$
๋๋ก๋ ๋์ฑ ๊ฐ๋จํ ์์ผ๋ก ๋ํ๋ด๊ธฐ๋ ํ๋ค.
$$\textrm{Edge strength}=\begin{vmatrix}
f_{x}^{'}\end{vmatrix}+\begin{vmatrix}
f_{y}^{'}\end{vmatrix}$$2.2) cv2.Sobel ํจ์๋ฅผ ํ์ฉํ ์์ง ๊ฒ์ถ ๊ตฌํ
๋๋ณด๊ธฐcv2.Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None) -> dst
• src: ์ ๋ ฅ ์์
• ddepth: ์ถ๋ ฅ ์์ ๋ฐ์ดํฐ ํ์ . -1์ด๋ฉด ์ ๋ ฅ ์์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ์ฌ์ฉ.
• dx: x ๋ฐฉํฅ ๋ฏธ๋ถ ์ฐจ์
• dy: y ๋ฐฉํฅ ๋ฏธ๋ถ ์ฐจ์
• dst: ์ถ๋ ฅ ์์(ํ๋ ฌ)
• ksize: ์ปค๋ ํฌ๊ธฐ. ๊ธฐ๋ณธ๊ฐ์ 3.
• scale ์ฐ์ฐ ๊ฒฐ๊ณผ์ ์ถ๊ฐ์ ์ผ๋ก ๊ณฑํ ๊ฐ. ๊ธฐ๋ณธ๊ฐ์ 1.
• delta: ์ฐ์ฐ ๊ฒฐ๊ณผ์ ์ถ๊ฐ์ ์ผ๋ก ๋ํ ๊ฐ. ๊ธฐ๋ณธ๊ฐ์ 0.
• borderType: ๊ฐ์ฅ์๋ฆฌ ํฝ์ ํ์ฅ ๋ฐฉ์. ๊ธฐ๋ณธ๊ฐ์ cv2.BORDER_DEFAULT.import cv2 as cv img = cv.imread('alexa.jpg') gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) grad_x = cv.Sobel(gray, cv.CV_32F, 1, 0, ksize=3) # ๊ทธ๋๋์ธํธ ๋งต์ ์์๋ฅผ ํฌํจํ๋ฉฐ ์ค์๋ค. grad_y = cv.Sobel(gray, cv.CV_32F, 0, 1, ksize=3) # CV_32F๋ numpy์ float32 ํ๊ณผ ๊ฐ๋ค. sobel_x = cv.convertScaleAbs(grad_x) # ์ ๋๊ฐ์ ์ทจํด ์์ ์์์ผ๋ก ๋ณํ sobel_y = cv.convertScaleAbs(grad_y) # CV_8U(uint8) ๋งต์ ๋ง๋ค์ด 255๋ฅผ ๋๋ ๊ฐ์ 255๋ก ๋ฐ๊พธ์ด ๊ธฐ๋ก # grad_x, grad_y์ ์ ๋๊ฐ์ ์ทจํ๊ณ ๊ฐ๊ฐ 0.5 ๊ฐ์ค์น๋ฅผ ๊ณฑํด์ ๋ํ ๊ฒฐ๊ณผ edge_strength = cv.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0) cv.imshow('Original', gray) cv.imshow('sobel x', sobel_x) cv.imshow('sobel y', sobel_y) cv.imshow('edge strength', edge_strength) cv.waitKey() cv.destroyAllWindows()
cv2.sobel ์ ์ฉ ๊ฒฐ๊ณผ ์ถ์ฒ
์ค์ผ์, ใ์ปดํจํฐ ๋น์ ๊ณผ ๋ฅ๋ฌ๋ใ (ํ๋น ์์นด๋ฐ๋ฏธ, 2013)
'AI\ML\DL > Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SLIC ์๊ณ ๋ฆฌ์ฆ, Superpixel segmentation (0) 2023.08.11 ํํ ๋ณํ (Hough Transformation) (1) 2023.08.09 Line detection, findContours(), drawContours() (0) 2023.08.08 ์์ง ๊ฒ์ถ(2) - Canny edge detection (0) 2023.08.08