-
์์ง ๊ฒ์ถ(2) - Canny edge detectionAI\ML\DL/Computer Vision 2023. 8. 8. 19:15๋ฐ์ํ
โฃ
Background
์บ๋ ์์ง ๊ฐ์ง๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์์ง ๊ฒ์ถ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. John F. Canny๊ฐ 2010๋ ๋์ ๊ฐ๋ฐํ์ผ๋ฉฐ OpenCV ์์ ์บ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ cv.Canny() ํจ์๋ฅผ ์ ๊ณตํ๋ค.
Canny edge๋ ๊ทธ๋๋์ธํธ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๊ณ ์๊ณ๊ฐ์ ์ค์ ํด์ค์ ์์ง๋ฅผ ๊ฒ์ถํ๋ฉด ์ค๊ณฝ์ ์ด ๋๋ฌด ๋๊ป๊ฒ ํํ๋๊ธฐ ๋๋ฌธ์,
์ด๋ ๊ฒ ์ก์์ด ๋ง์ ์ํ์์์ ํ ์ ์ ๊ฒฐ์ ํ์ฌ ์์ง์ ๊ตต๊ธฐ(๋๊ป)๋ฅผ ์๊ฒ ํํํ๊ธฐ ์ํด ์ ์ฉ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ข์ ์์ง ๊ฒ์ถ๊ธฐ์ ์กฐ๊ฑด์ โถ ํ๋์ ์์ง๋ฅผ ํ๋์ ์ (ํ ๋๊ป)์ผ๋ก ํํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ โท ํฝ์ ์ด ์กฐ๋ช ์ ์ํด ๋ฏธ์ธํ ์ํฅ์ ๋ฐ๊ฒ ๋์ด ์์ง๊ฐ ์๋ ์ ์ ์์ง๋ก ์ฐพ๊ฑฐ๋(false positive) ๋๋ ์์ง์ธ๋ฐ ์์ง๋ก ๊ฒ์ถํ๊ธฐ ๋ชปํ๋(true false) ์ค๋ฅ์จ์ ์ต์ํํด์ผ ํ๋ค.
โ
โ
Non-Maximum Suppresion
์บ๋ ์์ง๋ ํ ๋๊ป ์์ง๋ฅผ ์ถ๋ ฅ์ ๋น์ต๋ ์ต์ (NMS: Non-Maximum Suppression)๋ฅผ ์ ์ฉํ๋ค.
๋น์ต๋ ์ต์ ๋ ์์ง ๊ฒ์ถ ํ์ ์์ง์ ๊ตต๊ธฐ๋ฅผ ์๊ฒ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, ๊ฐ ํฝ์ ์ ๊ทธ๋๋์ธํธ ๋ฐฉํฅ์ ํ์ฉํ์ฌ ํด๋น ์ฃ์ง๊ฐ local maximum ์ธ์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๊ณผ์ ์ด๋ค.
์๊ธฐ ์์ ์ ์์ง ๊ฐ๋๊ฐ (์์ง ๋ฐฉํฅ์) ์์ง์ธ ๋ ์ด์ ํ์์ ์์ง ๊ฐ๋(magnitude)๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์์ง๋ก ์ ์ง๋๊ณ ,
์์ ์ ๊ฐ์ด ๋ ์๋ค๋ฉด ์์ง ์๋ ํ์๋ก ๋ฐ๋๋ค. ๋ค์ ๋งํด ๋ ์ด์ ํ์์ ๋น๊ตํด ์์ ์ด ์ต๋๊ฐ ์๋๋ฉด ์ต์ ๋๋ค.
๋น์ต๋ ์ต์ . ๊ฐ ์์ง ๋ฐฉํฅ์ ๋ํด ์์ง์ธ ๋ ์ด์ ํ์์ ๋น๊ตํด ์์ ์ด ์ต๋๊ฐ ์๋๋ฉด ์ต์ ๋๋ค. โ
์์ 1) edge strength๊ฐ ๊ฐ ํ์์ ์ซ์๋ก ์ฐ์ฌ์๋ค. ๊ทธ๋๋์ธํธ ๋ฐฉํฅ์ ํ์ดํ๋ก ๋ํ๋์์ผ๋ฉฐ ๊ฐ ๋ฐฉํฅ์ ์์ง์ธ ์ด์ํ์์ edge strength๋ฅผ ๋น๊ตํ๋ค. NMS๋ฅผ ์งํํ ๊ฒฐ๊ณผ๋ ํฐ์ ๊ฒฝ๊ณ์ ์ผ๋ก ๋ฌถ์ฌ์ ธ ์๋ค. ์์ 2) Canny Edge Detection Algorithm Application for Analysis of the Potential Field Map (2017) ์บ๋ ์๊ณ ๋ฆฌ์ฆ์ FN์ ์ค์ด๊ธฐ ์ํด 2๊ฐ์ ์ด๋ ฅ ์๊ณ๊ฐ $T_{low}$, $T_{high}$ ๋ฅผ ์ด์ฉํ ์์ง ์ถ์ ์ ์ถ๊ฐ๋ก ์ ์ฉํ๋ค.
์์ง ์ถ์ ์ ์์ง ๊ฐ๋๊ฐ $T_{high}$ ์ด์์ธ ์์ง ํ์์์ ์์ํ๋ค. ์ค์ ์์ง์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ณณ์์ ์ถ์ ์ ์์ํ๊ฒ ๋ค๋ ์๋์ด๋ค.
์์ ํ์๊ฐ ์ ํด์ง๋ฉด ์ดํ ์ถ์ ์ $T_{low}$ ์๊ณ๊ฐ์ ๋๋ ์์ง๋ฅผ ๋์์ผ๋ก ์งํํ๋ค. ์ฆ ์ถ์ ์ด๋ ฅ์ด ์๋ ์ด์์ ๊ฐ์ง ํ์๋ ์์ง ๊ฐ๋๊ฐ ๋ฎ๋๋ผ๋ ์ค์ ์์ง๋ก ์ธ์ ํ๋ ์ ๋ต์ด๋ค. ์บ๋๋ $T_{high}$๋ฅผ $T_{low}$ ์ 2~3๋ฐฐ๋ก ์ค์ ํ ๊ฒ์ ๊ถ๊ณ ํ๋ค.
์บ๋ ์์ง ์คํํ๊ธฐ
import cv2 as cv img = cv.imread('soccer.jpg') gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) canny1 = cv.Canny(gray, 50, 100) canny2 = cv.Canny(gray, 100, 200) cv.imshow('Original', gray) cv.imshow('Canny1', canny1) cv.imshow('Canny2', canny2) cv.waitKey() cv.destroyAllWindows()
(Original) gray image Canny1 (์ด๋ ฅ ์๊ณ๊ฐ์ ๋ ๋ฎ๊ฒ ์ค์ ํ ๊ฒฝ์ฐ): ์ก์ ์์ง๊ฐ ๋ง๋ค Canny 3 (์ด๋ ฅ ์๊ณ๊ฐ์ด ๋์ ๋): ์์ง ๊ฐ๋๊ฐ ํฐ ํ์๋ง ์ถ์ ํ๊ธฐ ๋๋ฌธ์ ๋ ์ ์ ์์ง๊ฐ ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค๋ฉด ์ผ์ชฝ ๋ท์ชฝ์ ์๋ ์ ์์ ํ์ ๋ถ๋ถ์ ํ์ ์ผ๋ถ๊ฐ ์์ค๋์๋ค. ์ถ์ฒ
์ค์ผ์, ใ์ปดํจํฐ ๋น์ ๊ณผ ๋ฅ๋ฌ๋ใ (ํ๋น ์์นด๋ฐ๋ฏธ, 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 ์์ง ๊ฒ์ถ(1) - 1์ฐจยท2์ฐจ ๋ฏธ๋ถ, Prewitt, Sobel (0) 2023.08.06