今回は画像処理のまね事のようなものを行います.単純な画像にエッジ強調や平滑化などの処理を行うプログラムを作って,その効果を試してみましょう.
ただし,実際の画像を扱うのは大変なので,0 から 4 までの数値で5段階の画素の数値とし,それを文字の濃さで画面に表示するという単純なものにします.
次に示す5種類のCSV形式のデータを用意しました.
単純な2色画像 ひし形の画像 十字型の画像 細かいチェック柄の画像 粗いチェック柄の画像まずはこれらを読み込んで,画面に以下のように表示することにしましょう.その際に,以下のリストを用意して,文字を利用して画面に画像を表示させています.データのサイズは16×16です.
letters = ['.', '-', 'v', '*', 'W'] |
. . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W . . . . . . . . W W W W W W W W |
. . . . . . . W W . . . . . . . . . . . . . W W W W . . . . . . . . . . . W W . . W W . . . . . . . . . W W . . . . W W . . . . . . . W W . . . . . . W W . . . . . W W . . . . . . . . W W . . . W W . . . . . . . . . . W W . W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W . W W . . . . . . . . . . W W . . . W W . . . . . . . . W W . . . . . W W . . . . . . W W . . . . . . . W W . . . . W W . . . . . . . . . W W . . W W . . . . . . . . . . . W W W W . . . . . . . . . . . . . W W . . . . . . . |
. . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . . . . . . . W W W W . . . . . . |
||
2色 | ひし形 | 十字型 | ||
. W . . W . . W . . W . . W . . . W . . W . . W . . W . . W . . W W W W W W W W W W W W W W W W . W . . W . . W . . W . . W . . . W . . W . . W . . W . . W . . W W W W W W W W W W W W W W W W . W . . W . . W . . W . . W . . . W . . W . . W . . W . . W . . W W W W W W W W W W W W W W W W . W . . W . . W . . W . . W . . . W . . W . . W . . W . . W . . W W W W W W W W W W W W W W W W . W . . W . . W . . W . . W . . . W . . W . . W . . W . . W . . W W W W W W W W W W W W W W W W . W . . W . . W . . W . . W . . |
. . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . W W W W W W W W W W W W W W W W . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . W W W W W W W W W W W W W W W W . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . W W W W W W W W W W W W W W W W . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . . . W . W W W W W W W W W W W W W W W W . . W . . . W . . . W . . . W . |
|||
細かいチェック柄 | 粗いチェック柄 |
データを読み込む際に input 関数を使用して,一つのプログラムでどれでも呼び出せるようにしておくと便利です.
フィルターはこちらで3種類用意しました.縦線を強調するエッジフィルターと,横線を強調するエッジフィルター,そして全体をぼかす平滑化フィルターです.それらは以下の行列で表現されます.
0 0 0 0.5 -1 0.5 0 0 0 |
0 0.5 0 0 -1 0 0 0.5 0 |
0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 |
縦線強調 | 横線強調 | 平滑化 |
処理としては,データの行列の左上の3×3のセルとフィルターの3×3のセルの対応する値をそれぞれ掛けて足し合わせたものの絶対値を取り,さらにそれを四捨五入して整数値に丸めます.math モジュールにある abs 関数と round 関数を使用すれば簡単です.
元のデータが16×16で,それに3×3を適用すると,左上から始めると右に14ずらしたところでデータがなくなります.また,下にずらしていくときも14回ずらすとデータの最後に来ます.そのため,結果の画像は14×14というサイズとなっています.
5種類のデータに3種類のフィルターを適用してその結果を確認してみましょう.例えば,十字に縦線協調を行うと,以下のような結果になります.
. . . . v v . . v v . . . . . . . . v v . . v v . . . . . . . . v v . . v v . . . . . . . . v v . . v v . . . . . . . . v v . . v v . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v v . . v v . . . . . . . . v v . . v v . . . . . . . . v v . . v v . . . . . . . . v v . . v v . . . . . . . . v v . . v v . . . . |