问题:如何将RGB图像转换为numpy数组?
我有RGB图像。我想将其转换为numpy数组。我做了以下
im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)
它创建一个没有形状的数组。我假设它是一个iplimage对象。
回答 0
您可以使用较新的OpenCV python接口(如果我没记错的话,自OpenCV 2.2起就可以使用)。它本机使用numpy数组:
import cv2
im = cv2.imread("abc.tiff",mode='RGB')
print type(im)
结果:
<type 'numpy.ndarray'>
回答 1
PIL(Python影像库)和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" )
回答 2
您也可以为此使用matplotlib。
from matplotlib.image import imread
img = imread('abc.tiff')
print(type(img))
输出:
<class 'numpy.ndarray'>
回答 3
截至今天,您最好的选择是使用:
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'>
回答 4
答案较晚,但imageio
与其他替代方案相比,我更喜欢该模块
import imageio
im = imageio.imread('abc.tiff')
与相似cv2.imread()
,默认情况下会生成numpy数组,但格式为RGB。
回答 5
您需要使用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)
回答 6
当使用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()适用于所有文件,但速度较慢,因此仅在其他方法失败时才使用它。
回答 7
OpenCV映像格式支持numpy数组接口。可以创建一个辅助功能来支持灰度或彩色图像。这意味着可以使用numpy slice而不是图像数据的完整副本方便地完成BGR-> RGB转换。
注意:这是一个大技巧,因此修改输出数组也将更改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
回答 8
我也采用了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的浮点值。
保存图像时,我注意到我必须自己剪切超出范围的值,否则最终会得到真正的灰色输出。(灰色输出是将整个范围(在[0,256]之外)压缩到范围内的值的图像的结果。)
我在评论中也提到了其他一些奇怪之处。
回答 9
您可以使用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
回答 10
使用以下语法加载图像:
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