C++で16ビット(符号なしの短い)配列の高速メディアンフィルタアルゴリズムを知っている人はいますか?C++の高速メディアフィルタ
この1つは非常に有望なようだが、それだけでバイト配列で動作するようです。誰でもショーツや代替アルゴリズムで動作するように修正する方法を知っていますか?
C++で16ビット(符号なしの短い)配列の高速メディアンフィルタアルゴリズムを知っている人はいますか?C++の高速メディアフィルタ
この1つは非常に有望なようだが、それだけでバイト配列で動作するようです。誰でもショーツや代替アルゴリズムで動作するように修正する方法を知っていますか?
Here(PDF)はCのためのものです。「高速メディアン検索:ANSI C実装」というタイトルの論文です。著者はそれがO(log(n))だと主張し、彼はまたいくつかのコードを提供します、多分それはあなたを助けるでしょう。あなたの提案したコードよりも優れているわけではありませんが、おそらく一見価値があります。
質問にリンクされた論文はO(1)であり、O(log n)より優れています。 –
しかし、これは多分もっとインパルスを与えるかもしれませんが、あなたは間違いなく正しいです。私は小さな編集をして、私の意図を明確にしました。 –
@ MarkRansom:O(1)は自動的にO(log(n))より優れているわけではありません。この場合、O(1)アルゴリズムはO(log(n))アルゴリズムよりもはるかに遅い(2ビットまたは4ビットのチャネル値以外の場合)。 O(1)紙はヒストグラムを用いて動作し、画素当りの実行時間を2^bに比例させる。ここで、bは8ビットの場合は256ビット、16ビットの場合は65536である。は定数なので、O(1))。これにより、チャネル値に追加するビット数が増えるにつれ、O(1)アルゴリズムが素早く低速になります。 – HelloGoodbye
この文書の手法は、8ビットピクセルチャネルの256ビンのヒストグラムを作成することに依存しています。チャネルあたり16ビットに変換するには、65536ビンのヒストグラムが必要で、ヒストグラムがイメージの各列に必要です。メモリ要件を256で膨らませることで、これは全体的に効率の低いアルゴリズムになりますが、今日のハードウェアではおそらく可能です。
ヒストグラムを粗いセクションと細かいセクションに分割する提案された最適化を使用すると、ランタイムヒットが16倍に減少するだけです。
小さな半径値の場合、従来のメディアンフィルタリングの方法がより効果的になると思います。
次の論文の式4および5を参照してください。複雑さはO(N * W)であり、Wはフィルタの幅であり、Nはサンプル数である。私はこの質問を知って
はやや古いですが、私はまた、メディアンフィルタリングで興味を持ちました。信号または画像で作業している場合は、処理ウィンドウのデータの重なりが大きくなります。これを利用することができます。
私はここにいくつかのベンチマークのコードを掲載しました:1D moving median filtering in C++
それが最もPODデータ型で動作するはずですので、それは、テンプレートベースです。
私の結果によると、毎回値のウィンドウをソートする必要があるため、std::nth_element
は、動きのあるメディアンのパフォーマンスがあまり良くありません。
ただし、ソートされた値のプールを使用すると、3つの操作で中央値を実行できます。
中央値はプール内の中間値になりました。
誰かがこの興味深いことを見つけて、アイデアを寄せてくれることを願っています!
この記事では、Rフィルタ半径であり、任意のデータ型のために働く画素あたりの時間、(その8ビット整数またはである(Rログ)Oで実行される画像のメディアンフィルタリングのための方法を記載していますダブルス):あなたはSTDを
てみました:: nth_element?それはクイックソートのO(n log n)と比較してO(n)です。 – smocking
ピクセル単位の実行時間が2^nに比例するので、このアルゴリズムを短くするにはこのアルゴリズムを変更しないでください.nは使用されるデータ型のビット数です。 8ビット・アレイの場合は256が十分に苦労しているので、16ビット・アレイの場合は65536に移動したくありません。 O(1)の代わりにピクセルあたりO(log r)であっても、より高速なアルゴリズムについては私の答えを見てください。 – HelloGoodbye
メジアンフィルタリングをしたくない場合(各ピクセルごとに1つのメジアンを見つけ、ただ1つのメジアンを探したい場合など)、@ smockingのコメントは関係します。 – HelloGoodbye