C#プログラム画像処理

【C#,WPF】多ビット画像の取り扱い

一般的なカメラであれば、モノクロの画像であれば8bit(256諧調)、カラー画像であれば24bit(R,G,Bそれぞれ8bit)の画像が一般的なのですが、マシンビジョン用のカメラでは、1画素あたり10~14bitぐらいまでの諧調を持つカメラがあるのですが、この画像データをプログラム的に取り扱うには、通常のWindows Forms用のC#(Bitmapクラス)では出来ませんでした。。

かなり昔の評価になりますが、評価した結果はこちら↓です

Format16bppGrayScaleは使えるのか?実験してみた

【C++/CLI】Format16bppGrayScaleは使えるのか?実験してみた。 画像処理ソリューション

 

この時に、「WPFなら出来ますよ!」というコメントを頂いていたのを、今更ながらに評価してみました。

 

WPFではSystem.Windows.Media.PixelFormatsクラスにGray16(16ビットのモノクログレースケール)、Bgr101010(R,G,B各10ビットのカラー画像)、Rgb48(R,G,B各16ビットのカラー画像)があり、個人的な使いそうな、この3つについて評価しました。

 

参考までに、Bgr101010のフォーマットでは32ビットの整数型(uint)に下位ビットからB,G,Rの順で輝度値が格納されています。

csharp_deep_color

 

Rgb48のフォーマットは16ビットの整数型(ushort)にカラーデータがR,G,B,R,G,B・・・の順で格納されています。

csharp_deep_color

一般的な24bitのカラー画像はB,G,R,B,G,R・・・の順なので、ここが少しはまりました。

評価方法

配列にカラーグラデーションのデータを格納し、これを画像ファイルに保存し、ファイルを読み込んで元の画像データに復元できるか?という内容で行いました。

画像データを復元したいので、ファイル形式は非圧縮、可逆圧縮であろうbmp,tiff,pngの3つのファイルで行いました。

(評価に用いた画像)

csharp_deep_color

 

評価プログラム

評価に用いたプログラムはこんな感じ↓です。

csharp_deep_color

ボタンをクリックすると、ボタンに示している画像ファイルを作成し、メニューのFile→Openで開くとファイルフォーマットとビット数が表示されるようになっていますが、基本的にデバッグ実行をしながら、各種パラメータをウォッチで見ながら確認を行いました。

csharp_deep_color

 

評価に用いたプログラムはGitHubに置いておきましたので、もしよかったら評価してみてください。

GitHub - ImagingSolution/ImageFileArrayConverter: 【C#、WPF】画像ファイル⇔配列の変換 Bgr101010,Gray16, RGB48の評価
【C#、WPF】画像ファイル⇔配列の変換 Bgr101010,Gray16, RGB48の評価. Contribute to ImagingSolution/ImageFileArrayConverter development by cr...

 

結果

各ボタンをクリックして、エクスプローラでファイルのプロパティを確認したのが、以下の通りです。

csharp_deep_color

 

保存 読み込み
bmp tif png bmp tif png
Gray16 ×

64bit

Bgr101010 ×

64bit

× ×
Rgb48 ×

64bit

表中の横棒(―)はファイル保存の時点でダメなので、ファイル読み込みの評価は行っておりません。

 

Bgr101010は全滅

Gray16はtifとpngファイルはOK

Rgb48もtifとpngファイルはOK

 

という結果になりました。

ただし、Gray16やRgb48では16ビット全体を輝度データとして用いる事は少なく、16ビット中の下位10ビット、12ビットなどに値を入れている事が多いのですが、この16ビット中の何ビットが有効か?を設定するのがSystem.Windows.Media.PixelFormat構造体のMasksプロパティっぽいのですが、このMasksプロパティは読み取り専用で設定が出来ない!

そのため、データとして、16ビット全体が有効(65536諧調もっている)であればいいのですが、そうでない場合、結局、どうしたらよいのか?分かりませんでした。。

 

ちなみにGray16、Bgr101010に関しては、有効ビットを設定するのにWin32APIのビットフィールドという機能を用いれば設定が可能です。

(参考)多ビット(10Bit、12Bit)画像データの表示、フォーマット

多ビット(10Bit,12Bit,30Bit)画像データの表示、フォーマット
多ビット(10Bit、12Bitなど)の画像データは10Bitや12Bitの型が存在しないため、モノクロの場合はushort型の16bit中、下位10Bit、12Bitなどを使って画像データを格納します。 30Bitとは、R,G,Bの各色が...

 

※まだ、WPFを理解しきれていない部分が多いので、間違い等ありましたら、コメント頂けると幸いです。

コメント

タイトルとURLをコピーしました