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
: