[python] RGB 이미지를 numpy 배열로 변환하는 방법은 무엇입니까?

RGB 이미지가 있습니다. 나는 그것을 numpy 배열로 변환하고 싶습니다. 나는 다음을했다

im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)

모양이없는 배열을 만듭니다. 나는 그것이 iplimage 객체라고 가정합니다.



답변

최신 OpenCV 파이썬 인터페이스를 사용할 수 있습니다 (오해하지 않으면 OpenCV 2.2부터 사용할 수 있습니다). 기본적으로 numpy 배열을 사용합니다.

import cv2
im = cv2.imread("abc.tiff",mode='RGB')
print type(im)

결과:

<type 'numpy.ndarray'>


답변

PIL (Python Imaging Library)과 Numpy는 함께 잘 작동합니다.

다음 기능을 사용합니다.

from PIL import Image
import numpy as np

def load_image( infilename ) :
    img = Image.open( infilename )
    img.load()
    data = np.asarray( img, dtype="int32" )
    return data

def save_image( npdata, outfilename ) :
    img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
    img.save( outfilename )

‘Image.fromarray’는 들어오는 데이터를 [0,255]로 자르고 바이트로 변환 한 다음 그레이 스케일 이미지를 생성하기 때문에 약간보기 흉합니다. 저는 주로 회색으로 작업합니다.

RGB 이미지는 다음과 같습니다.

 outimg = Image.fromarray( ycc_uint8, "RGB" )
 outimg.save( "ycc.tif" )


답변

이를 위해 matplotlib 를 사용할 수도 있습니다 .

from matplotlib.image import imread

img = imread('abc.tiff')
print(type(img))

산출:
<class 'numpy.ndarray'>


답변

오늘부터 가장 좋은 방법은 다음을 사용하는 것입니다.

img = cv2.imread(image_path)   # reads an image in the BGR format
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)   # BGR -> RGB

다음 img과 같은 유형의 numpy 배열 이 표시 됩니다.

<class 'numpy.ndarray'>


답변

늦은 답변이지만 imageio다른 대안 보다 모듈을 선호하게되었습니다.

import imageio
im = imageio.imread('abc.tiff')

와 유사하게 cv2.imread()기본적으로 numpy 배열을 생성하지만 RGB 형식입니다.


답변

cv.LoadImage 대신 cv.LoadImageM을 사용해야합니다.

In [1]: import cv
In [2]: import numpy as np
In [3]: x = cv.LoadImageM('im.tif')
In [4]: im = np.asarray(x)
In [5]: im.shape
Out[5]: (487, 650, 3)


답변

David Poole의 답변을 사용할 때 그레이 스케일 PNG 및 다른 파일과 함께 SystemError가 발생합니다. 내 솔루션은 다음과 같습니다.

import numpy as np
from PIL import Image

img = Image.open( filename )
try:
    data = np.asarray( img, dtype='uint8' )
except SystemError:
    data = np.asarray( img.getdata(), dtype='uint8' )

실제로 img.getdata ()는 모든 파일에서 작동하지만 속도가 느리므로 다른 방법이 실패 할 때만 사용합니다.