- ベストアンサー
OpenCVでマスク処理で「ぼかし」は可能か?
- OpenCVを使用して画像処理を行う際に、部分的にもしくは強弱を付けて「ぼかし」をかける方法について教えてください。
- 具体的には、円形や上下に向けて「ぼかし」が強くなる方法が知りたいです。
- また、グラデーションで作成したマスク画像を利用して「ぼかし」の強弱を付ける方法があれば教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2の追記ですが、先ほどの疑似コードは、 OutputImage[i][j].R = (SourceImage[i][j].R * (255 - MaskImageBrightness[i][j]) + UniformFeatheredImage[i][j].R * (MaskImageBrightness[i][j])) / 255; OutputImage[i][j].G = (SourceImage[i][j].G * (255 - MaskImageBrightness[i][j]) + UniformFeatheredImage[i][j].G * (MaskImageBrightness[i][j])) / 255; OutputImage[i][j].B = (SourceImage[i][j].B * (255 - MaskImageBrightness[i][j]) + UniformFeatheredImage[i][j].B * (MaskImageBrightness[i][j])) / 255; のように最大輝度で除算する必要がありました。 重ね重ね失礼いたしました。
その他の回答 (2)
- sygh
- ベストアンサー率76% (42/55)
No.1の回答者ですが、「画面全体ではなく部分的にもしくは強弱を付けて」ということなので、No.1の方法だけでは一様なぼかし処理でしかないですね。申し訳ありません。 PhotoshopやGIMPで、マスク画像のチャンネルを8bppの選択範囲として読みこんで、選択範囲内にぼかしフィルタをかける処理と同じものでしょうか? だとすれば、下記のようなアルゴリズムが最も単純かと思われます。 1. 任意の強度で、まず画像全体に対して一様にぼかしをかける。 2. 元画像の各ピクセルと、一様ぼかし画像の各ピクセルを合成する際に、マスク画像の各ピクセルを重みとして利用する。 下記は入出力画像が同じサイズのRGBカラー画像、マスク画像が同じサイズの8bitグレースケール画像だと仮定した場合の疑似コードです。 OutputImage[i][j].R = SourceImage[i][j].R * (255 - MaskImageBrightness[i][j]) + UniformFeatheredImage[i][j].R * (MaskImageBrightness[i][j]); OutputImage[i][j].G = SourceImage[i][j].G * (255 - MaskImageBrightness[i][j]) + UniformFeatheredImage[i][j].G * (MaskImageBrightness[i][j]); OutputImage[i][j].B = SourceImage[i][j].B * (255 - MaskImageBrightness[i][j]) + UniformFeatheredImage[i][j].B * (MaskImageBrightness[i][j]); Photoshopなどではこんな単純なことはやっていなくて、もっと最適化された高速なアルゴリズムで実装されているのだと思いますが、僕にはせいぜいSSEなどを使うことくらいしか思いつきません。 こんな情報でも参考になるでしょうか?
- sygh
- ベストアンサー率76% (42/55)
下記サイトではOpenCVと3x3ガウス フィルタによるぼかし処理(+離散フーリエ変換による高速化)の実装例が紹介されていますが、このフィルタをお手持ちのマスク画像に置き換えるようにすれば良いのでは? カーネルの各レート(重み)を画像輝度から計算するわけですが、フィルタ画像輝度の総和を事前に求めて、各レートの総和が1となるように正規化する必要があります。 http://iphone.moo.jp/app/?p=955