Matlab 의 gradient 함수와 del2 함수에 대한 분석 및 C 코드 변환은 GVF 의 Matlab 코드를 분석하는 과정에서 이루어졌다. GVF란 Gradient Vector Flow 의 약자로써, http://iacl.ece.jhu.edu/projects/gvf/ 에서 자세한 정보를 얻을 수 있다.

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

Matlab의 del2 는 Laplacian 연산을 의미한다.

>> help del2
DEL2 Discrete Laplacian.
L = DEL2(U), when U is a matrix, is a discrete approximation of
0.25*del^2 u = (d^2u/dx^2 + d^2/dy^2)/4. The matrix L is the same
size as U, with each element equal to the difference between an
element of U and the average of its four neighbors.

L = DEL2(U), when U is an N-D array, returns an approximation of
(del^2 u)/2/n, where n is ndims(u).

아래 코드 분석을 보자. 몇몇 설명은 아래 gradient 관련 글을 참고하기 바란다.



이 코드를 C/C++로 변환하면 다음과 같이 하면 될 듯 싶다. ^^;


void IEGvf::GvfLaplacian(IEFloatImage& img, IEFloatImage& lap)
{
	register int i, j;

	int w = img.GetWidth();
	int h = img.GetHeight();

	lap.SetPixels(0);

	float** pimg = img.GetPixels2D();
	float** plap = lap.GetPixels2D();

	// x 방향
	for( j = 0 ; j < h ; j++ )
	{
		plap[j][0]   = pimg[j][1]*2   - pimg[j][2];
		plap[j][w-1] = pimg[j][w-2]*2 - pimg[j][w-3];
	}

	for( j = 0 ; j < h   ; j++ )
	for( i = 1 ; i < w-1 ; i++ )
	{
		plap[j][i] = ((pimg[j][i+1] - pimg[j][i]) - (pimg[j][i] - pimg[j][i-1]))/2;
	}

	// y 방향
	for( i = 0 ; i < w ; i++ )
	{
		plap[0][i]   += pimg[1][i]*2   - pimg[2][i];
		plap[h-1][i] += pimg[h-2][i]*2 - pimg[h-3][i];
	}

	for( j = 1 ; j < h-1 ; j++ )
	for( i = 0 ; i < w   ; i++ )
	{
		plap[j][i] += ((pimg[j+1][i] - pimg[j][i]) - (pimg[j][i] - pimg[j-1][i]))/2;
	}

	for( j = 0 ; j < h ; j++ )
	for( i = 0 ; i < w ; i++ )
	{
		plap[j][i] /= 2;
	}
}


Posted by kkokkal
:
Matlab 의 gradient 함수와 del2 함수에 대한 분석 및 C 코드 변환은 GVF 의 Matlab 코드를 분석하는 과정에서 이루어졌다. GVF란 Gradient Vector Flow 의 약자로써, http://iacl.ece.jhu.edu/projects/gvf/ 에서 자세한 정보를 얻을 수 있다.

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

Matlab 에서 'help gradient' 라고 치면 다음과 같이 출력된다.

>> help gradient
GRADIENT Approximate gradient.
    [FX,FY] = GRADIENT(F) returns the numerical gradient of the
    matrix F. FX corresponds to dF/dx, the differences in the
    x (column) direction. FY corresponds to dF/dy, the differences
    in the y (row) direction. The spacing between points in each
    direction is assumed to be one. When F is a vector, DF = GRADIENT(F)
    is the 1-D gradient.
    (이하 생략)

뭐... 대충 읽어보면 입력 F를 받아서 그것의 x 방향, y 방향으로의 미분값을 각각 구하여 FX와 FY에 저장한다는 내용이다. 아래 Matlab 코드를 보자.


위의 코드를 C/C++ 로 변환하는 것은 쉽다. 위의 빨간색 글씨를 쓰는, 그런 코드 이해가 어려운 거시지 이해만 했다면 C 코드 쓰는 것이야 어려울 턱이 있나.. ^^;

코드는 다음과 같다. 대충 보고 이해하기를...

void Gradient(IEFloatImage& img, IEFloatImage& fx, IEFloatImage& fy)
{
        register int i, j;

        int w = img.GetWidth();
        int h = img.GetHeight();

        fx.CreateImage(w, h);
        fy.CreateImage(w, h);

        float** pimg = img.GetPixels2D();
        float** pfx  = fx.GetPixels2D();
        float** pfy  = fy.GetPixels2D();

        // x 방향 그래디언트 fx 계산
        for( j = 0 ; j < h ; j++ )
        {
                pfx[j][0]   = pimg[j][1]   - pimg[j][0];
                pfx[j][w-1] = pimg[j][w-1] - pimg[j][w-2];
        }

        for( j = 0 ; j < h   ; j++ )
        for( i = 1 ; i < w-1 ; i++ )
        {
                pfx[j][i] = (pimg[j][i+1] - pimg[j][i-1])/2.f;
        }

        // y 방향 그래디언트 fy 계산
        for( i = 0 ; i < w ; i++ )
        {
                pfy[0][i]   = pimg[1][i]   - pimg[0][i];
                pfy[h-1][i] = pimg[h-1][i] - pimg[h-2][i];
        }

        for( j = 1 ; j < h-1 ; j++ )
        for( i = 0 ; i < w   ; i++ )
        {
                pfy[j][i] = (pimg[j+1][i] - pimg[j-1][i])/2.f;
        }
}
Posted by kkokkal
:


Images.zip


영상처리를 공부하다보면 자주 보게 되는 이미지 모음입니다.
출처는 아래와 같구요...

http://www.dip.ee.uct.ac.za/imageproc/

참고로, 폴더에 USC 라 함은 아래 사이트를 참고하세요.
이곳에 가면 더 많은 표준 영상을 구할 수 있습니다.

http://sipi.usc.edu/database/



Posted by kkokkal
:


RGB로 표현되는 트루칼라를 그레이스케일로 변환하는 식은 다음과 같다.

L = 0.299R + 0.587G + 0.114B

CxImage 라이브러리( http://www.xdp.it/cximage.htm )에는 위의 변환식을 define 문과 shift 연산자를 사용하여 속도 향상을 꾀하였다는 특색이 있다. CxImage 소스에 적혀있는 변환 코드는 다음과 같다.

// color to grey mapping <H. Muelner> <jurgene>
// Same as #define RGB2GRAY(r, g, b) (((b)*114 + (g)*587 + (r)*299)/1000)
#define RGB2GRAY(r, g, b) (((b)*117 + (g)*601 + (r)*306) >> 10)

이와는 달리, 매우 간단하게 grayscale 형태로 바꾸는 다음과 같은 식도 존재한다.

grayscale = (R + G + B) / 3

그러나, 이 방법은 말 그대로 매우 단순하게 grayscale 과 비슷한 값으로 바꾸는 것이고, 정확한 변환식은 아닌 것으로 생각된다.

(2005년 12월 28일 추가)

Matlab에서도 rgb2gray() 라는 함수가 있는데 이 함수에서는 다음과 같은 행렬을 이용하여 grayscale 로 변환을 한다.

T = inv([1.0 0.956 0.621; 1.0 -0.272 -0.647; 1.0 -1.106 1.703]);

이 행렬 T의 첫 번째 행이 위에서 제시한 변환식과 일치한다.

>> T

T =

     0.2989 0.5870 0.1140
     0.5959 -0.2744 -0.3216
     0.2115 -0.5229 0.3114


Posted by kkokkal
: