簡體   English   中英

如何使用 Opencv 2.4 將 python numpy 數組轉換為 RGB 圖像?

[英]How to convert a python numpy array to an RGB image with Opencv 2.4?

我搜索過類似的問題,但沒有找到任何有用的信息,因為大多數解決方案使用舊版本的 OpenCV。

我有一個 3D numpy 數組,我想使用 OpenCV (cv2) 將其顯示和/或保存為 BGR 圖像。

作為一個簡短的例子,假設我有:

import numpy, cv2
b = numpy.zeros([5,5,3])

b[:,:,0] = numpy.ones([5,5])*64
b[:,:,1] = numpy.ones([5,5])*128
b[:,:,2] = numpy.ones([5,5])*192

我想做的是將 b 保存並顯示為類似於以下內容的彩色圖像:

cv2.imwrite('color_img.jpg', b)
cv2.imshow('Color image', b)
cv2.waitKey(0)
cv2.destroyAllWindows()

這不起作用,大概是因為 b 的數據類型不正確,但經過大量搜索后,我無法弄清楚如何將其更改為正確的類型。 如果您能提供任何指示,將不勝感激!

您不需要將NumPy數組轉換為Mat因為 OpenCV cv2模塊可以接受NumPy數組。 您唯一需要關心的是 {0,1} 映射到 {0,255} 並且NumPy數組中任何大於 1 的值都等於 255。因此您應該在代碼中除以 255,如下所示。

img = numpy.zeros([5,5,3])

img[:,:,0] = numpy.ones([5,5])*64/255.0
img[:,:,1] = numpy.ones([5,5])*128/255.0
img[:,:,2] = numpy.ones([5,5])*192/255.0

cv2.imwrite('color_img.jpg', img)
cv2.imshow("image", img)
cv2.waitKey()

您正在尋找scipy.misc.toimage

import scipy.misc
rgb = scipy.misc.toimage(np_array)

它似乎也在scipy 1.0 中,但有棄用警告。 相反,您可以使用pillowPIL.Image.fromarray

下面的圖像 c、d、e 和 f 顯示了顏色空間轉換,它們也恰好是 numpy 數組<type 'numpy.ndarray'>

import numpy, cv2
def show_pic(p):
        ''' use esc to see the results'''
        print(type(p))
        cv2.imshow('Color image', p)
        while True:
            k = cv2.waitKey(0) & 0xFF
            if k == 27: break 
        return
        cv2.destroyAllWindows()

b = numpy.zeros([200,200,3])

b[:,:,0] = numpy.ones([200,200])*255
b[:,:,1] = numpy.ones([200,200])*255
b[:,:,2] = numpy.ones([200,200])*0
cv2.imwrite('color_img.jpg', b)


c = cv2.imread('color_img.jpg', 1)
c = cv2.cvtColor(c, cv2.COLOR_BGR2RGB)

d = cv2.imread('color_img.jpg', 1)
d = cv2.cvtColor(c, cv2.COLOR_RGB2BGR)

e = cv2.imread('color_img.jpg', -1)
e = cv2.cvtColor(c, cv2.COLOR_BGR2RGB)

f = cv2.imread('color_img.jpg', -1)
f = cv2.cvtColor(c, cv2.COLOR_RGB2BGR)


pictures = [d, c, f, e]

for p in pictures:
        show_pic(p)
# show the matrix
print(c)
print(c.shape)

有關更多信息,請參見此處: http : //docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

或者你可以:

img = numpy.zeros([200,200,3])

img[:,:,0] = numpy.ones([200,200])*255
img[:,:,1] = numpy.ones([200,200])*255
img[:,:,2] = numpy.ones([200,200])*0

r,g,b = cv2.split(img)
img_bgr = cv2.merge([b,g,r])

如果其他人只想顯示黑色圖像作為背景,例如 500x500 像素:

import cv2
import numpy as np

black_screen  = np.zeros([500,500,3])
cv2.imshow("Simple_black", black_screen)
cv2.waitKey(0)

您的圖像大小不足以用肉眼看到。 所以請盡量使用至少 50x50

import cv2 as cv
import numpy as np

black_screen = np.zeros([50,50,3])

black_screen[:, :, 2] = np.ones([50,50])*64/255.0
cv.imshow("Simple_black", black_screen)
cv.waitKey(0)
cv.displayAllWindows()

這是因為cv2使用來自 numpy 的類型“uint8” 因此,您應該在創建數組時定義類型。

類似於以下內容:

import numpy
import cv2

b = numpy.zeros([5,5,3], dtype=numpy.uint8)
b[:,:,0] = numpy.ones([5,5])*64
b[:,:,1] = numpy.ones([5,5])*128
b[:,:,2] = numpy.ones([5,5])*192

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM