2017-11-24 6 views
0

scipy 문서에 따르면 이미지의 단일 채널을 저장할 수 있습니다.이미지의 2 채널 픽셀을 png 형식으로 저장

>>> x = np.zeros((255, 255)) 
>>> x = np.zeros((255, 255), dtype=np.uint8) 
>>> x[:] = np.arange(255) 
>>> imsave('/tmp/gradient.png', x) 

그리고 같은 화상의 채널 3 :

>>> rgb = np.zeros((255, 255, 3), dtype=np.uint8) 
>>> rgb[..., 0] = np.arange(255) 
>>> rgb[..., 1] = 55 
>>> rgb[..., 2] = 1 - np.arange(255) 
>>> imsave('/tmp/rgb_gradient.png', rgb) 

그러나이 PNG 등의 화상의 2 개 채널을 절약 할 수있다? 난 단지 2 채널 위의 코드를 모방하는 것을 시도했다, 나는 다음과 같은 오류와 함께 인사를하고있다 :

ValueError: 'arr' does not have a suitable array shape for any mode. 

답변

1

그것은 당신이 달성하거나 저장할 채널의 어떤 종류의 원하는 것을 나에게 완전히 분명하지 않다.

the PNG color options table here에 따르면 회색 음영 + 알파 채널을 사용하는 옵션은 하나뿐입니다. 물론 그런 데이터, 하지만 저장할 수 있습니다 :이 16 또는 32 비트 심도를 의미

  • 을; , 하지만 2를 지원하지 않습니다 to this libtiff에 따라 아마 당신은
  • 라이브러리는 기본적으로

TIFF 훨씬 더 실제로 유연하고 arbritrary 채널을 지원하는 것 같습니다 그레이 스케일 + 알파 채널로 해석됩니다 원하는 - 채널. (아마도 오래된 정보, 확실하지 않음).

그래서 당신이 정말로하고 싶은 일에 달려 있습니다. 2 개의 채널을 저장하기 원한다면 (바이트를 저장하고 더 많은 채널을 필요로하지 않기 때문에) 파이프 라인의 모든 단계를 원하는대로 해석 할 수 있지만 3 개의 채널을 저장하는 것이 좋습니다. 비어 있습니다 (예 : 모두 0). PNG 필터는 효율적으로 압축 할 수 있습니다. 물론 나중에 읽거나 사용할 때 코드를 수정하여 저장시 완료된대로 해석해야합니다.

이것은 단지 python의 scientific-stack 만 관련된 일종의 작업이라면 numpy의 savez_compressed을 사용하여 배열을 저장할 수 있습니다. (주석 : 범용 압축이있을 것이지만, x+1 - x -> pixels : 0, 1, 2, 3 압축은 어렵지만 델타 필터 사용 : 0, 1, 1, 1은 압축하기 쉽습니다 ; 의미 : PNG와 비교 한 압축 효율은 이미지에 따라 다릅니다.)

+0

음 나는 단지 빨강 및 녹색 채널 만 저장하려고합니다. 나는 그 채널에 대한 정보가 없기 때문에 파란 ​​채널에 관심이 없다. – motiur

1

PNG 파일 형식은 16 비트 또는 32 비트 (채널당)의 비트 심도를 가진 두 개의 채널이 포함 된 이미지를 지원합니다. PNG는 이러한 파일을 알파 (즉, 투명도) 채널이있는 회색 음영 이미지로 해석합니다. 사실 알파 채널이있는 그레이 스케일 이미지를 만들려고하는 경우이 대답이 도움이 될 수 있습니다. 배열을 저장하기 위해 PNG 형식을 사용하려는 경우 다른 형식을 사용하는 것이 좋습니다. @ sascha의 제안에 대한 답변을 참조하십시오.

내가 작성한 numpngw module (source code on github)은이 형식으로 PNG 파일을 작성할 수 있습니다. 유형 np.uint16 또는 모양이 (m, n, 2)np.uint32의 배열을 전달하기 만하면됩니다. 예를 들어

,

import numpy as np 
from numpngw import write_png 


# Create `img` with a black outer border, a white inner border and 
# a transparent square in the middle. 
img = np.full((64, 64, 2), fill_value=2**16-1, dtype=np.uint16) 
img[16:-16, 16:-16, 1] = 0 
img[:8, :, 0] = 0 
img[-8:, :, 0] = 0 
img[:, :8, 0] = 0 
img[:, -8:, 0] = 0 

write_png('foo.png', img) 

당신은 같은 모양과 데이터 형식의 배열로 다시이 데이터를 읽기 위해 실험이 필요합니다.예를 들어,이 파일을 읽을 때 베개의 기본 동작은 shape (m, n, 4)와 함께 8 비트 배열을 반환하는 것입니다. 즉 베개는 데이터를 RGBA 형식으로 변환합니다.