この記事で扱っていること
- 画像をぼかす方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
以前別の記事で、画像にモザイクを入れる方法を紹介していました。
画像に対する加工として今回は画像に対してぼかしを入れる方法を紹介しています。
本来のぼかし処理とは異なる(?)かもしれませんが、実装としてはフィルタを用いて画像の平均化をカラー画像のRGBそれぞれに対して行いこれらを合成するというステップを踏んでいます。平均化の関数がグレー画像に対してしか行ないのでこのような仕組みとしました。
どんな結果になるか
フロントパネルには、加工前の画像と加工後の画像の表示器、カメラを指定する制御器と、ぼかしの度合いを決める数値制御器そしてプログラムの停止ボタンを用意しています。
プログラム実行後、ROIを指定することでROIの内側に対してぼかしを入れることができます。
プログラムの構造
プログラムの基本的な構造は、以前の画像にモザイクを入れる処理と同じようにしてみました。構造さえわかってしまえば、あとは中身の処理をモザイク処理ではなくぼかし処理にするだけです。
考えとしては、ROIで指定した領域を抽出してその部分の画像に対してぼかし処理を行い、処理後の画像を配列データにしたものを、元々の画像を配列データにしたものと対象領域だけ置換する、という方法をとっています。
ぼかし処理については以下の図でblur_calc.viとなっているサブVIで行っています。
このぼかし処理用のサブVIは自分で用意する必要があり、以下のような仕組みとしています。
IMAQ Convoluteを使用して平均化を行っていますが、その前にIMAQ ImageBorderSizeで枠の大きさを指定しています。
IMAQ Convoluteの関数に渡すKernel入力を用意するのは、専用の関数としてIMAQ BuildKernelという関数があるのですが、なぜか文字列でカーネルの中身を指定する必要があり使い勝手が悪いと思ったので配列初期化の関数で用意しました。
なお、ROIの外部に対してぼかしを入れたい場合には、画像モザイクの時同様に以下のような組み方でできます。
複数のROIに対して処理を適用する
今回のプログラムではROIをひとつにしていますが、Ctrlを押しながらドラッグすることで一つの画像に複数のROIを設定することができます。これら複数のROIに対して画像処理(今回のぼかしだけではなく、画像モザイクも含め)を行うこともできます。
やっていることとしては、上で紹介したプログラムのうちROIのプロパティノードで指標配列で抽出していた部分を、指標配列を使用せずにForループの自動指標付けにおきかえているだけです。
今回の記事では画像に対してぼかしを入れる方法を紹介しました。ぼかしの実装は恐らくもっと他の方法(アルゴリズム)もあるとは思いますが、今回の記事で紹介したものはそこまで多くの種類の関数を使用するわけではないため簡単に実装できる部類だと思いますので参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント