// Sobel.v ソーベルフィルタモジュール

#define C_SIZE 1  // キャッシュ半径

module Sobel(in:input,Magnitude,Direction:output)
int in on pixel cache C_SIZE;
int Magnitude on pixel;  // 検出されたエッジの強度
int Direction on pixel;	 // 検出されたエッジの方向
{
    parallel{
	float dx,dy;  // 縦方向、横方向の差分
	
	// 横方向の差分をとります。
	dx = (float)(  (in[-C_SIZE][-C_SIZE] + 2*in[][-C_SIZE] + in[+C_SIZE][-C_SIZE])
		     - (in[-C_SIZE][+C_SIZE] + 2*in[][+C_SIZE] + in[+C_SIZE][+C_SIZE]));
	// 縦方向の差分をとります。
	dy = (float)(  (in[-C_SIZE][-C_SIZE] + 2*in[-C_SIZE][] + in[-C_SIZE][+C_SIZE])
		     - (in[+C_SIZE][-C_SIZE] + 2*in[+C_SIZE][] + in[+C_SIZE][+C_SIZE]));
				  
	// 求められた差分からエッジの強度と方向を求めます。
	Magnitude[][] = (int)sqrt((dx*dx)+(dy*dy));
	Direction[][] = (int)(atan2(dy,dx)*10000);	
    }
}

フィルタリングメインフローへ戻る

VIOS トップページ