【ImageDataクラス】画像の輝度値のCSVファイル保存

画像処理をしていると、画像の輝度値をCSVファイルに保存したいという要望はよくあります。

C#で画像の輝度値にアクセスしやすいようにしたImageDataクラスを作成しました。

(Pythonで画像の輝度値をCSVファイルに保存したい場合はこちらの記事を参照ください。)

 

このImageDataクラスではSave()メソッドに拡張子がCSVのファイルにも対応したので、輝度値をCSVファイルに保存するには

var img = new ImagingSolution.Imaging.ImageData("Mandrill.BMP");
img.Save("Mandrill.csv");

というコード量だけで、CSVファイルに保存できます。

ちなみに、CSVファイルに保存したいだけであれば、こちらで公開しているサンプルプログラムでも輝度値をCSVファイルに保存できるので、お試しください。

 

例えば、マンドリルのこの画像↓をCSVファイルに保存すると、

 

下図のように画像の左上から画像の輝度値がカンマ区切りで保存されます。

 

このCSVファイルをエクセルで表示すると、

 

エクセルにはセルの値に連動してセルの色を変える条件付き書式というのがあるのですが、この機能を使うとセルに画像を表示することができます。(ただし、モノクロ画像のみ)

 

やり方は、条件付き書式→カラースケール→その他のルールと選択します。

 

すると、最小値種類の部分を数値にして

 

同様に、最大値種類の部分を数値にして255に設定します。

 

すると、エクセル上に、こんな感じ↓で画像が表示されます。

 

ImageDataクラスライブラリへ戻る

【ImageDataクラス】InterpolationModeプロパティ

BorderTypeプロパティではインデクサをつかって

var img = new ImagingSolution.Imaging.ImageData("image.bmp");
var bright = img[-1, -1];

のように配列の添え字に相当する部分に負の値を設定すると、画像の外側の輝度値(画素値)を参照できるのを紹介しました。

だったら、添え字相当の部分に少数も指定できるんじゃね?!的な発想で画素間の輝度値を取得できるようにしています。

 

下記のコード例ではX座標が1.3、Y座標が2.7の位置を輝度値を取得しています。

var img = new ImagingSolution.Imaging.ImageData("image.bmp");
var bright = img[2.7f, 1.3f];

 

この画素と画素の間の輝度値を周りの画素の輝度の値から算出する方法を補間というのですが、詳細は下記ページを参照ください。

画素の補間(Nearest neighbor,Bilinear,Bicubic)の計算方法

 

この補間方法に有名どころで、Nearest neighorBilinearBicubicの3があり、この補間方法をInterpolationMonoプロパティにInterpolationModeEnumで指定します。

Bilinearが初期値で設定されています。

 

コード例

var img = new ImagingSolution.Imaging.ImageData("image.bmp");

////////////////////////////////////////////////////
// 下記のいづれかを指定します
// NearestNeighbor
img.InterpolationMode = ImagingSolution.Imaging.ImageData.InterpolationModeEnum.NearestNeighbor;
// Bilinear(初期値)
img.InterpolationMode = ImagingSolution.Imaging.ImageData.InterpolationModeEnum.Bilinear;
// Bicubic
img.InterpolationMode = ImagingSolution.Imaging.ImageData.InterpolationModeEnum.Bicubic;
////////////////////////////////////////////////////
// 取得する輝度値
var bright = img[2.7f, 1.3f];

ただし、Bicubicは処理が重いです...

 

ImageDataクラスライブラリへ戻る

 

【ImageDataクラス】BorderTypeプロパティ

ImageDataクラスでは、C#のインデクサという機能を使って、new したImageDataクラスをオブジェクトをあたかも配列かのように扱うことができます。

 

インデクサの例

var img = new ImagingSolution.Imaging.ImageData("image.bmp");
var bright = img[2, 5];

のようにするだけで画像の輝度値を取得することができます。

 

インデクサを用いると、配列ではできない

var bright = img[-1, -1];

のように配列の添え字に相当する部分にマイナスの値を指定することもできます。

 

このインデクサの機能を使って、画像のフィルタ処理で、画像の外周部分において、画像の外側の輝度値を参照する方法をBorderTypeプロパティにより設定を行います。

 

3×3フィルタにおいて、画像の外側を参照してしまう例

 

設定はBorderTypeEnum列挙型を指定します。

 

BordeTypeEnum.Mirrorの場合(初期値)

画像の輪郭部分を基準に折り返すように輝度値を参照します。

img[-1, -1]の値は130となります。

 

BordeTypeEnum.Clampの場合

画像の輪郭部分の輝度値に固定し参照します。

 

img[-1, -1]の値は71となります。

 

BordeTypeEnum.ToZeroの場合

画像の外側の輝度値を0にします。

img[-1, -1]の値は0となります。

 

ImageDataクラスライブラリへ戻る

【ImageDataクラス】サンプルプログラム

ImageDataクラスライブラリ公開のページにて公開しているサンプルプログラムについて簡単に説明しておきます。

 

このサンプルプログラムの開発環境は

  • Visual Studio 2015 C#
  • .NET Framework 4.5.2

となります。

 

上記環境にて、サンプルプログラムを実行すると、下図のような画面が開きます。

 

 

このFileメニューよりOpenを選択し、画像ファイルを指定します。

 

 

このOpenの処理の中身は、ほぼ.NET FrameworkのBitmapクラスなので、開く事のできるファイルもBitmapクラスに従い、*.bmp、*.jpg、*.png、*.tifとなります。

保存(Save)は上記形式に加え、CSVファイルにも保存できます。

 

画像を開いたら、ウィンドウに等倍で画像が表示されます。

 

 

ステータスバー左側にはマウスポインタが指示している画像の座標と、その位置の輝度値(R, G, B)が表示されます。

また、ステータスバー右側には、フィルタ処理を行った時の処理時間が表示されます。

 

画像のフィルタ処理を実行するにはFileメニューより、GrayScaleGaussianSobelの3つの処理を選ぶことができます。

 

 

GrayScaleの処理結果

 

Gaussianフィルタの処理結果

 

Sobelフィルタの処理結果

 

の3つの処理を実装しています。

フィルタ処理の部分はソースを公開しているので、フィルタ処理プログラム作成の参考にしてみて下さい。

 

今回、この3つの処理を選んだのには

 

GrayScael・・・処理の前後で画像のビット数が変わる例

Gaussian・・・画像の外側の輝度値を参照する例

Sobel・・・計算結果が負になる場合がある例

 

の代表的な例として公開しています。

ソースコードを見て頂くと分かりますが、画像の外側も普通に参照しちゃってるっぽいし、フィルタ処理の計算結果が0~255の範囲を超える場合もありそう・・・なのですが、そこは、このImageDataクラスがなんとかしてくれてます。

 

ImageDataクラスライブラリへ戻る