>> Rによる画像処理プログラミング入門:目次

imagerパッケージの使い方

imagerとは

imager は R で画像処理プログラミングをするためのパッケージです。画像のリサイズや回転、線画の抽出、モルフォロジー変換、空間フィルタリング、FFT、色空間の変換など、画像処理のための基本的な機能を備えています。R で画像処理をやりたい場合に手軽に使い始めることができて便利なパッケージです。他方で、特徴点の抽出やマッチング、物体検出のための機能など、コンピュータビジョンで典型的に使われるような機能は持っていないので、そのような用途には向かないと思います。

R の画像処理パッケージとしては他にも EBImagemagick などがあります。どれも機能的には大差はないようです。全て使ってみた結果、imager が最も使いやすそうで、ドキュメントも充実しており、作者のセンスも良さそうだったので、私は imager を使うことにしました。また OpenCV の R ラッパーも開発している人がいるようですが、まだあまり開発が進んでいないようなので選択肢からは外れました。

インストール

コンソールに以下を打ってインストールします。

Mac ユーザーは XQuartz: https://www.xquartz.org をさらにインストールする必要があるようです。

情報源

公式サイトに情報が集まっています。最初に読むとすればこれこれでしょうか。関数のリストはここで見れます。本ブログ記事でも初めて imager を使い始める人向けに解説を書いています。

画像の読み込みと表示

imager をインストールしたらまずは画像の読み込みと表示をしてみましょう。
(以下の解説は RStudio 環境で実行確認をしているので、別の環境だと表示のされ方などで多少の違いがあるかもしれません)

myimage.png という画像ファイルを読み込んでそれを表示させる例です。
読み込めるファイル形式は JPEG, PNG, BMP に対応しています。もし他の画像形式に対応したい場合は ImageMagick を、動画ファイルを読み込みたい場合は ffmpeg をインストールします。

imagerには boats という予約変数があり、ボートの画像が予め用意されています。
読み込み不要ですぐ使えるので何か処理を試したい場合などに便利です。

画像の周りに軸とラベルが表示されていますが、これを消すには以下のどちらかのやり方があります。

詳しくは ?plot.cimg や ?as.raster.cimg とコンソールに打つと情報が得られます。
ただ、軸があって特に困ることもないですし、画像を保存したい場合に軸は消したいと思うかもしれませんが、画像を保存する際にはそれ用の関数を使うことになるので、こうした対処をする必要は特にないでしょう。

cimg クラス

コンソールに画像の変数名を打てばその情報が表示されます。

Width と Height は画像のピクセルサイズです。
Depth は動画のフレーム数です。画像データを読み込んだ場合は 1 になります。
Colour channels (cc) は色のチャネル数です。グレースケール画像の場合は 1 ですが、カラー画像の場合は 3(RGB) または 4(RGBA) になります。

grayscale() という関数を使うと画像をグレースケール化できます。


情報を見ると Colour channels (cc) の値が 1 になっています。

imager では、画像データには cimg というクラスが与えられています。

この cimg クラスは、実体としてはただの四次元の数値配列です。

順にx, y, z(Depth), cc(Color channels)となっています。

画素のデータを取得するには次のようにします。

x と y を指定していないので全ての値が表示されます。

x と y を指定すればその位置の画素値を取得できます。

色チャネル

channel 関数を使って特定の色チャネルのみの画像(cimg オブジェクト)を作ることができます。

画素値の操作

range 関数を使って画像の画素値の最小値と最大値を調べてみましょう。imager では最小0、最大1で画素値を表現します。

当然、画素値を変化させると画像が変化します。簡単な例で確認します。

輝度を2値化する例。

ところで、先ほどの例では画像を明るくするのに boats^(1/3) という計算をしましたが、画素値を大きくしたいのであれば値の足し算をするのがもっと単純なやり方です。やってみましょう。

画像が何も変わっていません。
なぜかというと、plot 関数は入力された画像の画素値を自動で正規化(rescale)した上で表示するからです。画素値を全て一律で増加させても、表示の際の正規化によって見た目的に元の画像と同じようになってしまうのです。

例えば、画素値に2を加えた画像を表示させてみましょう。画素の最大値は1ですから、2を足せば全ピクセルの画素値は1以上になり、真っ白な画像になると予想されます。しかし実際にはそうなりません。

このように plot 関数はデフォルトでスケーリングが有効化されているため、単純に値を足して画素値全体をシフトさせるだけだと画像の見た目は変わりません。
望んだ効果を得るには、値を足した後に画素値が1を超えたピクセルの画素値を1にしておく必要があります。

次は画像の一部分を加工する例です。
特定の領域のピクセルの画素値を書き換えることで画像内に線を引いています。


作成した画像は save.image 関数を使って保存できます。
R の base パッケージにも同じ名前の関数があるので、ダブルコロンを使って imager の方の関数を指定します。

画素値の分布の可視化

画素値の分布のヒストグラムを作成してみます。

もっといい感じに可視化したいので ggplot2 を使いましょう。
まずは as.data.frame を使って cimg をデータフレームに変換します。

あとは好きなように可視化します。