我有一個RGB圖像。我想將它轉換爲numpy數組。我做了以下內容如何將RGB圖像轉換爲numpy數組?
im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)
它創建一個沒有形狀的數組。我認爲它是iplimage對象。
怎麼辦?
感謝
我有一個RGB圖像。我想將它轉換爲numpy數組。我做了以下內容如何將RGB圖像轉換爲numpy數組?
im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)
它創建一個沒有形狀的數組。我認爲它是iplimage對象。
怎麼辦?
感謝
您需要使用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)
非常感謝...你能否也請幫我找出如果我創建一個圖像使用'cv.CreateImage(寬度,高度,通道)'...它怎麼能轉換成numpy數組? – Shan
我認爲你需要使用cv.CreateMat來代替或使用cv.CreateMat並使用cv.CvtColor或類似的東西從圖像複製到墊子上。看看保羅在上面發佈的鏈接。 –
def opencv_image_as_array(im):
"""Interface image from OpenCV's 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
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」是有點難看因爲我剪輯進入的數據爲[0255],轉換爲字節,然後創建的灰度圖像。我主要工作在灰色。
RGB圖像會是這樣的:
outimg = Image.fromarray(ycc_uint8, "RGB")
outimg.save("ycc.tif")
這會失敗並出現錯誤,TypeError:long()參數必須是字符串或數字,而不是'PixelAccess',並且查看PIL的'PixelAccess'類的文檔,但它似乎沒有提供方法來啓用' np.array'將其基礎數據轉換爲'ndarray'格式。你需要省略'img.load()'的使用並且只處理'Image.open(...)'的結果。 – ely
img.load()解決了PIL中一個奇怪的緩存問題。只有明確需要時纔會加載數據。這個例子仍然適用於我,除了使用Pillow(PIL fork)時,將「import Image」更改爲「from PIL import Image」。 –
當使用從大衛·普爾的答案我與灰階的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()會工作的所有文件,但它的速度較慢,所以我使用它,只有當其他方法失敗。
這根本不起作用 – mskw
您也可以使用matplotlib。
import matplotlib.image as mpimg
img = mpimg.imread('abc.tiff')
print(type(img))
輸出: <class 'numpy.ndarray'>
這很簡單。我喜歡 :) –
如果'cv'是OpenCV的模塊,那麼你應該把它作爲標記等。此鏈接可能有所幫助:http://opencv.willowgarage.com/documentation/python/cookbook.html#numpy-and-opencv – Paul