[python] matplotlib 컬러 맵을 적용하여 NumPy 배열을 PIL 이미지로 변환하는 방법

간단한 문제가 있지만 좋은 해결책을 찾을 수 없습니다.

회색조 이미지를 나타내는 NumPy 2D 배열을 가져 와서 일부 matplotlib 컬러 맵을 적용하면서 RGB PIL 이미지로 변환하고 싶습니다.

다음 pyplot.figure.figimage명령 을 사용하여 합리적인 PNG 출력을 얻을 수 있습니다 .

dpi = 100.0
w, h = myarray.shape[1]/dpi, myarray.shape[0]/dpi
fig = plt.figure(figsize=(w,h), dpi=dpi)
fig.figimage(sub, cmap=cm.gist_earth)
plt.savefig('out.png')

내가 원하는 것을 얻기 위해 이것을 조정할 수는 있지만 (아마도 StringIO를 사용하면 PIL 이미지를 얻습니다) 이미지 시각화의 매우 자연스러운 문제로 보이므로 더 간단한 방법이 없는지 궁금합니다. 다음과 같이 가정 해 보겠습니다.

colored_PIL_image = magic_function(array, cmap)



답변

꽤 바쁜 한 줄이지 만 여기에 있습니다.

  1. 먼저 NumPy 배열 myarray이에서 최대 값으로 정규화 되었는지 확인합니다 1.0.
  2. 에 컬러 맵을 직접 적용합니다 myarray.
  3. 0-255범위로 재조정하십시오 .
  4. 를 사용하여 정수로 변환합니다 np.uint8().
  5. 사용 Image.fromarray().

그리고 완료되었습니다.

from PIL import Image
from matplotlib import cm
im = Image.fromarray(np.uint8(cm.gist_earth(myarray)*255))

와 함께 plt.savefig():

여기에 이미지 설명 입력

와 함께 im.save():

여기에 이미지 설명 입력


답변

  • 입력 = numpy_image
  • np.unit8-> 정수로 변환
  • convert ( ‘RGB’)-> RGB로 변환
  • Image.fromarray-> 이미지 객체를 반환합니다.

    from PIL import Image
    import numpy as np
    
    PIL_image = Image.fromarray(np.uint8(numpy_image)).convert('RGB')
    
    PIL_image = Image.fromarray(numpy_image.astype('uint8'), 'RGB')
    

답변

수락 된 답변에 설명 된 방법은 의견에 언급 된 변경 사항을 적용한 후에도 작동하지 않았습니다. 그러나 아래의 간단한 코드가 작동했습니다.

import matplotlib.pyplot as plt
plt.imsave(filename, np_array, cmap='Greys')

np_array는 0..1 floats o2 0..255 uint8의 값을 가진 2D 배열 일 수 있으며,이 경우 cmap이 필요합니다. 3D 배열의 경우 cmap은 무시됩니다.


답변