問題タブ [convolution]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 高速畳み込みアルゴリズム
2つの1次元信号を畳み込む必要があります。1つは平均500ポイント(これはハニングウィンドウ関数です)、もう1つは125000です。1回の実行で、3回の畳み込み演算を適用する必要があります。私はすでにscipyのドキュメントに基づいて実行されている実装を持っています。必要に応じて、ここでコードを確認できます(Delphiコードを先に):
問題は、この実装が遅すぎることです。全体の手順は約5分かかります。それを計算するより速い方法を見つけることができるかどうか疑問に思いました。
optimization - 高速な 2D 畳み込みの実装?
2D 畳み込み用の CUDA プログラムを作成しましたが、それを CUDA 以外の実装と比較して、スピードアップを測定したいと考えています。
古典的な複数ループ アプローチまたは matlab の conv2 を使用してプレーンな C での自分の実装と比較することはできますが、それらは最速の実装ではないため、正当/公正な比較のようには感じられません。
また、OpenCV を試してみることを考えていましたが、SIMD に最適化されたバージョンを探していましたが、うまくいきませんでした。OpenCVを使用する必要がありますか?
注:これを含む他の質問を読みましたが、答えは基本的に私のプレーンなCコードまたは利用可能なさまざまな方法の議論と同じです。
matlab - Matlabで画像フィルターのバンクを適用する
Matlabのフィルターバンクを使用して画像をフィルター処理する必要があります。私の最初の試みは、単純なforループを使用して、バンク内の各フィルターに対して「imfilter」関数を繰り返し呼び出すことでした。
アプリケーションではこのプロセスを何度も繰り返す必要があるため、できるだけ効率的にするためにこの手順を実行する必要があります。したがって、この操作をベクトル化してプロセスを高速化する方法はないかと思いました。物事を単純化するために、私のフィルターカーネルはすべて同じサイズ(9x9)です。
私が目指していることの例として、私のフィルターは9x9x32要素ブロックに設定されています。これは私の画像に適用する必要があります。画像をブロック(100x100x32など)に複製することを考えましたが、ループに頼らずに畳み込みなどの操作を適用する方法があるかどうかはわかりません。この問題に取り組む良い方法について誰かが提案を持っていますか?
statistics - 2 つのヒストグラムの畳み込みを求める
2 つの確率変数 x と y の合計の確率分布は、個々の分布の畳み込みによって与えられます。これを数値化するのに苦労しています。次の例では、x と y が均一に分布しており、それぞれの分布がヒストグラムとして近似されています。私の推論では、ヒストグラムを畳み込んで x+y の分布を得る必要があります。
これにより、次のようになります。
つまり、予想どおりの三角分布です。ただし、x 値を見つける方法がわかりません。誰かがここで私を訂正していただければ幸いです。
matlab - 画像でのロバーツ演算子の使用
このアルゴリズムは、Roberts 演算子を画像に適用し、結果を新しいファイルに保存するためのものです。
代わりに、このコードは入力とまったく同じ画像を出力します。
私は Matlab を初めて使用するので、私のコードに関するヒントやフィードバックを歓迎します。
この目的のために組み込み関数があることを知っています。私はこれを演習として行っています。
編集 - 私も別の質問があります - この例では、x = Img(x,y) と言った場合、行 x、列 y のピクセル、または行 y、列 x のピクセルを取得しますか?
python - Numpy/Scipyでの畳み込み計算
私が行っているいくつかの計算作業をプロファイリングすると、私のプログラムの1つのボトルネックは、基本的にこれを実行する関数であることがわかりました(np
is numpy
、sp
is scipy
):
両方の信号の形状(C, N)
はC
、データセットの数(通常は20未満)とN
各セットのサンプル数(約5000)です。各セット(行)の計算は、他のセットから完全に独立しています。
これは単なる畳み込みであると考えたので、次のように置き換えようとしました。
...同じ結果が得られたかどうかを確認するためだけに。しかし、私はしませんでした、そして私の質問は次のとおりです:
- なぜだめですか?
- に相当するものを計算するためのより良い方法はあり
mix1()
ますか?
(mix2
おそらく、そのままでは高速ではなかったと思いますが、並列化の開始点としては適切だったかもしれません。)
これをすばやく確認するために使用した完全なスクリプトは次のとおりです。
image-processing - FFTコンボリューション-カーネルの適用方法
私は画像処理にかなり慣れていませんが、FFT畳み込みにより、カーネルサイズが大きい場合に畳み込みが大幅に高速化されることがわかりました。
私の質問は、kissFFTを使用しているときに、周波数空間の画像にカーネルを適用するにはどうすればよいですか?
私はすでに次のことをしました:
画像にRGB値を再度設定すると、元の画像が元に戻ります。したがって、変換は機能します。9x9ボックスブラー(1 / 9、1 / 9、... 1/9)などのカーネルを適用する場合は、今何をすべきですか。
高速畳み込みについていくつか読んだことがありますが、FFTの実装によって、それらはすべて異なります。フィルタを適用する前に注意しなければならないことの一種の「リスト」はありますか?
私の考え方:
imagesizeは2の累乗でなければなりません。画像と同じサイズのカーネルを作成する必要があります。9つの中間値を1/9に、残りを0に設定してから、このカーネルを周波数領域に変換し、ソースイメージにそれを乗算してから、ソースイメージを元に戻します。しかし、それは実際には機能しません:DD
c++ - FFTの質問を含むガウスぼかし
通常の畳み込みを使用したガウスぼかしの現在の実装があります。小さなカーネルには十分効率的ですが、カーネルのサイズが少し大きくなると、パフォーマンスが低下します。そこで、FFTを使って畳み込みを実装することを考えています。FFT関連の画像処理の経験がないので、いくつか質問があります。
2D FFTベースの畳み込みも2つの1D畳み込みに分離できますか?
- trueの場合、次のようになりますか?すべての行で1D FFT、次にすべての列で1D FFT、次に2Dカーネルで乗算し、次にすべての列の逆変換とすべての行の逆変換を行いますか?または、各1D FFT変換の後に1Dカーネルで乗算する必要がありますか?
これで、カーネルサイズは画像と同じサイズ(1Dの場合は行)である必要があることがわかりました。しかし、それはエッジにどのように影響しますか?画像の端をゼロで埋める必要がありますか?もしそうなら、カーネルサイズはパディングの前後の画像サイズと等しくなければなりませんか?
また、これはC ++プロジェクトであり、商用プロジェクトであるため、kissFFTを使用する予定です。より良い代替案を提案することを歓迎します。ありがとうございました。
編集:回答ありがとうございますが、もう少し質問があります。
入力画像の虚数部がすべてゼロになることがわかります。しかし、出力の虚数部もゼロになりますか?ガウスカーネルを実数部と虚数部の両方に乗算する必要がありますか?
同じ画像のインスタンスが異なるスケールでぼやけています。つまり、同じ画像が異なるサイズにスケーリングされ、異なるカーネルサイズでぼやけています。画像を拡大縮小するたびにFFTを実行する必要がありますか、それとも同じFFTを使用できますか?
最後に、FFTを視覚化する場合は、ログフィルターをFFTに適用する必要があることを理解しています。しかし、FFTを視覚化するためにどの部分を使用すべきか本当に迷っていますか?実数部または虚数部。
また、512x512のサイズの画像の場合、実数部と虚数部のサイズはどうなりますか。それらは同じ長さになりますか?
詳細な返信ありがとうございます。
image-processing - FFT 畳み込み - 非常に低い PSNR
画像 (512*512) を FFT フィルター (kernelsize=10) で畳み込みます。見栄えがします。
しかし、それを通常の方法で畳み込んだ画像と比較すると、結果は恐ろしいものでした.
PSNR は約 35 です。
67,187/262,144 ピクセル値に 1 以上の差があります (ピーク ~8) (最大ピクセル値は 255)。
私の質問は、周波数空間で畳み込むときは正常ですか、それとも畳み込み/変換機能に問題があるのでしょうか? . 奇妙なことに、データ型として double を使用すると、より良い結果が得られるはずです。しかし、それは完全に同じままです。
画像を周波数空間に変換するときは、たたみ込みを行わずに元に戻してください。float を使用すると、PSNR は約 140 になります。
また、ピクセルの違いはわずか 1 ~ 10 であるため、スケーリング エラーを除外できると思います。
編集:退屈な興味のある人のための詳細
私はオープンソースのkissFFTライブラリを使用しています。実際の 2 次元入力あり (kiss_fftndr.h)
私の画像データ型は PixelMatrix です。0.0 から 1.0 float までのアルファ、赤、緑、青の値を持つ単純なマトリックス
私のカーネルも PixelMatrix です。
Convolution 関数の抜粋
使用されるデータ型:
FFT の構成:
カーネルのパディングと変換:
色を配列に取得する:
畳み込み:
今あるもの:
- タイプ Kiss_fft_cpx* からの 3 つの変換されたカラー配列
- タイプ Kiss_fft_cpx から変換された 1 つのカーネル配列*
どちらも複雑な配列です
畳み込みが来ます:
今、私はそれらを元に戻します:
ノート:
- 画像のサイズが 2 のべき乗 (256*256)、(512*512) などであることは事前に確認しています。
例:
カーネルサイズ: 10
入力:
出力:
通常の畳み込みからの出力:
私のコンソールは言う:
私の目には同じように見えますが°.°
1 人は退屈してコードを調べているかもしれません。緊急ではありませんが、私が一体何を間違えたのか知りたいだけです^^
最後になりましたが、私の PSNR 機能ですが、それが問題だとは思いません :D
python - PythonThreadPoolでイニシャライザーを使用する方法
多数の2D畳み込みを同時に計算するために、PyFFTWを使用してねじ山畳み込みを実行しようとしています。(GILはNumpy操作用にリリースされているため、個別のプロセスは必要ありません)。これを行うための標準的なモデルは次のとおりです。http: //code.activestate.com/recipes/577187-python-thread-pool/
(Py)FFTWはプランを再利用するのでとても速いです。これらは、次のようなアクセス違反エラーを回避するために、スレッドごとに個別に設定する必要があります。
このようにして、Workerクラスのrunメソッド内の実際のコンボルバーに引数、、、、、を渡すことがself.inputa
できます。self.outputa
self.fft
self.inputb
self.outputb
self.ifft
これはすべて素晴らしいですが、ThreadPoolクラスをインポートすることもできます。
しかし、同じ結果を得るには、ThreadPoolでイニシャライザーをどのように定義する必要がありますか?ドキュメントhttp://docs.python.org/library/multiprocessing.htmlによると、 「各ワーカープロセスは、起動時にinitializer(* initargs)を呼び出します」。これはPythonソースコードで簡単に確認できます。
ただし、たとえば2つのスレッドを使用してスレッドプールを設定する場合は、次のようになります。
そして、おそらくいくつかのループでそれを実行します
初期化子によってコンボルバーをセットアップするにはどうすればよいですか?畳み込みごとにFFTWプランを再計算せずに、スレッドごとに個別のFFTWプランを使用するにはどうすればよいですか?
乾杯、アレックス。