第3回CADセミナー@岐阜 演習4/空間領域でのフィルタ

次は,空間領域でのフィルタリングを取り扱います.
空間領域では,画像への畳み込み演算という手法でいくつかのフィルタ処理が可能になります.

ここでは,その代表的なフィルタを2つ取り扱い,また,それらフィルタ処理と組み合わせることによって 実現できるアンシャープマスクフィルタを作成します.
おおよそ,以下の3つの演習からなります.

以上を行うプログラムを作成し,処理結果の8ビット画像を得ることを目的とします. 表示系のプログラムは扱わず,前の演習同様,変換処理後に画像表示プログラムで表示します.

なお,コンパイルするためには,Makefileがすべて用意してありますので,makeを入力するだけで可能です.


3×3の平滑化フィルタ

おおよその流れは一緒です.畳み込みの演算による平滑化を実現する関数に, convolve_smooth(...)
として,用意しました.これは,convolve.cの中にあります.
ファイルを分けて関数を書くことも,前の演習と同じです.

main.cはこちら
convolve.cはこちら
Makefileはこちらただし,コピーして使っても動きません.タブ,スペースが区別されるからです.


3×3のラプラシアン(2階微分フィルタ)と原画像に加算して画像をシャープに

基本的な流れは,前と同じです.
変更点は,convolve_smoothをconvolve_laplaceに変更し,畳み込む分布をラプラシアンに変更したことです.

そのためのプログラムは次のようになります.

main.cはこちら
convolve.cはこちら
Makefileはこちらただし,コピーして使っても動きません.タブ,スペースが区別されるからです.


3×3の平滑化フィルタを利用したアンシャープマスクフィルタ

アンシャープマスクは,画像の平滑化,画像の差分,画像の画素値への積算,画像の加算,というテクニックを すべて使います.アンシャープマスクを実現するプログラムができれば,初級は卒業でしょう.

ここでの方針としては,アンシャープマスクを実現する関数usmask_un_charを作り, この関数には,入力画像と出力画像の保存先,画像の幅,高さを指定して入力することにしました.
その他の必要なパラメタなどは,すべてこの関数の中で指定しています.

このように関数を作ると,他でも使い回しができるようになる可能性が高まります.

あとは,プログラムをごらんください.

main.cはこちら
convolve.cはこちら.平滑化を実現します.
unsharp_mask_un_char.cはこちら. アンシャープマスクを実現します.
Makefileはこちらただし,コピーして使っても動きません.タブ,スペースが区別されるからです.

ここでも,コンパイルにはMakefileを活用しましょう.


以上,画像の空間領域でのフィルタ処理例を示しました.まとめると, という演習を行いました.

そして,最後には,アンシャープマスク処理によって,すべての内容を網羅した画像処理を実現しました.

この演習で実現した平滑化処理などは,実は,空間周波数領域においても簡単に処理が可能になります.
具体的には,フーリエ変換後の空間周波数領域でのフィルタリングを実現し,フーリエ逆変換によって, そのスペクトルを再び空間領域の画像に戻してやることになります.

次の演習では,フーリエ変換面での処理例を扱ってみましょう.