Edge๋ž€ ๊ฒฝ๊ณ„์„ , ์œค๊ณฝ์„ ์„ ์˜๋ฏธํ•˜๋ฉฐ ์˜์ƒ์ฒ˜๋ฆฌ์—์„œ๋Š” ๋ฐ๊ธฐ๊ฐ€ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋งํ•œ๋‹ค. 

 

ํ”ฝ์…€ ๊ฐ’์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ์ง€์ ์ด Edge๋ถ€๋ถ„์ด๋ฉฐ Edge๋ฅผ ๊ฒ€์ถœํ•จ์œผ๋กœ์จ ๋ฌผ์ฒด์˜ ์˜์น˜, ๋ชจ์–‘, ํฌ๊ธฐ, ๋ฐฉํ–ฅ์„ฑ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

ํ”ฝ์…€์€ ๊ณก์„  ๊ทธ๋ž˜ํ”„์ฒ˜๋Ÿผ ์—ฐ์† ๊ณต๊ฐ„์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ์— ๋ฏธ๋ถ„ ๊ทผ์‚ฟ๊ฐ’์œผ๋กœ Edge์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ง์€ ์„œ๋กœ ๋ถ™์–ด ์žˆ๋Š” ํ”ฝ์…€ ๊ฐ’์˜ ์ฐจ๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๐Ÿ’ก Sobel Filter

Sobel์ด ๊ณ ์•ˆํ•ด๋‚ธ ๊ฐ€์žฅ์ž๋ฆฌ ๊ฒ€์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ 3X3 ํฌ๊ธฐ์˜ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์‚ฐํ•˜์˜€์„ ๋•Œ ์ค‘์‹ฌ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๋ฐฉํ–ฅ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ํ”ฝ์…€ ๊ฐ’์˜ ๋ณ€ํ™”๋Ÿ‰์„ ๊ฒ€์ถœํ•œ๋‹ค. 

 

X์ถ• ํ•„ํ„ฐ๋Š” ์„ธ๋กœ ์„ฑ๋ถ„์„ ๊ฒ€์ถœํ•˜๊ณ  Y์ถ• ํ•„ํ„ฐ๋Š” ๊ฐ€๋กœ ์„ฑ๋ถ„์„ ๊ฒ€์ถœํ•œ๋‹ค.

 

๋Œ€๊ฐ์„ ์„ ๊ฒ€์ถœํ•˜๋Š” Sobel filter๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Sobel Filter๋Š” ๋ชจ๋“  ๋ฐฉํ–ฅ์˜ Edge ์ถ”์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ Edge์— ๋”์šฑ ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘ํ•œ๋‹ค. ๋˜ํ•œ ๋Œ์ถœํ•œ ํ™”์†Œ ๊ฐ’์„ ํ‰๊ท ํ™”ํ•˜๋ฏ€๋กœ ์žก์Œ์— ๊ฐ•ํ•˜๋‹ค.

 

 

 

์›๋ณธ ์˜์ƒ์„ ๊ฐ๊ฐ Sobel ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•ด์„œ Edge์„ ๊ฒ€์ถœํ•œ ๊ฒƒ์ด๋‹ค. ์œ„์—์„œ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ˆ˜์ง์„ ๊ฒ€์ถœํ•˜๋Š” X์ถ• ํ•„ํ„ฐ, ์ˆ˜ํ‰์„ ๊ฒ€์ถœํ•˜๋Š” Y์ถ• ํ•„ํ„ฐ, ๊ฐ๊ฐ ๋Œ€๊ฐ์„ ์„ ๊ฒ€์ถœํ•˜๋Š” ํ•„ํ„ฐ์ด๋‹ค.

 

 

๐Ÿ’ก Canny Edge

Edge ๊ฒ€์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ฐ€์žฅ ์‹ ๋ขฐ์„ฑ์ด ๋†’๊ณ  ๊ฐ„ํŽธํ•˜์—ฌ ๋ณดํŽธํ™”๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋„ํ˜•์˜ ์œค๊ณฝ์„ ํ•˜๋‚˜์˜ ์„ ์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฏธ์ง€์˜ ํŠน์ง• ์ถ”์ถœ์„ ์œ„ํ•œ ์ „์ฒ˜๋ฆฌ๋กœ ๋งŽ์ด ํ™œ์šฉํ•œ๋‹ค.

 

โœŒ Canny Edge Detection

1๏ธโƒฃ ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ : ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ ์‚ฌ์šฉ

 

2๏ธโƒฃ Edge Gradient(๊ธฐ์šธ๊ธฐ) ๊ณ„์‚ฐํ•˜์—ฌ Gradient๊ฐ’์ด ๋†’์€ ๋ถ€๋ถ„์„ ์ฐพ๊ธฐ(=Sobel filter ์‚ฌ์šฉ)

ํ•จ์ˆ˜์˜ ์ ์—์„œ ๋ฏธ๋ถ„์„ ํ•˜๋ฉด ์ ‘์„ ์˜ ๊ธฐ์šธ๊ธฐ๊ฐ€ ๋‚˜์˜ค๋ฉฐ ๊ธฐ์šธ๊ธฐ๋Š” ์—ฐ์†๋œ ํ”ฝ์…€ ๊ฐ’์˜ ์ฐจ์ด ์ฆ‰ Edge๊ฐ€ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ฏธ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ํ”ฝ์…€์„ Sobel Filter๋กœ Convolution ์—ฐ์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

3๏ธโƒฃ ์ตœ๋Œ“๊ฐ’์ด ์•„๋‹Œ ํ”ฝ์…€์˜ ๊ฐ’์„ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ

Edge์— ๊ธฐ์—ฌ๋„๊ฐ€ ์ ์€ ํ”ฝ์…€์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ „์ฒด ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ์Šค์บ”ํ•˜๋ฉด์„œ ๊ธฐ์šธ๊ธฐ ๋ฐฉํ–ฅ์œผ๋กœ ๊ธฐ์šธ๊ธฐ ๊ฐ’์ด ์ตœ๋Œ“๊ฐ’์„ ๊ฐ€์ง„ ํ”ฝ์…€์„ ์ฐพ๋Š”๋‹ค.

A๋Š” ์ˆ˜์ง ๋ฐฉํ–ฅ ์œ„์˜ ์—์ง€ ์œ„์— ์žˆ๋Š” ํ”ฝ์…€์ด๋‹ค. ๊ธฐ์šธ๊ธฐ ๋ฐฉํ–ฅ์„ ์ˆ˜ํ‰์ด๊ณ  B์™€ C๋Š” ๊ธฐ์šธ๊ธฐ ๋ฐฉํ–ฅ์— ๋†“์ธ ํ”ฝ์…€์ด๋‹ค. A์ง€์ ์—์„œ ๊ธฐ์šธ๊ธฐ ๊ฐ’์ด B, C๋ณด๋‹ค ํฐ์ง€ ํ™•์ธํ•˜๋ฉฐ A๊ฐ’์ด ํฌ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๊ณ  ์•„๋‹ ๊ฒฝ์šฐ 0์œผ๋กœ ๋งŒ๋“ค์–ด ํ”ฝ์…€์„ ์–ต์ œํ•œ๋‹ค.

 

4๏ธโƒฃ Hyteresis Thresholding

๊ธฐ์šธ๊ธฐ ๊ฐ•๋„๊ฐ€ maxVal๋ณด๋‹ค ํฌ๋ฉด Edge, minVal๋ณด๋‹ค ์ž‘์œผ๋ฉด Edge๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ œ๊ฑฐํ•œ๋‹ค.

 

A๋Š” maxVal๋ณด๋‹ค ์œ„์— ์žˆ์œผ๋ฏ€๋กœ ํ™•์‹คํ•œ ์—์ง€์ด๊ณ  B๋Š” A(ํ™•์‹คํ•œ ์—์ง€)์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ œ๊ฑฐํ•œ๋‹ค. C๋Š” A์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ์— A์™€ C๋งŒ ๋‚จ๊ฒจ๋‘๊ณ  B๋Š” ์ œ๊ฑฐํ•œ๋‹ค.

 

์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜๊ฐ€ cv2.Canny() ํ•จ์ˆ˜์ด๋‹ค.

 

cv2.Canny(img, minimum thresholding value, maximum thresholding value)

 

ํ•จ์ˆ˜์˜ ์ธ์ž๋Š” ์ด๋ฏธ์ง€์™€ minVal, maxVal๋งŒ ์„ค์ •ํ•˜์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

 

Sobel filter ์ ์šฉ ํ›„
Canny Edge ์ ์šฉ ํ›„

 

๐Ÿ’ก ํ—ˆํ”„๋ณ€ํ™˜

์—ฐ๊ฒฐ ๊ด€๊ณ„๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์žก์Œ์œผ๋กœ ์ธํ•ด ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋Š์–ด์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋”ฐ๋ผ์„œ ํ—ˆํ”„ ๋ณ€ํ™˜์€ ์ „์ฒด ๊ณต๊ฐ„์„ ์กฐ์‚ฌํ•ด์„œ ์—ฐ๊ฒฐ ๊ณผ์ • ์—†์ด ๋ฐ”๋กœ ์ง์„ ์„ ๊ฒ€์ถœํ•œ๋‹ค.

 

ํ•œ ์ ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ง์„ ์€ ๋งŽ๊ธฐ์— ๊ธฐ์šธ๊ธฐ์™€ ์ ˆํŽธ์„ ๊ณ ์ •์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ [a-b] ๊ณต๊ฐ„์œผ๋กœ ๋ฐ”๋€๋‹ค๋ฉด ํ•œ ์ ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ง์„ ์„ ํ•˜๋‚˜์˜ ์ง์„ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ๋‹ค์‹œ [x-y] ๊ณต๊ฐ„์œผ๋กœ ๋ฐ”๊ฟ€ ์‹œ a, b์˜ ๋ฒ”์œ„๊ฐ€ ๋ฌดํ•œ๋Œ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜์ƒ์—๋Š” ํ™”์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๋””์Šคํ”Œ๋ ˆ์ด์˜ ์„ธ๋กœ, ๊ฐ€๋กœ ๋ฒ”์œ„๊ฐ€ ์œ ํ•œํ•˜๊ธฐ์— ์˜์ƒ์—๋Š” ๋ฒ”์œ„๊ฐ€ ์กด์žฌํ•˜์—ฌ ๋ฌดํ•œ๋Œ€๊ฐ€ ๋˜๋ฉด ์•ˆ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฒ”์œ„๊ฐ€ ์œ ํ•œํ•œ ๋ณ€์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฐ„์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. 

[x-y] ๊ณต๊ฐ„์—์„œ [θ-r] ๊ณต๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆํ”„ ๊ณต๊ฐ„์œผ๋กœ์˜ ๋ณ€ํ™˜์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰ ์ง์„  ์œ„์— ์žˆ๋Š” ์ ์ด ๊ณก์„ ์œผ๋กœ ๋ณ€ํ•œ๋‹ค. 

 

ํ—ˆํ”„ ๋ณ€ํ™˜์˜ OpenCVํ•จ์ˆ˜๋กœ๋Š” cv2.HoughLines๊ฐ€ ์žˆ๋‹ค.

 

cv2.HoughLines(img, rho, theta, threshold, lines, srn=0, stn=0, min_theta, max_theta)

 

์ธ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

img: ์ž…๋ ฅ ์ด๋ฏธ์ง€, 1 ์ฑ„๋„ ๋ฐ”์ด๋„ˆ๋ฆฌ ์Šค์ผ€์ผ
rho: ๊ฑฐ๋ฆฌ ์ธก์ • ํ•ด์ƒ๋„, 0~1
theta: ๊ฐ๋„, ๋ผ๋””์•ˆ ๋‹จ์œ„ (np.pi/0~180)
threshold: ์ง์„ ์œผ๋กœ ํŒ๋‹จํ•  ์ตœ์†Œํ•œ์˜ ๋™์ผ ๊ฐœ์ˆ˜ (์ž‘์€ ๊ฐ’: ์ •ํ™•๋„ ๊ฐ์†Œ, ๊ฒ€์ถœ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€ / ํฐ ๊ฐ’: ์ •ํ™•๋„ ์ฆ๊ฐ€, ๊ฒ€์ถœ ๊ฐœ์ˆ˜ ๊ฐ์†Œ)
lines: ๊ฒ€์ถœ ๊ฒฐ๊ณผ, N x 1 x 2 ๋ฐฐ์—ด (r, Θ)
srn, stn: ๋ฉ€ํ‹ฐ ์Šค์ผ€์ผ ํ—ˆํ”„ ๋ณ€ํ™˜์— ์‚ฌ์šฉ, ์„  ๊ฒ€์ถœ์—์„œ๋Š” ์‚ฌ์šฉ ์•ˆ ํ•จ
min_theta, max_theta: ๊ฒ€์ถœ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ตœ๋Œ€, ์ตœ์†Œ ๊ฐ๋„

+ Recent posts