ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ์—์ง€ ๊ฒ€์ถœ(1) - 1์ฐจ·2์ฐจ ๋ฏธ๋ถ„, Prewitt, Sobel
    AI\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)

Designed by Tistory.