最小値フィルタ
Posted: 2013年10月03日(木) 11:09
●やりたいこと:
画像(2次元配列的に値が並んでいるデータ)上の各位置(x,y)に関して,
その近傍 : 上下左右r[pixel]分,すなわち,(x,y)を中心とした 縦横共に r*2+1 サイズの領域
の最小値を求める(→その結果を別の画像の(x,y)に出力する)
最もシンプル(?)に書くと↓のような感じです.
●知りたいこと
効率の良いアルゴリズムが知りたいのです.
一般的な処理だと思うので,何か定石的な方法があるのではないか?と思うのですが
検索が下手なのか,そういったものを発見できないのです…
御存じの方おられましたら,御教授願いたくお願い申し上げます.
なお,コードや疑似コード的なものを示していただける場合,C,C++ な記述を用いていただけると助かります.
画像(2次元配列的に値が並んでいるデータ)上の各位置(x,y)に関して,
その近傍 : 上下左右r[pixel]分,すなわち,(x,y)を中心とした 縦横共に r*2+1 サイズの領域
の最小値を求める(→その結果を別の画像の(x,y)に出力する)
最もシンプル(?)に書くと↓のような感じです.
//※画像バッファは入力出力共にW*H画素分用意されているものとする
const int W = 画像幅:
const int H = 画像高さ;
//画素アクセス
inline unsigned char &SRC(x,y){ return 入力画像データバッファの(x,y)の位置; }
inline unsigned char &DST(x,y){ return 出力画像データバッファの(x,y)の位置; }
//シンプルな実装
void MinFilter( int r )
{
r = (std::max)( abs( r ), 1 ); //※rは1以上の整数
for( int y=0; y<H; y++ )
{
const int top = (std::max)( y-r, 0 );
const int bottom = (std::min)( y+r, H-1 );
for( int x=0; x<W; x++ )
{
const int left = (std::max)( x-r, 0 );
const int right = (std::min)( x+r, W-1 );
//(left,top)-(right,bottom)矩形内の最小値を見つける
unsigned char MinVal = 255;
for( int yy=top; yy<=bottom; yy++ )
{
for( int xx=left; xx<=right; xx++ )
{
if( SRC(xx,yy) < MinVal )
{ MinVal = SRC(xx,yy); }
}
}
//結果格納
DST(x,y) = MinVal;
}
}
}
効率の良いアルゴリズムが知りたいのです.
一般的な処理だと思うので,何か定石的な方法があるのではないか?と思うのですが
検索が下手なのか,そういったものを発見できないのです…
御存じの方おられましたら,御教授願いたくお願い申し上げます.
なお,コードや疑似コード的なものを示していただける場合,C,C++ な記述を用いていただけると助かります.