質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

解決済

1回答

2168閲覧

C#,OpenCVで一度に読み込めない大きなマルチページTIFF(16Bit / Gray画像)ファイルに対するアクセスについて

trickster

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2019/02/06 17:48

編集2019/02/08 01:22

質問内容

C#で大きな(数GB)マルチページTiffファイルから任意のページの画像データを読み込もうとしています。
1枚の画像は 640 x 640 の 16bit Gray 画像で、これが5000ページ程度あるようなデータを想定しています。
まとめてメモリに読み込むのは無理なので、Nを指定してNページ目を抜き出すようなことができないか悩んでいます。
どうか良い方法をご存じの方教えてください。

直接アクセスできなくても、先頭からシーケンシャルに読んでN-1枚スキップする方法でも構わないと考えています。
なお、C# VisualStudio2015 + OpenCV / OpenCvSharp を利用しています。

試してみたことなど

(下記サンプルは読み込んだ画像を表示のために変換して16bit深度を利用していませんが、実際には16bitのデータとして使用予定です)

(1) もともとはマルチTiffでなかったため、下記の様な方法で読み込み、表示していた。 16bitでの取得もできていたと思われる

C#

1   var myBitmap = ImgConvert.Mat16bitGrayToBmp24(wMat);  2   pboxMain.Image = myBitmap; 3 Mat wMat = Cv2.ImRead(fn, ImreadModes.AnyColor | ImreadModes.AnyDepth); 4```    5 **↓↓↓** 6 7(2) 対象がマルチページTIFFになったため、変更。(小さいデータならOK ?、メモリに入らないのでこのコードにできない・・) 8```C# 9   Mat[] wMats; 10   Cv2.ImReadMulti(fn, out wMats, ImreadModes.AnyColor | ImreadModes.AnyDepth); 11   var page = Math.Min( 100, wMats.Length )-1; // 100ページ目 12   var myBitmap = ImgConvert.Mat16bitGrayToBmp24(wMat[page]); // 表示のために変換。 13   pboxMain.Image = myBitmap;

↓↓↓

(3) ストリームを利用して何か方法はないか試してみるも行き詰まる ・・

C#

1 var tifFS = new FileStream(fn, FileMode.Open, FileAccess.Read); 2 var decoder = new TiffBitmapDecoder(tifFS, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 3 var page= Math.Min(100, decoder.Frames.Count)-1; // 100ページ目 4 var img = decoder.Frames[page]; // iページ目の画像 5 // ・・・ imgは BitmapFrame型。 ★これからTiff画像データである16bit配列を生成したい

【解決】(3)にコードを追加して解決しました。 ・・hihijijiさん、ありがとうございました。

C#

1  // ・・(3)の続き 2 var datas = new UInt16[img.PixelWidth * img.PixelHeight]; // 16bitデータ格納先 3 var stride = img.PixelWidth * ((format.BitsPerPixel + 7) / 8); // CopyPixelsに指定する stride 4 img.CopyPixels(datas, stride, 0); // データの取得 5 var img16 = new Img16Gray(datas, img.PixelWidth, img.PixelHeight); // Gray 16bitデータとして保存。オリジナルクラス 6 var myBitmap = img16.ToBitmapRgb24(); // 表示用のビットマップ生成 (Gray16bit=> Rgb24bitに変換) 7 pboxMain.Image = myBitmap; 8 Refresh(); 9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/02/07 07:46

ゴールが良く分かりませんが、(3)でほぼいけてるのでは?
trickster

2019/02/07 15:47

hihijijiさん、ありがとうございます。  また、曖昧な書き方で申し訳ありません。  ここでのゴールとしては 解析のためのデータ、UInt16[] (Tiff16bit Gray値群)を取得できればよいのですが、 (3)はいろいろ調べつつコードしたものの BitmapFrame型の img から    解析のための UInt16[] の生成 の方法が判りません。    ・・・    CopyPixels()かなとは思ったのですが、記述すると    「型Freezableは、参照されていないアセンブリに定義されています」エラーとなり行き詰まっています。 (??何か参照が不足している??)    ※ TiffBitmapDecoder()以下、今まで使用したことがなく画像クラス間(BitmapFrame, Bitmap, BitmapSoruce など)の相互関係もよく判っていません。  よろしくお願いします。
trickster

2019/02/08 00:52

解決しました! 「(3)の方法で間違っていないのでは」と後押しして頂いたおかげで解決できました。 ・エラーについては 単純に参照不足でした。(WindowsBsse.dllと presentationFramework.dll) ・CopyPixels()により、16bitTiffデータを取得できました。
guest

回答1

0

自己解決

【解決】
・ エラーは参照追加により解消 (WindowsBsse.dllと presentationFramework.dll)
・ (3)にコードを追加して解決しました。 CopyPixels()でデータ取得。

C#

1  // ・・(3)の続き 2 var datas = new UInt16[img.PixelWidth * img.PixelHeight]; // 16bitデータ格納先 3 var stride = img.PixelWidth * ((format.BitsPerPixel + 7) / 8); // CopyPixelsに指定する stride 4 img.CopyPixels(datas, stride, 0); // データの取得 5 var img16 = new Img16Gray(datas, img.PixelWidth, img.PixelHeight); // Gray 16bitデータとして保存。オリジナルクラス 6 var myBitmap = img16.ToBitmapRgb24(); // 表示用のビットマップ生成 (Gray16bit=> Rgb24bitに変換) 7 pboxMain.Image = myBitmap; 8 Refresh();

投稿2019/02/08 01:09

trickster

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問