2014-10-31 3 views
12

비슷한 질문을 검색했지만 대부분의 솔루션이 OpenCV의 이전 버전을 사용하므로 아무 도움이되지 않았습니다.Opencv 2.4에서 파이썬 numpy 배열을 RGB 이미지로 변환하는 방법은 무엇입니까?

난 3D 배열이있어서 OpenCV (cv2)를 사용하여 BGR 이미지로 표시하거나 저장하고 싶습니다. 간단한 예를 들어

는, 내가 가진 가정 :

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

이 작동하지 않습니다 내가하고 싶은 무엇

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를 저장하고 디스플레이입니다 아마도 b의 데이터 유형이 올바르지 않기 때문에 상당한 검색을 한 후에 올바른 데이터 유형으로 변경하는 방법을 알 수 없습니다. 만약 당신이 어떤 포인터를 제공 할 수 있다면, 그것은 크게 감사하겠습니다!

+0

감사합니다! 그러나, 그 문제는 포스터가'imshow()'에 인수를 잊었다는 것입니다. 내 문제는'imshow' /'imwrite'는 위에서 작성한 것처럼 질적 인 배열을 사용하지 않는다는 것입니다. – jmanring220

+0

'BGR'또는 'RGB'로 저장 하시겠습니까? 제목과 질문에는 둘 다 있습니다. – jmunsch

+0

@ jmanring220 네,하지만 대답은 여전히 ​​numpy 배열을 매트로 변환하는 방법을 보여줍니다. – beaker

답변

3

이미지 (C)는, d를, 다음 쇼 색 공간 변환에 전자, 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]) 
5

당신은 OpenCV의 영 때문에 Matnumpy 배열로 변환 할 필요가 없습니다모듈은 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(); 
1

당신은 scipy.misc.toimage를 찾고 있습니다 : 주석 @beaker에 대한

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

이것은 scipy 0.18.0에 존재하지 않는 것 같습니다. –

+0

@AlexKreimer : http://docs.scipy.org/doc/scipy-0.18.0/reference/generated/scipy.misc.toimage.html –

관련 문제