画像をPILからopenCV形式に変換します


101

画像をPILからOpenCVフォーマットに変換しようとしています。私はを使用していOpenCV 2.4.3ます。これが私が今まで試したことです。

>>> from PIL import Image
>>> import cv2 as cv
>>> pimg = Image.open('D:\\traffic.jpg')                           #PIL Image
>>> cimg = cv.cv.CreateImageHeader(pimg.size,cv.IPL_DEPTH_8U,3)    #CV Image
>>> cv.cv.SetData(cimg,pimg.tostring())
>>> cv.cv.NamedWindow('cimg')
>>> cv.cv.ShowImage('cimg',cimg)
>>> cv.cv.WaitKey()

しかし、画像はCV形式に変換されていないと思います。ウィンドウには大きな茶色の画像が表示されます。画像からフォーマットPILへの変換でどこが間違っていCVますか?

また、cv.cv関数にアクセスするために入力する必要があるのはなぜですか?



私はあなたが言及した質問に言及しましたが、そこで与えられた解決策は私には
うまくいか

画像をRGBからBGRに変換する必要があると思います。それが機能するかどうかを確認します。
フローズンヨーグルト2013年

回答:


171

これを使って:

pil_image = PIL.Image.open('Image.jpg').convert('RGB') 
open_cv_image = numpy.array(pil_image) 
# Convert RGB to BGR 
open_cv_image = open_cv_image[:, :, ::-1].copy() 

2
ありがとう、最後の行が何をしているのか詳しく説明してもらえますか?
md1hunox 2013年

17
のように、3D配列で表されるRGB画像がありex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ])ます。つまりex[0]、画像の最初の行、最初の行のex[0][0]最初の列ex[0][0][0]、最初のピクセルの赤のコンポーネントex[0][0][1]、緑のコンポーネント、ex[0][0][2]青のコンポーネントです。明らかにBGR画像(RGBの逆順)が必要なので、ピクセルを表す各要素をのように反転しex[0][0][::-1]ます。最後の行(役に立たないことを除く.copy)は、画像全体に対するこの操作に相当します。
mmgp 2013年

16
パフォーマンスはわずかに向上するだけかもしれません cv2.cvtColor(open_cv_image, cv2.cv.CV_BGR2RGB) が、もう少し効率的です。
GuillaumeDufay

あなたの答えの.convert( 'RGB')の目的は何でしたか?私は16ビットのグレースケール画像(画像モード= I; 16)で作業しています..これまでのところ、nparrayは画像を単一のPIL.Imageオブジェクトとして保持しています。(つまり、エントリが1つしかない配列、元のPIL.Image)
user391339 2015年

3
画像がバイナリの場合(たとえば、スキャンされたバイナリTIF)、numpy配列はバイナリになるboolため、OpenCVで使用することはできません。この場合、あなたは、OpenCVのマスクに変換する必要がありますif image.dtype == bool: image = image.astype(np.uint8) * 255
Maksym Ganenko

99

これは私が見つけた最短のバージョンであり、余分な変換を保存/非表示にします。

pil_image = PIL.Image.open('image.jpg')
opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)

URLからファイルを読み取る場合:

import cStringIO
import urllib
file = cStringIO.StringIO(urllib.urlopen(r'http://stackoverflow.com/a_nice_image.jpg').read())
pil_image = PIL.Image.open(file)
opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)

2
URLからダウンロードする場合は、次のようにしますimport requests response = requests.get(url) opencvImage = imdecode(np.asarray(bytearray(response.content)), 1)
Lior

4
ピル画像をマットに再度変換するにはどうすればよいですか?

ウル答えは、このエラーを返します: OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor
ファリドAlijani

動作します。Pythonの世界の誰もがそのインポートを述べていないのはなぜですか?
pscheit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.