ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

octaveとPythonで簡単に画像処理を行う。

最近octavePythonで画像処理をすることが多いので、簡単にまとめてみました。

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のソースを見てみると、組み込み型のフィルターがどのように定義されているかを、知ることができます。