2016-02-27 16 views
6

私はかなり大きな画像から着色された地面のコントロールポイントを検出するプログラムに取り組んでいます。 TIFF画像は約3 - 4 GB(約35 000 x 33 000 pix)です。 私は画像処理を行うためにPython 2とOpenCVを使用しています。OpenCVは大きな画像をロードしません(〜4GB)

import cv2 
img = 'ortho.tif' 
I = cv2.imread(img, cv2.IMREAD_COLOR) 

この部分は(常に)エラーメッセージを生成しません。画像を見せながらすることはありません:

cv2.imshow('image', I) 

私はまた、matplotlibのを利用して画像を表示しようとしている:

plt.imshow(I[:, :, ::-1]) # Hack to change BGR to RGB 

は、大きな画像についてのOpenCVやPython上の任意の制限はありますか? このiamgeをロードするにはどうしたらいいですか?

PS:私がこの作業を行うコンピュータは、Windows 10の「ワークステーション」です(画像を扱うには十分な馬力があります)。事前に

、あなたの助けに感謝:)

+0

エラーメッセージには何が表示されますか? matplotlibの plt.imshowについては – Hexaholic

+0

(self.image [:,:、:: - 1]) はTypeError: : 'NoneType' オブジェクトには、属性 '\ _ \ _ __getitem __ \ _ \ _' OpenCVのサイスを持っていませんOpenCVエラー:cv :: imshow、file .. \ .. \ .. \ modules \ highgui \ src \ window.cppのアサーションに失敗しました(size.width> 0 && size.height> 0)261行 cv2.imshow ( 'image'、self.image) cv2.error:.. \ .. \ .. \ modules \ highgui \ src \ window.cpp:261:エラー:(-215)size.width> 0 && size.height > 0 in function cv :: imshow イメージのサイズは0 x 0ピクセルです。 – cLupus

+0

...あなたはこのことを肯定しています(そして、私がOpenCVとPythonを意味するこの言葉を言ったとき)は64ビット用にコンパイルされていますか? – carlosdc

答えて

3

imread()の実装:

Mat imread(const string& filename, int flags) 
{ 
    Mat img; 
    imread_(filename, flags, LOAD_MAT, &img); 
    return img; 
} 

これは、連続した配列として画像をロードするために対応する行列を割り当てます。したがって、これはあなたのハードウェアの性能に(少なくとも部分的に)依存します。あなたのマシンは4GBの連続したRAMアレイを割り当てることができなければなりません(Debianディストリビューションであれば、RAMサイズを例えばvmstat -s -SMで調べるかもしれません)。好奇心によって

は、私がascontiguousarrayを使用して連続したメモリアレイ(あなたの4GBの画像が必要とするものよりも大きなものが、以下)を取得しようとしましたが、その前に、私はすでに、メモリ割り当ての問題につまずい:

実際に
>>> img = numpy.zeros(shape=(35000,35000)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
MemoryError 
>>> 

、あなたは十分なRAMを持っている場合でも、4GBのRAMイメージのピクセルを操作することは良い考えではありません、あなたはregions of interestsの面でとにかくそれを分割する必要があります、小さなエリアとNAに応じてchannelsでもかまいませんピクセルで実行する操作の種類

EDIT 1:

私はあなたがRAMの16ギガバイトを持っていて、scikitでその画像を読み取ることができるしているならば、あなたが行うことができない理由はない、あなたの答え以下の私のコメントで言ったようにOpenCVと同じです。

これを試してみてください:

import numpy as np # Do not forget to import numpy 
import cv2  
img = cv2.imread('ortho.tif') 

はあなたの元のコードでnumpyのをインポートするために忘れてOpenCVのは明らかにイメージをロードするために失敗した理由です。すべてのOpenCV配列構造はNumpy配列に変換され、読み取られた画像はメモリ内の配列としてOpenCVで表されます。

EDIT 2:

OpenCVの10 GBまでのサイズimaesに対処することができます。しかし、これは、cv2.imwrite()の機能になると真です。しかしcv2.imread()の場合、読み込む画像のサイズははるかに小さくなります。つまり、2013年9月に発表されたバグ(Issue3258 #1438)はまだAFAIKで修正されていません。

+0

ヒントをありがとう。このプログラムの目標の1つは、興味のある領域を自動的に見つけることです。したがって、画像全体は、同時に必要ではないが、メモリ内になければならない。私は['h5py'](http://www.h5py.org/)のあなたの提案に似た何かをすることになっていることを聞いたことがあります。私はこのライブラリの経験はありません。 – cLupus

+0

あなたのマシンにはどのくらいのRAMがありますか? @cLupus –

+0

コンピュータには16 GBのRAM(DDR3)が搭載されています。 – cLupus

2

scikit-imageが救助に来たことがわかりました。これはhereから見つけました。

次私はPythonのセッションにイメージをロードしてみましょう:

import numpy as np 
from skimage.io import imread 

img = imread(path_to_file) 

それはロードするために、またはので、約半分の分を要しました。

+0

これはエラーなしで実行されますが、変数imgは空です(np.size(img)は出力1を与えます)、scikitのimreadはデータ(約4兆ビット)を持つ画像を与えます。 – cLupus

+1

私はあなたがこの特定のイメージのためにOpenCVに頼らないという正しい決断をしたと思います。あなたの問題が私を興味をそそるので、周りを見回す時間がかかりました。最後に私は**バグ**であることがわかりました。あなたは私の答えの編集をチェックし、それがあなたが直面した問題の説明であるのでそれを受け入れることができます。これは、最終的には、ハードウェアなどではなく、図書館自体の問題です。 –

関連する問題