6

C ++の16ビット(符号なし短)配列の高速メディアンフィルタアルゴリズムを知っている人はいますか?

http://nomis80.org/ctmf.html

これは非常に有望に思えますが、バイト配列でしか機能しないようです。ショートパンツまたは代替アルゴリズムで動作するように変更する方法を知っている人はいますか?

4

6 に答える 6

4

この論文の手法は、8 ビット ピクセル チャネルの 256 個のビンでヒストグラムを作成することに依存しています。チャネルあたり 16 ビットに変換するには、65536 個のビンを持つヒストグラムが必要であり、画像の列ごとにヒストグラムが必要です。メモリ要件を 256 倍にすると、全体的に効率の悪いアルゴリズムになりますが、現在のハードウェアでもおそらく実行可能です。

ヒストグラムを粗いセクションと細かいセクションに分割する提案された最適化を使用すると、ランタイム ヒットがさらに 16 倍に減少するはずです。

半径の値が小さい場合、メディアン フィルタリングの従来の方法の方がパフォーマンスが高いことがわかると思います。

于 2012-04-26T18:24:18.553 に答える
3

高速メディアン検索 - ANSI C 実装(PDF) は C 向けのもので、「高速メディアン検索: ANSI C 実装」というタイトルの論文です。著者はそれが O(log(n)) であると主張しています。彼はいくつかのコードも提供しています。提案されたコードよりも優れているわけではありませんが、一見の価値があるかもしれません。

于 2012-04-26T18:05:30.623 に答える
2
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)) で実行され、入力は変更されません。

于 2021-01-06T16:14:32.610 に答える
1

この記事では、1 ピクセルあたりO(log r ) 時間で実行されるイメージのメディアン フィルタリングの方法について説明します。ここで、 rはフィルター半径であり、任意のデータ型 (8 ビット整数または double) で機能します。

高速メディアンおよびバイラテラル フィルタリング

于 2016-03-02T15:11:38.743 に答える
0

次の論文の式 4 と 5 を参照してください。複雑さは O(N*W) で、W はフィルターの幅、N はサンプル数です。

ベクトル メディアン フィルター処理によるノイズの削減 を参照してください。

于 2015-05-22T22:47:46.513 に答える
0

この質問はやや古いことは知っていますが、メディアンフィルタリングにも興味がありました。信号または画像を操作している場合、処理ウィンドウのデータが大きくオーバーラップします。これを利用することができます。

ここにいくつかのベンチマーク コードを投稿しました: C++ での 1D 移動メディアン フィルタリング

これはテンプレート ベースなので、ほとんどの POD データ型で動作するはずです。

私の結果によると、std::nth_element毎回値のウィンドウをソートする必要があるため、移動中央値のパフォーマンスが低下します。

ただし、ソートされた値のプールを使用すると、3 つの操作で中央値を実行できます。

  1. プールから最も古い値を削除します (std::lower_bound を呼び出します)
  2. 新しい値をプールに挿入します (std::lower_bound を呼び出します)
  3. 新しい値を履歴バッファに保存

中央値はプールの中間値になりました。

誰かがこれを面白いと思って、アイデアを提供してくれることを願っています!

于 2016-02-13T03:42:13.997 に答える