第08回 鮮鋭化

エッジ抽出の結果を元画像に重ね合わせることで、エッジを際立たせることができる。
(今回はやらないが) 平滑化と組み合わせることでぼやけたエッジを回復させることができる。

今回のプログラムの最終的な機能

プログラムを実行すると実行画面上に元画像をグレースケール化したものが表示される。
さらに実行画面上でクリックすると、dataフォルダに の6つの画像が作られる。
コンソールに「完了」が表示されてからキーボードの0~6のキーを押すとこれらの画像が画面に表示される。
(画像サイズが大きい場合は出力画像が作られるまでに時間がかかる)
(クリックだけですべての画像が作成されるので、キーボードを使うのは結果確認のためだけ)
キー画像
0元.jpg (グレースケール化した状態)
11ソーベル(エッジ).png
21ソーベル(鮮鋭).png
32ラプラシアン1(エッジ).png
42ラプラシアン1(鮮鋭).png
53ラプラシアン2(エッジ).png
63ラプラシアン2(鮮鋭).png

「1」キーで表示される画像はのX, Y方向のソーベルフィルタの出力結果を合成したもので、前回の課題3の結果と同じ。
「3」キーで表示される画像は元ピクセルと上下左右の明るさの差を取り出すタイプのラプラシアンフィルタの出力結果。
「5」キーで表示される画像は元ピクセルと周辺8個の明るさの差を取り出すタイプのラプラシアンフィルタの出力結果。
「2」「4」「6」は「1」「2」「3」の結果とグレースケール化した元画像を合成したもの。元画像のエッジを強調したような画像になる。

ソーベルフィルタによる鮮鋭化

概要

エッジ抽出で取り出された画像と元画像の各ピクセル明るさを単純に足し合わせることで、エッジを強調したような画像が得られる。
ここでは、前回の結果のうち最も鮮明にエッジを取り出せた「X, Y方向のソーベルフィルタの合成結果」と元画像を重ねてみる。

課題 1

前回の完成状態のプログラムをベースとして今回のプログラムを作成する。
  1. Processingのエディタを起動し、前回の完成状態のプログラムのコードをコピー&ペーストする。
  2. 「img08」という名前で保存する。
  3. 適当に画像検索してサンプル用の画像を用意し、「元.jpg」という名前で保存する (著作権的な理由で説明用画像は建物になっているが、エッジが強調されたことが確認できるように、コントラストが低くてぼんやりした胸部レントゲン写真のようなものがよい)。
  4. 「元.jpg」をProcessingのエディタにドラッグ&ドロップする。
  5. プログラム先頭部分の出力ファイル名にかかわる部分を以下のように書き換える (質の悪い日本語入力機能ではラプラシアンがラ「ブ」ラシアンになってしまうことがあるので、直接入力よりもコピー&ペーストがよい)。
  6. String[] fName = {"1プレウィットX", "1プレウィットY", "2ソーベルX", "2ソーベルY", "3プレウィット", "3ソーベル"};
    String[] fName = {"1ソーベル(エッジ)", "1ソーベル(鮮鋭)", "2ラプラシアン1(エッジ)", "2ラプラシアン1(鮮鋭)", "3ラプラシアン(エッジ)", "3ラプラシアン(鮮鋭)"};

  7. extractEdge関数の青い囲みの部分を削除し、赤い囲みの部分のコードをそこに移動させる。


  8. 「if (type<=4) {」を「if (type<=2) {」に変更する。
  9. fx, fyの値を入れる行のgetFilteredBrightness関数の第3引数をそれぞれ1, 2に変更する (「(type-5)*2+」を削除する)。
  10. getFilteredBrightness関数の上の3行のコメント文を削除し、以下のものに置き換える。
  11. // ソーベルフィルタ、ラプラシアンフィルタでの出力画像の(x, y)のピクセルの色を返す
    // typeの値とフィルタの対応 (1:ソーベルX, 2:ソーベルY, 3:ラプラシアン1, 4:ラプラシアン2)
    

  12. getFilteredBrightness関数からプレウィットフィルタにかかわる部分 (赤い囲み) を削除する。


  13. 実行して画面をクリックする。
  14. (「完了」が表示されたあとでキーボードの1キーを押すと、X, Y方向のソーベルフィルタの結果を合成したもの (前回の課題3と同じ結果) が表示される)


  15. getFilteredBrightness関数の2重ループの中の処理の最後に以下のコードを追加する。
  16. (入れる場所に注意。「}」の数を確認する)


  17. 実行して画面をクリックする。
  18. (「完了」が表示されたあとでキーボードの2キーを押すと、元画像とさっきの結果を合成したものが表示される)

ラプラシアンフィルタによる鮮鋭化 (1)

概要

前回見たプレウィットフィルタ、ソーベルフィルタは、X, Y方向のフィルタで取り出せるエッジの方向が限られていて、全方向のエッジを取り出すには合成の手間が必要だった。
ラプラシアンフィルタでは、1回の処理で全方向のエッジを取り出せる。これにはいくつか種類があるが、ここでは参照ピクセルに上下左右に隣接するピクセルとの明るさの差を取り出す方法を試す。

このフィルタのマスクは以下の通り。
010
1-41
010
(明るさが一定のところでは、これと元画像の明るさの積を足しあげれば0になる。明るさに傾斜があるところで非0の値をとる。前回と同様に、これの絶対値を明るさとする画像を作ればエッジが取り出せる)

課題 2

  1. getFilteredBrightness関数のmask配列に赤枠のものを追加する。
  2. (maskは2重配列で、その中の0, 1番目の要素がさっき課題1で使ったもの。ここで2, 3番目を追加し、課題2と課題3で使用する)


  3. 「概要」を参考に、追加したもののうち上の波カッコの中にラプラシアンフィルタのマスクの値を入れる。
  4. 追加したもののうち下の波カッコの中にコンマで区切った適当な9個の値を入れる。
  5. (これは課題3で使用するので、現時点では値はなんでもよい)
  6. extractEdge関数に赤枠のものを追加する。
  7. (elseの後の波カッコの中の処理は、typeが3以上のときに実行される)
    (課題2に対応するのはtypeが3, 4、課題3に対応するのはtypeが5, 6のとき)
    (typeが3, 4のときはどちらもgetFilteredBrightness関数の第3引数に3を渡したい)
    (typeが5, 6のときはどちらもgetFilteredBrightness関数の第3引数に4を渡したい)
    (第3引数をtypeの式でこう書くことでそれが実現される)


  8. 実行して画面をクリックする。
  9. (「完了」が表示されたあとでキーボードの3キーを押すと、ラプラシアンフィルタでエッジ抽出したものが表示される)
    (キーボードの4キーを押すと、元画像とその結果を合成したものが表示される)
  10. この段階でdataフォルダの出力画像のうち「2ラプラシアン1(エッジ).png」「2ラプラシアン1(鮮鋭).png」も然るべきものになる。
  11. うまくいかない場合は、最終的なextractEdge関数この時点のgetFilteredBrightness関数とコードを見比べる。

ラプラシアンフィルタによる鮮鋭化 (2)

概要

参照ピクセルの上下左右だけでなく斜めに隣接するピクセルも考慮するタイプのラプラシアンフィルタのマスクは以下の通り。
111
1-81
111
これも先ほどと同様に明度が一定のエリア中のピクセルについてマスクと明度の積を足しあげると0になり、明度勾配があるところで非0の値になる。課題2で見たものよりも斜めのエッジが鮮明に取り出される。

課題 3

  1. getFilteredBrightness関数のmask配列で、課題2のときに適当な値を入れたところに、上記のマスクに相当する値を入れて実行する。
  2. (「完了」が表示されたあとでキーボードの5キーを押すと、このタイプのラプラシアンフィルタでエッジ抽出したものが表示される)
    (キーボードの6キーを押すと、元画像とその結果を合成したものが表示される)

  3. 「3」「5」キーを交互に押すと、5キーで表示される結果の方が明るい線になっているはず。
  4. この時点で「3ラプラシアン2(エッジ).png」「3ラプラシアン2(鮮鋭).png」も然るべき状態になる。
  5. うまくいかない場合は、最終的なgetFilteredBrightness関数とコードを見比べる。

提出

小テスト予告

次回の授業の初めに今回の内容についての小テストを行う。

戻る

inserted by FC2 system