2012-12-16 5 views
3

으로 Numpy 배열을 저장할 때 변경되지 않은 데이터 유지 Scipy toimage 또는 imsave을 사용하여 2 차원 Numpy 배열 (단일 값)을 저장할 때 픽셀 값이 Numpy 배열의 값과 정확하게 일치하지 않습니다. 대신에 이미지 알고리즘이 보간법을 사용하는 것처럼 보이는 부분이 대부분 가장자리에 있습니다.Scipy imsave

그 보간을 중지하고 정확한 데이터를 보존 할 수있는 옵션이 있습니까 (예 : 7 항상 PNG에서 RGB (7,7,7)을 얻는다?

답변

7

당신은 2D NumPy와 배열을 가지고 있다면, 당신이 저장하는 그레이 스케일 PNG로 변환하면 RGB 이미지 (단 하나의 채널)를 얻을 수 없습니다. 단일 값으로 무엇을 의미하는지 확실하지 않습니다. 아마도 단 정밀도 플로트입니까? PIL은 단 정밀도 플로트를 지원하지만 PNG는 지원하지 않습니다. PNG는 채널 당 8 비트 (기본값) 또는 채널당 16 비트를 사용할 수 있습니다. 즉, 배열의 최대 크기는 2^8/2^16 (8/16 비트)로 조정되고 이 변환에서 결과는 약간 다를 수 있습니다.

scipy.misc.image을 사용하면 16 비트로 저장하는 옵션이없는 것처럼 보이므로 항상 8 비트 PNG를 씁니다. 그러나 scipy.misc.toimage을 사용하여 16 비트 이미지를 만들 수 있습니다. mode='I'을 전달해야합니다. 또한 배율을 피하려면 배열 min 및 max을 ​​지정해야합니다. 이 예에서 I 데이터 유형에 대한 int32을 사용하는 것이

import numpy as np 
import scipy.misc 

a = np.random.uniform(0, 2**16 - 1, (500, 500)).astype('int32') 
img = scipy.misc.toimage(a, high=np.max(a), low=np.min(a), mode='I') 
img.save('my16bit.png') 

# check that you got the same values 
b = scipy.misc.imread('my16bit.png') 
b.dtype 
# dtype('int32') 
np.array_equal(a, b) 
# True 

주 : 다음은 16 비트 PNG를 저장하는 데 사용하는 방법은 다음과 같습니다. 그러나 데이터는 여전히 uint16에 들어가야합니다. 음수 값 또는 2^16보다 큰 값을 넣으면 PNG로 저장 될 때 클리핑됩니다. 반대로 sp.misc.imreadint32으로 읽혀도 데이터는 결코 uint16이되지 않습니다.

요약

: 정확히 당신이 uint8/uint16 유형이며, 올바른 high/low/modescipy.misc.toimage에 전달 있는지 확인 필요 PNG에 동일한 NumPy와 배열을 작성합니다.

+0

데이터 형식, 정밀도 및 파일 형식과 관련하여 PIL로 이미지 변환 및 저장하는 방법에 대한 적절한 문서/자습서가 있습니까? –

+0

@Juh_, PIL 이미지 변환에 대한 자습서가 있지만 (단지 Google 용), 데이터 유형 및 정밀도와 관련하여 알고있는 부분이 많지 않습니다. 대부분의 이미지는 24 비트 (채널 당 8 비트, 그래서'uint8 ')이므로 정밀도와 데이터 유형의 문제는 자주 발생하지 않습니다. – tiago

+0

Google 검색에서 기본적인 튜토리얼 또는 "16 비트 tiff"와 같은 특정 문제가 있습니다. 필자는 필자가 볼 수있는 형식 (즉, 이미지 파일)으로 저장하려는 (과학적) 이미지 데이터를 가능한 경우 압축하지만 정밀도가 손실되지는 않습니다. 나는 각 경우에 가장 좋은 저축 방법에 관한 표를 갖고 싶다. –