๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ก EE's DEV/์˜์ƒ์ฒ˜๋ฆฌ

[์˜์ƒ์ฒ˜๋ฆฌ] openCV2 Edge ๊ฒ€์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

by Danna 2017. 2. 27.
728x90
728x90
์—์ง€ ๊ฒ€์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์•Œ์•„๋ณด๊ธฐ

1. ์†Œ๋ฒจ, ํ”„๋ฆฌ์œ—, ๋กœ๋ฒ„์ธ , ๋ผํ”Œ๋ผ์‹œ์•ˆ ์žฅ๋‹จ์  

2. ๊ฐ€์šฐ์‹œ์•ˆ -> ๋ผํ”Œ๋ผ์‹œ์•ˆ vs ๋ผํ”Œ๋ผ์‹œ์•ˆ ๋น„๊ต 




Edge

    • Edge๋Š” ๊ฒฝ๊ณ„์„ , ์œค๊ณฝ์„ ์„ ์˜๋ฏธํ•จ
    • ์˜์ƒ์—์„œ edge๋Š” ์˜์ƒ์˜ ๋ฐ๊ธฐ๊ฐ€ ๋‚ฎ์€ ๊ฐ’์—์„œ ๋†’์€ ๊ฐ’์œผ๋กœ / ๋†’์€ ๊ฐ’์—์„œ ๋‚ฎ์€ ๊ฐ’์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋œปํ•จ
    • edge๋Š” ์˜์ƒ์•ˆ์— ์žˆ๋Š” ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์œผ๋กœ, ๋ชจ์–‘๊ณผ ๋ฐฉํ–ฅ์„ฑ์„ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์Œ
    • ์—์ง€์— ํ•ด๋‹นํ•˜๋Š” ํ™”์†Œ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ edge detection ์ด๋ผ ํ•จ

1์ฐจ ๋ฏธ๋ถ„

    • edge๋Š” ๋ช…์•”(๋ฐ๊ธฐ)์˜ ๋ณ€ํ™”๊ฐ€ ํฐ ์ง€์ 
    • ๋ช…์•”์˜ ๋ณ€ํ™”์œจ์ธ ๊ธฐ์šธ๊ธฐ(gradient)๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•, 1์ฐจ ๋ฏธ๋ถ„์ด๋ผ ํ•จ
    • ์ˆ˜ํ‰ ๋ฐฉํ–ฅ ๋ฏธ๋ถ„ G(x) = f(x-1, y) - f(x+1, y)
    • ์ˆ˜์ง ๋ฐฉํ–ฅ ๋ฏธ๋ถ„ G(y) = f(x, y-1) - f(x, y+1)
    • Edge = |G(x)| + |G(y)|

์†Œ๋ฒจ, ํ”„๋ฆฌ์œ—, ๋กœ๋ฒ„์ธ  ๋งˆ์Šคํฌ

    • 1์ฐจ ๋ฏธ๋ถ„ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋งˆ์Šคํฌ
    • ๋งˆ์Šคํฌ์˜ ๊ฐ€๋กœ, ์„ธ๋กœ ํฌ๊ธฐ๊ฐ€ ๊ฐ™๊ณ  ํ™€์ˆ˜์ž„
    • ์ค‘์‹ฌ ์ง€์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒํ•˜์ขŒ์šฐ๊ฐ€ ๋Œ€์นญ
    • ์ค‘์‹ฌ ์ง€์ ์˜ ๊ฐ’์€ ํ•ญ์ƒ 0์„ ํฌํ•จํ•œ ์–‘์ˆ˜
    • ๋ชจ๋“  ์ง€์ ์˜ ๊ฐ’๋“ค์˜ ํ•ฉ์€ 0

1. Sobel ์—์ง€ ๊ฒ€์ถœ

    • ๋ชจ๋“  ๋ฐฉํ–ฅ์˜ ์—์ง€๋ฅผ ์ถ”์ถœ
    • ๋Œ์ถœํ•œ ํ™”์†Œ๊ฐ’์„ ๋น„๊ต์  ํ‰๊ท ํ™”ํ•˜๋ฏ€๋กœ ์žก์Œ์— ๊ฐ•ํ•œ ํŽธ
    • ์ˆ˜์ง/์ˆ˜ํ‰ ์—์ง€๋ณด๋‹ค ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ ์—์ง€์— ๋” ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘
    • <์ˆ˜์ง ๋งˆ์Šคํฌ>  <์ˆ˜ํ‰ ๋งˆ์Šคํฌ>



2. Prewitt ์—์ง€ ๊ฒ€์ถœ
    • ์†Œ๋ฒจ, ํ”„๋ฆฌ์œ—์— ๋น„ํ•ด ๋งค์šฐ ๋น ๋ฅธ ๊ณ„์‚ฐ ์†๋„
    • ์ฃผ๋ณ€๊ณผ ๊ด€๊ณ„์—†์ด ๊ฒฝ๊ณ„๊ฐ€ ํ™•์‹คํ•œ ์—์ง€๋ฅผ ์ถ”์ถœ
    • ๋งˆ์Šคํฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„ ๋Œ์ถœํ•œ ํ™”์†Œ๊ฐ’์„ ํ‰๊ท ํ™” ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์žก์Œ ํ•ด๊ฒฐ ๋ถˆ๊ฐ€
    • <์ˆ˜์ง ๋งˆ์Šคํฌ>   <์ˆ˜ํ‰ ๋งˆ์Šคํฌ>



3. Roberts ์—์ง€ ๊ฒ€์ถœ

    • ์†Œ๋ฒจ, ํ”„๋ฆฌ์œ—์— ๋น„ํ•ด ๋งค์šฐ ๋น ๋ฅธ ๊ณ„์‚ฐ ์†๋„
    • ์ฃผ๋ณ€๊ณผ ๊ด€๊ณ„์—†์ด ๊ฒฝ๊ณ„๊ฐ€ ํ™•์‹คํ•œ ์—์ง€๋ฅผ ์ถ”์ถœ
    • ๋งˆ์Šคํฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์•„ ๋Œ์ถœํ•œ ํ™”์†Œ๊ฐ’์„ ํ‰๊ท ํ™” ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์žก์Œ ํ•ด๊ฒฐ ๋ถˆ๊ฐ€
    • <์ˆ˜์ง ๋งˆ์Šคํฌ>  <์ˆ˜ํ‰ ๋งˆ์Šคํฌ>



2์ฐจ ๋ฏธ๋ถ„

    • 1์ฐจ ๋ฏธ๋ถ„ ๊ฐ’์˜ ํฌ๊ธฐ๋Š” ์˜์ƒ์—์„œ ์—์ง€์˜ ์กด์žฌ์—ฌ๋ถ€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์ง€๋งŒ
    • 2์ฐจ ๋ฏธ๋ถ„ ๊ฐ’์˜ ๋ถ€ํ˜ธ๋Š” ์—์ง€ ํ™”์†Œ๊ฐ€ ์—์ง€์˜ ๋ฐ์€ ๋ถ€๋ถ„ or ์–ด๋‘์šด ๋ถ€๋ถ„ ์ค‘ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ
    • ์—์ง€๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฏธ๋ถ„์„ ๋‘ ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—์ง€๊ฐ€ ์ค‘์‹ฌ ๋ฐฉํ–ฅ์— ๊ฐ€๋Š˜๊ฒŒ ํ˜•์„ฑ, ๊ฒ€์ถœ๋œ ์œค๊ณฝ์„ ์ด ํ๊ณก์„ ์„ ์ด๋ฃจ๊ฒŒ ๋จ
    • ๋ฐ๊ธฐ ๊ฐ’์ด ์ ์ฐจ์ ์œผ๋กœ ๋ณ€ํ™”๋˜๋Š” ์˜์—ญ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฒ€์ถœํ•˜๊ธฐ ์–ด๋ ค์›€

1. Laplacian ์—์ง€ ๊ฒ€์ถœ

    • ๋ผํ”Œ๋ผ์‹œ์•ˆ ์—ฐ์‚ฐ์—์„œ ์•ŒํŒŒ = ๋ถ„์‚ฐ ํฌ๊ธฐ
    • 2์ฐจ ๋ฏธ๋ถ„์„ ์ด์šฉํ•ด ์˜์ƒ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ์ €์ฃผํŒŒ ์„ฑ๋ถ„์€ ์†Œ๊ฑฐ๋˜์ง€๋งŒ ๊ณ ์ฃผํŒŒ ์„ฑ๋ถ„์€ ์„ ๋ช…ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ์—์ง€ ๋ถ€๋ถ„์ด ๊ฐ•์กฐ๋จ
    • ์—์ง€ ๋ถ€๋ถ„์ด ๊ฐ•์กฐ๋˜๋ฏ€๋กœ ๊ฒฝ๊ณ„์„  ๋ถ€๋ถ„์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•จ
    • ๊ณ ๋ฆฝ๋œ ์žก์Œ์— ๋ฏผ๊ฐํ•˜๊ณ , ์œค๊ณฝ์˜ ๊ฐ•๋„๋งŒ ๊ฒ€์ถœํ•˜๊ณ  ๋ฐฉํ–ฅ์€ ๊ตฌํ•˜์ง€ ๋ชปํ•จ
    • x์ถ•๊ณผ y์ถ•์— ๋Œ€ํ•œ ๊ฐ๊ฐ์˜ ์ด์ฐจ ๋ฏธ๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‘ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์นœ๋‹ค.




    • <๋ผํ”Œ๋ผ์‹œ์•ˆ1> <๋ผํ”Œ๋ผ์‹œ์•ˆ2> : x์ถ• y์ถ• ๊ฐ๊ฐ 2์ฐจ๋ฏธ๋ถ„
    • <๋ผํ”Œ๋ผ์‹œ์•ˆ3> <๋ผํ”Œ๋ผ์‹œ์•ˆ4> : x์ถ• y์ถ• ์–‘ ๋Œ€๊ฐ์„  ๊ฐ๊ฐ 2์ฐจ๋ฏธ๋ถ„

2. LoG (Laplacian of Gaussian) ์—์ง€ ๊ฒ€์ถœ

    • ๊ฐ€์šฐ์‹œ์•ˆ - ๋ผํ”Œ๋ผ์‹œ์•ˆ ์—ฐ์‚ฐ
    • ๋ผํ”Œ๋ผ์‹œ์•ˆ ์—ฐ์‚ฐ์ด ์žก์Œ์— ๋ฏผ๊ฐํ•œ ์ ์„ ๊ฐœ์„ ํ•œ ๊ฒƒ
    • ๊ฐ€์šฐ์‹œ์•ˆ ํ•„ํ„ฐ๊ฐ€ ๋จผ์ € ์ ์šฉ๋œ ์—์ง€ ๊ฒ€์ถœ ๋ฐฉ์‹์ด๋ฏ€๋กœ ์žก์Œ์ด ์ค„์–ด๋“ฆ
    • ์žก์Œ์— ์˜ํ•ด ์ž˜๋ชป ๊ฒ€์ถœ๋˜๋Š” ์—์ง€์˜ ์ˆ˜ ์ค„์ด๊ณ  ์—์ง€์˜ ๊ตต๊ธฐ ๋” ๋„“๊ฒŒ ๋งŒ๋“ค์–ด์คŒ
    • ํ•จ์ˆ˜์˜ ํญ์ด ๋„“์„์ˆ˜๋ก ๊ฐ„๊ฒฉ์ด ๋„“์€ ์—์ง€ ๊ฒ€์ถœ, ํ•จ์ˆ˜์˜ ํญ์ด ์ข์œผ๋ฉด ๊ฒฝ์‚ฌ๊ฐ€ ๊ธ‰๊ฒฉํ•œ ์—์ง€์™€ ์„ธ์„ธํ•œ ์—์ง€ ๊ฒ€์ถœ



์†Œ๋ฒจ, ํ”„๋ฆฌ์œ—, ๋กœ๋ฒ„์ธ , ๋ผํ”Œ๋ผ์‹œ์•ˆ ์—์ง€ ๊ฒ€์ถœ ๋น„๊ต






์†Œ๋ฒจ ๋งˆ์Šคํฌ

void sobelEdge(Mat &image, Mat &out)
{
    int mask1[3][3] = {
        -1, 0, 1,
        -2, 0, 2,
        -1, 0, 1
    };
    int mask2[3][3] = {
        -1, -2, -1,
        0, 0, 0,
        1, 2, 1
    };

    int sum1, sum2;

    out = image.clone();

    for (int y = 1; y < image.size().height - 1; y++)
    {
        for (int x = 1; x < image.size().width - 1; x++)
        {
            sum1 = sum2 = 0;

            for (int m = -1; m <= 1; m++)
            {
                for (int n = -1; n <= 1; n++)
                {
                    sum1 += image.at<uchar>(y + m, x + n) * mask1[m + 1][n + 1];
                    sum2 += image.at<uchar>(y + m, x + n) * mask2[m + 1][n + 1];
                }
            }
            out.at<uchar>(y, x) = abs(sum1) + abs(sum2);
        }
    }
}




์ฐธ๊ณ  ์‚ฌ์ดํŠธ


    • http://blog.daum.net/trts1004/12109067
    • http://iskim3068.tistory.com/49
    • ์ด๋ฏธ์ง€ ์ถœ์ฒ˜๊ฐ€ ํ™•์ธ์ด ์•ˆ๋˜์–ด ํ˜น์‹œ ์ถœ์ฒ˜๋ฅผ ์•„์‹œ๊ฑฐ๋‚˜ ๋ฌธ์ œ์‹œ ๋Œ“๊ธ€๋‚จ๊ฒจ์ฃผ์„ธ์š”(2020.12.06 ์ด๋ฏธ์ง€ ์ถ”๊ฐ€)


728x90
728x90