Подтвердить что ты не робот

Как преобразовать изображение RGB в массив numpy?

У меня есть изображение RGB. Я хочу преобразовать его в массив numpy. Я сделал следующее

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

он создает массив без формы. Я предполагаю, что это объект iplimage.

Как это сделать?

Спасибо

4b9b3361

Ответ 1

Вы можете использовать новый интерфейс python OpenCV (если я не ошибаюсь, он доступен с OpenCV 2.2). Он изначально использует массивы numpy:

import cv2
im = cv2.imread("abc.tiff")
print type(im)

результат:

<type 'numpy.ndarray'>

Ответ 2

PIL (библиотека изображений Python) и Numpy хорошо работают вместе.

Я использую следующие функции.

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

Ответ 3

Вам нужно использовать cv.LoadImageM вместо cv.LoadImage:

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)

Ответ 4

Вы также можете использовать matplotlib.

import matplotlib.image as mpimg

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

Выход: <class 'numpy.ndarray'>

Ответ 5

def opencv_image_as_array(im):
  """Interface image from OpenCV native format to a numpy array.

  note: this is a slicing trick, and modifying the output array will also change
  the OpenCV image data.  if you want a copy, use .copy() method on the array!
  """
  import numpy as np
  w, h, n = im.width, im.height, im.channels
  modes = {1:"L", 3:"RGB"}#, 4:"RGBA"}
  if n not in modes:
    raise StandardError('unsupported number of channels: {0}'.format(n))
  out = np.asarray(im) if n == 1 else np.asarray(im)[:,:,::-1]  ## BGR -> RGB
  return out

Ответ 6

При использовании ответа от David Poole я получаю SystemError с PNG с серой шкалой и, возможно, с другими файлами. Мое решение:

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() будет работать для всех файлов, но он медленнее, поэтому я использую его только тогда, когда другой метод выходит из строя.