私はCudaのプロジェクトにノイズとぼかし機能を追加しようとしています.かなりの調査の後、私は少しつまずきのブロックにぶつかりました.Gaussian blur matrixを読みましたが、まだ取得に問題があります.画像の特定の部分をぼかすことができる作業コードの一部で、ノイズの形を表示することができました。ガウスまたはより単純なぼかしメソッドを実装する方法を説明するか、ぼかしを実装するコードを少し提供することで、誰かが少し助けてくれれば。よろしくお願いします!!
2 に答える
ガウスぼかしは分離可能なフィルターであるため、最初に 1D カーネルを ROI 内のすべての行に適用し、次にぼかした行の列に適用できます。
CUDA の注意が必要な部分は、これが近傍演算であるため、通常、必要な近傍ピクセルを共有メモリに取得するには、各ブロックをカーネル サイズの半分だけオーバーラップさせる必要があります。
参考までに、これらは 2 つの個別の質問であり、このサイトでは個別に質問する必要があります。
ぼかしに関して - 大きなぼかしカーネル (強いぼかし) の場合、最善の方法は、画像とガウス ノイズ カーネル画像で FFT を使用し、その結果の複素乗算と逆 FFT を使用して結果を乗算することです。FFT-Shift 関数を自分で実装する必要があり、カラー画像を使用している場合は、画像をチャンネルごとに別のバッファーに分割する必要があります。
小さなブラー カーネル (ジェントル ブラー) の場合、最も簡単な方法は、結果イメージの各ピクセルに対して、ソース イメージの近くのピクセルを合計することです (ガウス重み関数を使用)。
ノイズに関して - テストの最も簡単な方法は、事前に生成された疑似乱数ジェネレーターの結果画像を一様分布乱数から正規分布乱数に変換した後に CUDA にロードすることです。たとえば、この質問。
ランダム イメージ内の正しいサイズの領域にノイズ シグマを乗算し、ソース イメージに追加して結果を取得する必要があります。
前回確認したとき、CUDA 用のランダム バッファ生成ソリューションはありませんでしたが、それは数年前のことです。
更新: CUDA にcuRandが追加されたので、事前に生成されたランダム バッファーを使用する代わりに、乱数を生成できるはずです。