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


113

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

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

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


2
경우 cvOpenCV의 모듈이며, 다음과 같은를 태그해야한다. 이 링크가 도움이 될 수 있습니다 : opencv.willowgarage.com/documentation/python/…
Paul

답변:


142

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

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

결과:

<type 'numpy.ndarray'>

95
cv2.imread ()는 RGB가 아닌 BGR로 numpy 배열을 반환합니다.
pnd

6
@pnd 귀하의 의견은 신성합니다!
Eduardo Pignatelli

4
향후 참조 : $ pip install opencv-pythonopencv를 설치하려면
Kyle C

2
TypeError: 'mode' is an invalid keyword argument for imread()
Rishabh Agrahari

8
OpenCV가 mode논쟁 을 포기한 것 같습니다 . 업데이트 된 방법은 아래 내 대답을 참조하십시오.
belvederef

73

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" )

1
이것은 오류와 함께 실패하고 TypeError: long() argument must be a string or a number, not 'PixelAccess'PIL의 PixelAccess클래스 에 대한 설명서를 보면 np.array기본 데이터를 ndarray형식 으로 변환 할 수있는 메서드를 제공하지 않는 것으로 보입니다 . 사용을 생략하고 img.load()의 결과 만 처리하면됩니다 Image.open(...).
ely

img.load ()는 PIL의 이상한 캐싱 문제를 해결합니다. 데이터는 명시 적으로 필요할 때까지로드되지 않습니다. Pillow (PIL 포크)로 작업 할 때 "import Image"를 "from PIL import Image"로 변경하는 것을 제외하고이 예제는 여전히 저에게 적합합니다.
David Poole

OpenCV가 아닌 PIL 만 사용하도록 찬성합니다. 나는 OpenCV에 반대하지 않습니다.
progyammer


19

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

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'>

12

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

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

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


7

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)

고마워요 ... 'cv.CreateImage (width, height, channels)'를 사용하여 이미지를 만들면 어떻게하면 numpy 배열로 변환 될 수 있습니까?
Shan

대신 cv.CreateMat을 사용하거나 cv.CreateMat을 사용하고 cv.CvtColor 또는 유사한 것을 사용하여 이미지에서 매트로 복사해야한다고 생각합니다. Paul이 위에 게시 한 링크를 살펴보십시오.
Justin Peel

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 ()는 모든 파일에서 작동하지만 속도가 느리므로 다른 방법이 실패 할 때만 사용합니다.


2

OpenCV 이미지 형식은 numpy 배열 인터페이스를 지원합니다. 회색조 또는 컬러 이미지를 지원하는 도우미 기능을 만들 수 있습니다. 이것은 BGR-> RGB 변환이 이미지 데이터의 전체 사본이 아닌 numpy 슬라이스로 편리하게 수행 될 수 있음을 의미합니다.

참고 : 이것은 진보적 인 트릭이므로 출력 배열을 수정하면 OpenCV 이미지 데이터도 변경됩니다. 복사본을 원하면 .copy()배열에서 메서드를 사용 하십시오!

import numpy as np

def img_as_array(im):
    """OpenCV's native format to a numpy array view"""
    w, h, n = im.width, im.height, im.channels
    modes = {1: "L", 3: "RGB", 4: "RGBA"}
    if n not in modes:
        raise Exception('unsupported number of channels: {0}'.format(n))
    out = np.asarray(im)
    if n != 1:
        out = out[:, :, ::-1]  # BGR -> RGB conversion
    return out

1

또한 imageio를 채택했지만 전처리 및 후 처리에 다음과 같은 기계가 유용하다는 것을 알았습니다.

import imageio
import numpy as np

def imload(*a, **k):
    i = imageio.imread(*a, **k)
    i = i.transpose((1, 0, 2))  # x and y are mixed up for some reason...
    i = np.flip(i, 1)  # make coordinate system right-handed!!!!!!
    return i/255


def imsave(i, url, *a, **k):
    # Original order of arguments was counterintuitive. It should
    # read verbally "Save the image to the URL" — not "Save to the
    # URL the image."

    i = np.flip(i, 1)
    i = i.transpose((1, 0, 2))
    i *= 255

    i = i.round()
    i = np.maximum(i, 0)
    i = np.minimum(i, 255)

    i = np.asarray(i, dtype=np.uint8)

    imageio.imwrite(url, i, *a, **k)

근거는 이미지 표시뿐만 아니라 이미지 처리에 numpy를 사용하고 있다는 것입니다. 이를 위해 uint8s는 어색하기 때문에 0에서 1 사이의 부동 소수점 값으로 변환합니다.

이미지를 저장할 때 범위를 벗어난 값을 직접 잘라 내야한다는 것을 깨달았으며, 그렇지 않으면 정말 회색 출력으로 끝났습니다. (회색 출력은 imageio가 [0, 256)을 벗어난 전체 범위를 범위 내에있는 값으로 압축 한 결과입니다.)

댓글에서 언급 한 몇 가지 다른 이상한 점도있었습니다.


1

numpy및 사용하여 쉽게 rgb 이미지의 numpy 배열을 얻을 수 있습니다.Image from PIL

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('*image_name*') #These two lines
im_arr = np.array(im) #are all you need
plt.imshow(im_arr) #Just to verify that image array has been constructed properly

0

다음 구문을 사용하여 이미지를로드합니다.

from keras.preprocessing import image

X_test=image.load_img('four.png',target_size=(28,28),color_mode="grayscale"); #loading image and then convert it into grayscale and with it's target size 
X_test=image.img_to_array(X_test); #convert image into array
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.