첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ 가우시안-라플라시안 에지 회선 적용하기

------------------------------------------------------------------------------------------------------------------------

#region 가우시안-라플라시안 에지 회선 적용하기 - ConvolveGaussianLaplacianEdge(sourceArray)

 

/// <summary>

/// 가우시안-라플라시안 에지 회선 적용하기

/// </summary>

/// <param name="sourceArray">소스 배열</param>

/// <returns>가우시안-라플라시안 에지 회선 적용 배열</returns>

public int[,] ConvolveGaussianLaplacianEdge(int[,] sourceArray)

{

    int       sourceWidth                = sourceArray.GetUpperBound(1) + 1;

    int       sourceHeight               = sourceArray.GetUpperBound(0) + 1;

    double[,] gaussianLaplacianMaskArray =

    {

        { 0.0, 0.0, 3.0,   2.0,   2.0,   2.0, 3.0, 0.0, 0.0 },

        { 0.0, 2.0, 3.0,   5.0,   5.0,   5.0, 3.0, 2.0, 0.0 },

        { 3.0, 3.0, 5.0,   3.0,   0.0,   3.0, 5.0, 3.0, 3.0 },

        { 2.0, 5.0, 3.0, -12.0, -23.0, -12.0, 3.0, 5.0, 2.0 },

        { 2.0, 5.0, 0.0, -23.0, -40.0, -23.0, 0.0, 5.0, 2.0 },

        { 2.0, 5.0, 3.0, -12.0, -23.0, -12.0, 3.0, 5.0, 2.0 },

        { 3.0, 3.0, 5.0,   3.0,   0.0,   3.0, 5.0, 3.0, 3.0 },

        { 0.0, 2.0, 3.0,   5.0,   5.0,   5.0, 3.0, 2.0, 0.0 },

        { 0.0, 0.0, 3.0,   2.0,   2.0,   2.0, 3.0, 0.0, 0.0 }

    };

    int[,]    gaussianLaplacianArray     = ConvolveEdgeNoBias(sourceArray, gaussianLaplacianMaskArray);

    int[,]    targetArray                = new int[sourceHeight, sourceWidth];

    int       minimumValue               = int.MaxValue;

    int       maximumValue               = int.MinValue;

 

    for(int y = 0; y < sourceHeight; y++)

    {

        for(int x = 0; x < sourceWidth; x++)

        {

            if(gaussianLaplacianArray[y, x] < minimumValue)

            {

                minimumValue = gaussianLaplacianArray[y, x];

            }

 

            if(gaussianLaplacianArray[y, x] > maximumValue)

            {

                maximumValue = gaussianLaplacianArray[y, x];

            }

        }

    }

 

    double scale1 = -127.0 / minimumValue;

    double scale2 =  127.0 / maximumValue;

 

    for(int y = 0; y < sourceHeight; y++)

    {

        for(int x = 0; x < sourceWidth; x++)

        {

            targetArray[y, x] = gaussianLaplacianArray[y, x];

 

            if(targetArray[y, x] < 0)

            {

                targetArray[y, x] = (int)(scale1 * targetArray[y, x]) + 127;

            }

            else if(targetArray[y, x] == 0)

            {

                targetArray[y, x] = 128;

            }

            else

            {

                targetArray[y, x] = (int)(scale2 * targetArray[y, x]) + 128;

            }

        }

    }

 

    return targetArray;

}

 

#endregion

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요