Answers:
您可以使用较新的OpenCV python接口(如果我没记错的话,自OpenCV 2.2起就可以使用)。它本机使用numpy数组:
import cv2
im = cv2.imread("abc.tiff",mode='RGB')
print type(im)
结果:
<type 'numpy.ndarray'>
$ pip install opencv-python
安装opencv
TypeError: 'mode' is an invalid keyword argument for imread()
mode
争论。请参阅下面的答案以获取更新的方法。
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" )
TypeError: long() argument must be a string or a number, not 'PixelAccess'
并且查看PIL PixelAccess
类的文档,它似乎没有提供能够np.array
将其基础数据转换为ndarray
格式的方法。您只需省略的使用,img.load()
而仅处理的结果Image.open(...)
。
您也可以为此使用matplotlib。
from matplotlib.image import imread
img = imread('abc.tiff')
print(type(img))
输出:
<class 'numpy.ndarray'>
您需要使用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)
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
我也采用了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]之外)压缩到范围内的值的图像的结果。)
我在评论中也提到了其他一些奇怪之处。
您可以使用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
cv
是OpenCV模块,则应这样标记它。该链接可能会有所帮助: opencv.willowgarage.com/documentation/python/…– 2011