最近octaveとPythonで画像処理をすることが多いので、簡単にまとめてみました。
octaveでガウシアンフィルター
octaveを使うと簡単に画像処理ができます。
これだけの記述で画像を読み込んで、フィルターをかけた画像を出力できます。
im = imread('rect.bmp') im = im * 1.0; f = fspecial('gaussian', 3, 1); om = imfilter( im, f, "replicate" ); imwrite(om,"rect2.bmp");
octaveでおもしろいのが、fspecial('gaussian', 3, 1);という関数で、ガウシアンフィルターを作っているのですが、これがただの行列であるところです。ですのでfspecialを使用してフィルターを作らなくても、自分自身でフィルターを書くことができます。
im = imread('rect.bmp'); im = im * 1.0; f = [1,2,1;2,4,2;1,2,1]/16.0 om = imfilter( im, f, "replicate" ); imwrite(om,"rect3.bmp");
この例では、fspecialの替わりに自分で行列を定義しています。行列がデータでもあり、処理の内容でもあります。
Pythonでガウシアンフィルター
PythonではPILを使うと同じようなことが出来ます。numpy、scipyでもimreadやimsaveは使えるのですが、すぐに行き詰まるので素直にPILを使いましょう。
import ImageFilter from PIL import Image from numpy import * im = Image.open('rect.bmp') # size 3x3 # scale default f = ImageFilter.Kernel((3,3), (1, 2, 1, 2, 4, 2, 1, 2, 1)) im_gaussian = im.filter(f) im_gaussian.save('rect4.bmp')
PILでは、デフォルトのフィルターがいくつか用意されています。自分でフィルターを作りたいときは、 ImageFilter.Kernelを使えば、octaveと同じようなことができます。
class Gaussian(ImageFilter.BuiltinFilter): name = "Gaussian" filterargs = (3, 3), 16, 0, (1, 2, 1, 2, 4, 2, 1, 2, 1) im_gaussian2 = im.filter(Gaussian) im_gaussian2.save('rect5.bmp')
組み込みのフィルターを継承して、自分のフィルターを定義することもできます。filterargsに入っている値は、左から、フィルターのサイズ、スケール(計算後に割る値)、オフセット(計算結果に加算ができます)、そしてフィルターの係数です。ImageFilter.pyのソースを見てみると、組み込み型のフィルターがどのように定義されているかを、知ることができます。