一般的なカメラであれば、モノクロの画像であれば8bit(256諧調)、カラー画像であれば24bit(R,G,Bそれぞれ8bit)の画像が一般的なのですが、マシンビジョン用のカメラでは、1画素あたり10~14bitぐらいまでの諧調を持つカメラがあるのですが、この画像データをプログラム的に取り扱うには、通常のWindows Forms用のC#(Bitmapクラス)では出来ませんでした。。
かなり昔の評価になりますが、評価した結果はこちら↓です
Format16bppGrayScaleは使えるのか?実験してみた
http://imagingsolution.blog.fc2.com/blog-entry-65.html
この時に、「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の順で輝度値が格納されています。
Rgb48のフォーマットは16ビットの整数型(ushort)にカラーデータがR,G,B,R,G,B・・・の順で格納されています。
一般的な24bitのカラー画像はB,G,R,B,G,R・・・の順なので、ここが少しはまりました。
評価方法
配列にカラーグラデーションのデータを格納し、これを画像ファイルに保存し、ファイルを読み込んで元の画像データに復元できるか?という内容で行いました。
画像データを復元したいので、ファイル形式は非圧縮、可逆圧縮であろうbmp,tiff,pngの3つのファイルで行いました。
(評価に用いた画像)
評価プログラム
評価に用いたプログラムはこんな感じ↓です。
ボタンをクリックすると、ボタンに示している画像ファイルを作成し、メニューのFile→Openで開くとファイルフォーマットとビット数が表示されるようになっていますが、基本的にデバッグ実行をしながら、各種パラメータをウォッチで見ながら確認を行いました。
評価に用いたプログラムはGitHubに置いておきましたので、もしよかったら評価してみてください。
https://github.com/ImagingSolution/ImageFileArrayConverter
結果
各ボタンをクリックして、エクスプローラでファイルのプロパティを確認したのが、以下の通りです。
保存 | 読み込み | |||||
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)画像データの表示、フォーマット
https://imagingsolution.net/imaging/imaging-programing/10bit-image-format/
※まだ、WPFを理解しきれていない部分が多いので、間違い等ありましたら、コメント頂けると幸いです。