2016-11-10 1 views
4
당신이 볼

는, 3 차원 매트릭스로 이미지 생성 거래를 논의 게시물의 대부분은 [0] [1] [2] 효과적으로 그러나 직접어떻게 RGB 값의 "삼중 항"을 포함하는 2D numpy arrayMatrix가 이미지를 생성합니까?

img = Image.fromarray(Matrix, 'RGB') 

을 적용하는 데 필요한 정보를 포함하는, 난과 붙어 "3n"열과 "n"행이있는 거대한 행렬입니다.

[ 0 0 0 255 255 255 0 0 0 
    0 0 0 255 255 255 0 0 0 
    255 255 255 0 0 0 255 255 255] 

위의 2 차원 매트릭스 3 × 3 "픽셀"을 나타내며, 사용 Image.fromarray 구멍의 전체 이미지를 생성합니다 : 당신이 볼 수있는 것처럼, "이미지"P3/P6 형식의 나를 알리는 방식으로 코딩 . 나는 3 차원 (!!!) 2 차원 배열로 분할하고 나서 np.dstack을 사용하고 있지만 그 코드는이 비현실적으로 큰 숫자 (700x2100)를 갖는 수천 개의 행렬을 생성하기 때문에 비효율적이라고 소리가 난다. 이미지로 표시됩니다.

이 내가 BTW, 일을 생각하고 무엇을 :

R = np.zeros((Y, X), dtype = np.uint8) # Same for G & B 
    for Row in range(Y): 
     for Column in range(3*X): 
      if Column % 3 == 0: # With Column-1 for G and -2 for B 
       R[Row][Column/3] = 2DMatrix[Row][Column] 
#After populating R, G, B 
RGB0 = np.dstack([R, G, B]) 
img = Image.fromarray(RGB0, 'RGB') 

감사합니다!

+0

논의 된 특성/(Y가 배를 X) 승 2 차원 매트릭스 감안할를이 색상 값은 8 비트 부호있는 것이 중요합니다'R = np.zeros ((Y, X), dtype = np.uint8) # G & B와 동일 범위 (Y)의 행 : 열 3 == 0 인 경우 : R [행] [열/3] = 2DMatrix [행] [열] 범위에있는 열의 경우 : 범위 3 (X *)의 경우 (R, G, B) RGB = np.dstack img = Image.fromarray (RGB, 'RGB') ' –

답변

3

numpy.reshape이 작업해야합니다.

>>> import numpy as np 

>>> a = [[0, 0, 0, 255, 255, 255, 0, 0, 0], 
...  [0, 0, 0, 255, 255, 255, 0, 0, 0], 
...  [255, 255, 255, 0, 0, 0, 255, 255, 255]] 
>>> a = np.array(a) 
>>> a.astype('u1').reshape((3,3,3)) 

array([[[ 0, 0, 0], 
     [255, 255, 255], 
     [ 0, 0, 0]], 

     [[ 0, 0, 0], 
     [255, 255, 255], 
     [ 0, 0, 0]], 

     [[255, 255, 255], 
     [ 0, 0, 0], 
     [255, 255, 255]]], dtype=uint8) 

>>> import PIL.Image 
>>> i = PIL.Image.fromarray(a.astype('u1').reshape((3,3,3)), 'RGB') 

이 우리가 기대하는 방식으로 작동하는 것 같다 :

>>> i.size 
(3, 3) 
>>> i.getpixel((0,0)) 
(0, 0, 0) 
>>> i.getpixel((1,0)) 
(255, 255, 255) 
>>> i.getpixel((2,0)) 
(0, 0, 0) 
>>> i.getpixel((0,1)) 
(0, 0, 0) 
>>> i.getpixel((1,1)) 
(255, 255, 255) 
>>> i.getpixel((2,1)) 
(0, 0, 0) 
>>> i.getpixel((0,2)) 
(255, 255, 255) 
>>> i.getpixel((1,2)) 
(0, 0, 0) 
>>> i.getpixel((2,2)) 
(255, 255, 255) 
+0

고마워요! 이것은 매력처럼 작동하는 것 같습니다. 한가지 : X 행과 Y 열의 이미지에서'.reshape (Y, X, 3) '로 바꿔야합니다. 맞습니까? 왜냐하면'i.getpixel'을 사용할 때 픽셀과 배열을 표시하는 관례가 정반대라는 사실이 이상해 보입니다. 건배, –

+0

예,'reshape ((Y, X, 3))'는 원하는 것을해야합니다. – wildwilhelm

관련 문제