// 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 トップページ