如何将RGB图像转换为numpy数组?

Sha*_*han 85 python opencv numpy image

我有一个RGB图像.我想将它转换为numpy数组.我做了以下

im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)
Run Code Online (Sandbox Code Playgroud)

它创建一个没有形状的数组.我假设它是一个iplimage对象.

And*_*aev 112

你可以使用更新的OpenCV python接口(如果我没弄错,它可以从OpenCV 2.2开始使用).它原生使用numpy数组:

import cv2
im = cv2.imread("abc.tiff",mode='RGB')
print type(im)
Run Code Online (Sandbox Code Playgroud)

结果:

<type 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,cv2.imread()返回BGR中的numpy数组而不是RGB. (72认同)
  • @pnd你的评论是神圣的! (5认同)
  • `TypeError: 'mode' 是 imread() 的无效关键字参数 (5认同)
  • 供将来参考:`$ pip install opencv-python`安装opencv (2认同)
  • OpenCV似乎删除了“ mode”参数。请参阅以下我的答案以获取更新的方法。 (2认同)

Dav*_*ole 59

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 )
Run Code Online (Sandbox Code Playgroud)

'Image.fromarray'有点难看,因为我将输入数据剪辑为[0,255],转换为字节,然后创建灰度图像.我大多是灰色的.

RGB图像类似于:

 outimg = Image.fromarray( ycc_uint8, "RGB" )
 outimg.save( "ycc.tif" )
Run Code Online (Sandbox Code Playgroud)


Ris*_*ari 41

您也可以使用matplotlib.

from matplotlib.image import imread

img = imread('abc.tiff')
print(type(img))
Run Code Online (Sandbox Code Playgroud)

输出: <class 'numpy.ndarray'>

  • 这可能应该是公认的答案?Matplotlib 几乎总是与 numpy 一起安装,这是一个单行解决方案。所有这些使用 PIL/CV 的其他答案都不必要地复杂,并且与实际问题的相关性较低。当实际上内置了单行解决方案时,为什么还要安装额外的软件包并增加复杂性? (4认同)
  • 这很简单。我喜欢 :) (3认同)
  • 它在内部使用 PIL,所以我猜它是与 matplotlib 一起安装的 (2认同)

sli*_*izb 11

迟到的答案,但我更喜欢imageio模块到其他替代品

import imageio
im = imageio.imread('abc.tiff')
Run Code Online (Sandbox Code Playgroud)

cv2.imread()与之类似,它默认生成一个numpy数组,但是以RGB形式生成.


bel*_*ref 8

截至今天,您最好的选择是使用:

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

您将看到img一个类型为numpy的数组:

<class 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)


Jus*_*eel 6

您需要使用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)
Run Code Online (Sandbox Code Playgroud)


小智 6

使用以下语法加载图像:-

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
Run Code Online (Sandbox Code Playgroud)


dai*_*ign 5

当使用 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' )
Run Code Online (Sandbox Code Playgroud)

实际上 img.getdata() 可用于所有文件,但速度较慢,因此我仅在其他方法失败时才使用它。


jok*_*007 5

您可以通过使用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
Run Code Online (Sandbox Code Playgroud)