< Return to index

fortranで​ラプラシアンフィルタを​書く

ラプラシアンフィルタ

ラプラシアンフィルタは画像の各画素に対して周囲 4 あるいは 8 領域との輝度値の差を求めるフィルタの一種である。

今回は周囲 8 近傍へのフィルタを使う。

--使うフィルタ--
+---+----+---+
| 1 | 1  | 1 |
+---+----+---+
| 1 | -8 | 1 |
+---+----+---+
| 1 | 1  | 1 |
+---+----+---+

実装されたフィルタは以下の通り。(gist のテストを兼ねて)

laplaplacian を作った。 それぞれ forall と三重ループの差異がある。 また、fortran は配列が高次元側から割り付けられるため、w, h, d の順で内側へ行くようにした。

速度比較

それぞれ以下のコードで速度を確かめる。

  1. lap
________________________________________________________
Executed in    2.20 secs   fish           external
   usr time    2.19 secs  963.00 micros    2.19 secs
   sys time    0.01 secs  259.00 micros    0.01 secs
  1. laplacian
________________________________________________________
Executed in    1.87 secs   fish           external
   usr time  1858.59 millis  669.00 micros  1857.92 millis
   sys time    6.84 millis  183.00 micros    6.66 millis

10 ミリ秒と 6 ミリ秒だが若干 for ループの方が早いみたい。 もしかしたら forall 内での変数順が d, h, w なのが悪いのかもしれない。 逆にして試してみる。

  1. lap(forall を逆順)
________________________________________________________
Executed in    2.51 secs   fish           external
   usr time    2.50 secs  581.00 micros    2.50 secs
   sys time    0.01 secs  174.00 micros    0.01 secs

何回か試したがミリ秒での表示にならなかった。(fish の time よくわからん) 多分 for の方が早いんだと思う。

編集を提案