C ++の16ビット(符号なし短)配列の高速メディアンフィルタアルゴリズムを知っている人はいますか?
これは非常に有望に思えますが、バイト配列でしか機能しないようです。ショートパンツまたは代替アルゴリズムで動作するように変更する方法を知っている人はいますか?
C ++の16ビット(符号なし短)配列の高速メディアンフィルタアルゴリズムを知っている人はいますか?
これは非常に有望に思えますが、バイト配列でしか機能しないようです。ショートパンツまたは代替アルゴリズムで動作するように変更する方法を知っている人はいますか?
この論文の手法は、8 ビット ピクセル チャネルの 256 個のビンでヒストグラムを作成することに依存しています。チャネルあたり 16 ビットに変換するには、65536 個のビンを持つヒストグラムが必要であり、画像の列ごとにヒストグラムが必要です。メモリ要件を 256 倍にすると、全体的に効率の悪いアルゴリズムになりますが、現在のハードウェアでもおそらく実行可能です。
ヒストグラムを粗いセクションと細かいセクションに分割する提案された最適化を使用すると、ランタイム ヒットがさらに 16 倍に減少するはずです。
半径の値が小さい場合、メディアン フィルタリングの従来の方法の方がパフォーマンスが高いことがわかると思います。
高速メディアン検索 - ANSI C 実装(PDF) は C 向けのもので、「高速メディアン検索: ANSI C 実装」というタイトルの論文です。著者はそれが O(log(n)) であると主張しています。彼はいくつかのコードも提供しています。提案されたコードよりも優れているわけではありませんが、一見の価値があるかもしれません。
std::vector<unsigned short> v{4, 2, 5, 1, 3};
std::vector<unsigned short> h(v.size()/2+1);
std::partial_sort_copy(v.begin(), v.end(), h.begin(), h.end());
int median = h.back();
O(N·log(N/2+1)) で実行され、入力は変更されません。
この記事では、1 ピクセルあたりO(log r ) 時間で実行されるイメージのメディアン フィルタリングの方法について説明します。ここで、 rはフィルター半径であり、任意のデータ型 (8 ビット整数または double) で機能します。
次の論文の式 4 と 5 を参照してください。複雑さは O(N*W) で、W はフィルターの幅、N はサンプル数です。
ベクトル メディアン フィルター処理によるノイズの削減 を参照してください。
この質問はやや古いことは知っていますが、メディアンフィルタリングにも興味がありました。信号または画像を操作している場合、処理ウィンドウのデータが大きくオーバーラップします。これを利用することができます。
ここにいくつかのベンチマーク コードを投稿しました: C++ での 1D 移動メディアン フィルタリング
これはテンプレート ベースなので、ほとんどの POD データ型で動作するはずです。
私の結果によると、std::nth_element
毎回値のウィンドウをソートする必要があるため、移動中央値のパフォーマンスが低下します。
ただし、ソートされた値のプールを使用すると、3 つの操作で中央値を実行できます。
中央値はプールの中間値になりました。
誰かがこれを面白いと思って、アイデアを提供してくれることを願っています!