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


134

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

회색조 이미지를 나타내는 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)

완벽하게 작동하는 코드의 경우 다음을 참조 할 수 있습니다. 파이썬의 PIL을 사용하여 회색조 이미지를 다채로운 이미지로 변환
Adam

답변:


222

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

  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():

여기에 이미지 설명 입력


7
"컬러 맵 myarray을 심장에 똑바로 자른 부분에 직접 적용하십시오 !" 가능할 줄 몰랐습니다, 감사합니다!
heltonbiker

34
LinearSegmentedColormap (cm.gist_earth가 인스턴스 임)에 대한 문서를 연구하면서 이미 uint8로 변환하는 "bytes"인수로 호출 할 수 있음을 발견했습니다. 그런 다음, 한 줄은 많이 조용를 가져옵니다im = Image.fromarray(cm.gist_earth(myarray, bytes=True))
heltonbiker

1
@CiprianTomoiaga, 배열의 모양은 원하는 이미지 크기 여야합니다. 예를 들어, VGA 이미지는 모양 (1024,768)의 배열에서 생성됩니다. 이것은 단색 이미지에 적용됩니다. 이것은 일반적으로 RGB 이미지를 배열로 변환 할 때 그 모양이 예를 들어 (1024,768,3)이되기 때문에 중요합니다.
heltonbiker

5
오류가 발생합니다NameError: name 'cm' is not defined
rnso

10
@msofrom matplotlib import cm
Quantum7

10
  • 입력 = 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')
    

5
희망은 문제를 해결할 수 있지만 코드에 대한 설명을 추가하여 사용자가 실제로 원하는 것을 완벽하게 이해할 수 있도록하십시오.
Jaimil Patel

1
좋고 업데이트 된 답변입니다. 이전 것들은 몇 년 전의 것입니다.
Catalina Chircu

7

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

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은 무시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.