// Median.v  メディアンフィルタモジュール

#define S_LENGTH 9 // ソート列の長さ
#define C_SIZE 1   // キャッシュの半径

// 配列をソートし、その中央値を返します
int Sorting(int SortLine[S_LENGTH])
{
    int i,j,temp;
    // ソート列をソーティングします(単純比較ソート)
    for(i = 0; i < S_LENGTH-1; i++){
	for(j = i+1; j < S_LENGTH; j++){
	    if(SortLine[i] > SortLine[j]){
		temp = SortLine[i];
		SortLine[i] = SortLine[j];
		SortLine[j] = temp;
	    }
	}
    }
    return SortLine[S_LENGTH/2];
}

// メディアンフィルタモジュールメイン部分
module Median(in:input,out:output)
int in on pixel cache C_SIZE;
int out on pixel;
{
    parallel{
	int i,j;                 // ループ変数 
	int SortLine[S_LENGTH];  // ソートを行なうための配列
	int count = 0;           // 配列の添字
	
	// 注目画素と近傍画素をソート列に格納
	for(i = -C_SIZE; i < C_SIZE+1; i++){
	    for(j = -C_SIZE; j < C_SIZE+1; j++){
		SortLine[count++] = in[i][j];
	    }
	}
	
	// ソートされた配列の中央の値を出力とする。
	out[][] = Sorting(SortLine);
    }
}
フィルタリングメインフローへ戻る

VIOS トップページ