julia - BMP の読み書き2015年06月05日 17:36

Images のパッケージが大幅に変更されました。
imread(), imwrite() は、それぞれ load(), save() に変わりました。
機会があれば対応したものを執筆しますが、混乱を避けるため、とりあえず消しておきます。(2015/12/19)

画像処理をするために、BMPファイルの読み書きをやってみた。
Pkg.add("Images") でパッケージを追加。
入出力には ImageMagick を使用しているらしい。
以下、ちょっとしたコード。
# Images パッケージを使用する宣言
using Images
# sample.bmp を読み込む
img1= imread("sample.bmp")
# 白黒画像に変換
img1= convert(Image{Gray}, img1)
# sobel filter の係数を取得。2つの行列を返してくる
sobelX, sobelY= sobel()
# X方向の sobel filter を適用
img1= imfilter(img1, sobelX)
# 結果をファイルに書き込む
imwrite(colorim(img1), "edgeX.bmp")

RGB Image 構造体
img1= imread("sample.bmp")
評価値
RGB Image with:
  data: 1280x720 Array{RGB{UfixedBase{Uint8,8}},2}
  properties:
    IMcs: sRGB
    spatialorder:  x y
    pixelspacing:  1 1
ピクセルデータには、img1.data[100,100].r のようにしてアクセスできる。
ちなみに、data は省略できて、img1[100,100].r でも同じ。
ただし、img1[:,:].r のように範囲指定はできない。
構造体の properties は、img1["IMcs"] のように指定する。

RGB それぞれを行列として扱いたい場合には、red(), green(), blue() という関数で分離できる
imgR= red  (img1)
imgG= green(img1)
imgB= blue (img1)
これで imgR,imgG,imgB は、行列となるので、普通に計算などができる。
imread で読み込んだ場合、この行列は、各画素 0 から 1 の値となる。
255 を掛けると元の BMP のピクセル値に一致する。


Image 構造体を作る

行列から Image 構造体を作るには、grayim(),colorim()関数を使う。
grayim() は、m x n の行列からグレースケールの Gray Image 構造体を作る。
colorim() は、3 x m x n の行列が必要。RGB から直接変換する方法は不明。
とりあえず、この大きさの行列を作って、RGB 値を代入すれば使える。


まとめ
using Images

# sample.bmp 読み出し
img1= imread("sample.bmp")
# RGB に分離
imgR= red  (img1)
imgG= green(img1)
imgB= blue (img1)
# Gray を作ってみる
imgW= imgR * 0.29 + imgG * 0.60 + imgB * 0.11
imwrite(grayim(imgW), "gray.bmp")
# RGB Image 構造体に戻す
imgRGB= zeros(3, size(imgR,1), size(imgR,2))
imgRGB[1,:,:]= imgR
imgRGB[2,:,:]= imgG
imgRGB[3,:,:]= imgB
imwrite(colorim(imgRGB), "rgb.bmp")