๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ONI์™€ Jean-y์˜ ์Šค๋งˆํŠธํ•œ ๊ณต๊ฐ„ ๐Ÿ”Ž
๐Ÿค– AI์ผ์ž˜๋Ÿฌ ์˜ค๋‹ˆ์˜ AI

Canny edge detection์ด๋ž€?

by Smart Platform 2023. 3. 28.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” AI์ผ์ž˜๋Ÿฌ ์˜ค๋‹ˆ์ž…๋‹ˆ๋‹ค ๐Ÿค–

์˜ค๋Š˜์€ Canny edge detection์— ๋Œ€ํ•œ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค ๐Ÿ–‹

๊ทธ๋Ÿผ Canny edge detection์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ‘Œ๐Ÿป

 

 

The Canny edge detector is a popular algorithm for detecting edges in an image.
It is known for its ability to accurately detect edges while minimizing false detections.
- Computer Vision: Algorithms and Applications by Richard Szeliski

 

โœ” ๋“ค์–ด๊ฐ€๋ฉฐ

  ์ปดํ“จํ„ฐ ๋น„์ „์— ๊ด€์‹ฌ์ด ์žˆ๊ฑฐ๋‚˜ ๋จธ์‹  ๋Ÿฌ๋‹ ์‹ค๋ฌด์ž๋ผ๋ฉด Canny edge detection ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๋“ค์–ด๋ณด์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ Canny edge detection์˜ ์ •์˜, ์ž‘๋™ ๋ฐฉ์‹, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ Canny edge detection์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ๋‚ด์šฉ์„ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

โœ” Canny edge detection์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?
  Canny edge detection์€ ์ด๋ฏธ์ง€์˜ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” edge detection ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 1986๋…„ ์กด F. ์บ๋‹ˆ๊ฐ€ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ ์˜ค๋Š˜๋‚ ์—๋„ ์—ฌ์ „ํžˆ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์บ๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์†Œํ•œ์˜ ์˜ค๋ฅ˜๋กœ ์ •ํ™•ํ•œ ์—์ง€ ๋งต์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ์˜ ์—์ง€ ๊ฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

โœ” Canny edge detection์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?
  Canny edge detection ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํฌ๊ฒŒ ๋‹ค์„ฏ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1๏ธโƒฃ ๊ฐ€์šฐ์‹œ์•ˆ smoothing: ์บ๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์ด๋ฏธ์ง€์— ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋…ธ์ด์ฆˆ๋ฅผ ํ‰ํ™œํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

  2๏ธโƒฃ ๊ทธ๋ผ๋ฐ์ด์…˜ ๊ณ„์‚ฐ: ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์†Œ๋ฒจ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€์˜ ๊ทธ๋ผ๋ฐ์ด์…˜์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์†Œ๋ฒจ ์—ฐ์‚ฐ์ž๋Š” ๊ฐ„๋‹จํ•œ ๊ฐ€์žฅ์ž๋ฆฌ ๊ฐ์ง€ ํ•„ํ„ฐ๋กœ ์ด๋ฏธ์ง€์˜ x ๋ฐ y ๋ฐฉํ–ฅ์˜ ๊ทธ๋ผ๋ฐ์ด์…˜์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  3๏ธโƒฃ ๋น„์ตœ๋Œ€ ์–ต์ œ: ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ตœ๋Œ€ ์—์ง€ ์‘๋‹ต์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ํ”ฝ์…€์„ ์ œ๊ฑฐํ•˜์—ฌ ์—์ง€๋ฅผ ์–‡๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

  4๏ธโƒฃ ์ด์ค‘ ์ž„๊ณ„๊ฐ’: ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์—์ง€ ์‘๋‹ต ๊ฐ’์— ๋”ฐ๋ผ ์—์ง€๋ฅผ ๊ฐ•ํ•œ ์—์ง€์™€ ์•ฝํ•œ ์—์ง€๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•ํ•œ ์—์ง€๋Š” ์œ ์ง€๋˜๊ณ  ์•ฝํ•œ ์—์ง€๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

 

  5๏ธโƒฃ hysteresis๋ฅผ ํ†ตํ•œ ์—์ง€ ์ถ”์ : ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ•ํ•œ ์—ฃ์ง€์™€ ์—ฐ๊ฒฐ๋œ ์•ฝํ•œ ์—ฃ์ง€๋Š” ์œ ์ง€ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์•ฝํ•œ ์—ฃ์ง€๋Š” ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

โœ” Canny edge detection์˜ ํ™œ์šฉ ๋ถ„์•ผ

  Canny edge detection๋Š” ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ์ปดํ“จํ„ฐ ๋น„์ „, ๋จธ์‹  ๋Ÿฌ๋‹ ๋ถ„์•ผ์—์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‘์šฉ ๋ถ„์•ผ ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค:

  1๏ธโƒฃ ๋ฌผ์ฒด ๊ฐ์ง€: ์ด๋ฏธ์ง€์—์„œ ๋ฌผ์ฒด์˜ edge๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌผ์ฒด ๊ฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ „์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  2๏ธโƒฃ ์ฐจ์„  ๊ฐ์ง€: Canny edge detection์€ ์ฐจ์„  ๊ฐ์ง€ ์‹œ์Šคํ…œ์—์„œ ๋„๋กœ์˜ ์ฐจ์„  edge๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  3๏ธโƒฃ ์˜๋ฃŒ ์ด๋ฏธ์ง€ ๋ถ„์„: ์˜๋ฃŒ ์ด๋ฏธ์ง€ ๋ถ„์„์—์„œ ์‹ ์ฒด์˜ ์žฅ๊ธฐ ๋ฐ ๊ธฐํƒ€ ๊ตฌ์กฐ์˜ edge๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

  4๏ธโƒฃ ๊ด‘ํ•™ ๋ฌธ์ž ์ธ์‹: ๊ด‘ํ•™ ๋ฌธ์ž ์ธ์‹ ์‹œ์Šคํ…œ์—์„œ ํ…์ŠคํŠธ์˜ ๋ฌธ์ž edge๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

โœ” Canny edge detection์˜ ์žฅ๋‹จ์ 
  ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Canny edge detection์—๋„ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  โ—ผ ์žฅ์ 
    โ–ช ์ตœ์†Œํ•œ์˜ ์˜ค๋ฅ˜๋กœ ์ •ํ™•ํ•œ ์—์ง€ ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    โ–ช ๋‹ค์–‘ํ•œ ๊ฐ•๋„์˜ ์—์ง€๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    โ–ช ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€ ์œ ํ˜•์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  โ—ผ ๋‹จ์ 

  โ–ช ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ํฐ ์ด๋ฏธ์ง€์—์„œ๋Š” ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  โ–ช ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋…ธ์ด์ฆˆ์— ๋ฏผ๊ฐํ•˜๋ฉฐ ์ž˜๋ชป๋œ edge๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  โ–ช ์ด๋ฏธ์ง€๋งˆ๋‹ค ์ž„๊ณ„๊ฐ’์„ ์กฐ์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ” ๋งˆ์น˜๋ฉฐ
  Canny edge detection์€ ๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์—์ง€ ๊ฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์†Œํ•œ์˜ ์˜ค๋ฅ˜๋กœ ์ •ํ™•ํ•œ ์—์ง€ ๋งต์„ ์ƒ์„ฑํ•˜๋ฉฐ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ๋…ธ์ด์ฆˆ์— ๋ฏผ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์บ๋‹ˆ ์—์ง€ ๊ฐ์ง€๋Š” ์ปดํ“จํ„ฐ ๋น„์ „ ๋ฐ ๋จธ์‹  ๋Ÿฌ๋‹ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์œ ์šฉํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

โ“ FAQ

  1๏ธโƒฃ Canny edge detection์€ ์–ด๋–ค ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋‚˜์š”?
    โ–ช ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ์ปดํ“จํ„ฐ ๋น„์ „, ๋จธ์‹  ๋Ÿฌ๋‹ ๋ถ„์•ผ์—์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌผ์ฒด ๊ฐ์ง€, ์ฐจ์„  ๊ฐ์ง€, ์˜๋ฃŒ ์ด๋ฏธ์ง€ ๋ถ„์„ ๋ฐ ๊ด‘ํ•™ ๋ฌธ์ž ์ธ์‹์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

  2๏ธโƒฃ Canny edge detection์€ ๋‹ค๋ฅธ ์—์ง€ ๋””ํ…์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๊นŒ?
    โ–ช ์ตœ์†Œํ•œ์˜ ์˜ค๋ฅ˜๋กœ ์ •ํ™•ํ•œ ์—์ง€ ๋งต์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ์˜ ์—์ง€ ๋””ํ…์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋” ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

 

  3๏ธโƒฃ Canny edge detection์„ ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?
    โ–ช ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‚ฌ์šฉ๋˜๋Š” ํ•˜๋“œ์›จ์–ด์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์บ๋‹ˆ ์—ฃ์ง€ ๊ฐ์ง€๋Š” ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ €์ „๋ ฅ ๋””๋ฐ”์ด์Šค์˜ ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  4๏ธโƒฃ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€์˜ ์ž„๊ณ„๊ฐ’์„ ์กฐ์ •ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?
    โ–ช ์ž„๊ณ„๊ฐ’์€ ๋‹ค์–‘ํ•œ ๊ฐ’์œผ๋กœ ์‹คํ—˜ํ•˜๊ณ  ์ถœ๋ ฅ์„ ๊ด€์ฐฐํ•˜์—ฌ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ ์‘ํ˜• ์ž„๊ณ„๊ฐ’ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž„๊ณ„๊ฐ’์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  5๏ธโƒฃ Canny edge detection์„ ๋น„๋””์˜ค ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?
    โ–ช ๋„ค, ์บ๋‹ˆ ์—์ง€ ๊ฐ์ง€๋ฅผ ๋™์˜์ƒ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ๋น„๋””์˜ค ์ฒ˜๋ฆฌ์—๋Š” ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์—์ง€ ๊ฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ป Code Example

import cv2
import numpy as np

# Load image and convert to grayscale
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Apply Gaussian blur to reduce noise
blur = cv2.GaussianBlur(gray, (3,3), 0)

# Compute gradients using Sobel operator
gx = cv2.Sobel(blur, cv2.CV_64F, 1, 0, ksize=3)
gy = cv2.Sobel(blur, cv2.CV_64F, 0, 1, ksize=3)

# Compute gradient magnitude and direction
mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)

# Apply non-maximum suppression to thin edges
mag_max = np.max(mag)
mag[mag < 0.1 * mag_max] = 0
mag[mag > 0.3 * mag_max] = 255

# Apply hysteresis thresholding to connect edges
edges = cv2.Canny(mag, 50, 150)

# Display original image and edges
cv2.imshow("Original Image", img)
cv2.imshow("Edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

๋Œ“๊ธ€