2016-06-01 1 views
1

numpy로 이미지 작업을하고 있고 어떤 시점에서 이미지를 스케일합니다.numpy 이미지 배열을 여러 개 사용할 때 오버플로 방지

import scipy.misc  as msc 
import numpy    as np 
... 
img_rgb = msc.imread(img_fn) 
im_scaled = img_rgb * factor 

밝은 영역에 검은 색 점이 나타나는 경우가 종종 있습니다. 이것은 8 비트 이미지 RGB 픽셀의 숫자 오버플로가 원인 인 것으로 보입니다. 천장 연산자를 적용하여 곱셈이 255보다 클 경우 255로 클리핑됩니다. (신호가 음수가 될 것으로 기대하지 않으므로 플로어 함수에 관심이 없습니다)

루프의 모든 픽셀을 테스트 할 수는 있지만 배열 처리에 대한 철저한 철학을 따르지는 않을 것입니다.

도움을 주시면 감사하겠습니다. 당신은 numpy.clip()을 사용할 수 있습니다

감사합니다, 거트

답변

1

, 그것은 exactely 그 않습니다.

그러나 이미지는 아마도 꽤 좋지 않을 것입니다. 보통, [0,255]의 범위에있는 byte에서 [0,1]의 범위에서 (암시 적으로는) 이미지 값을 변환하고 gamma correction을 적용하면됩니다.

+1

'clip()'은 정수 오버플로에 도움이되지 않습니다. 오버플로가 이미 발생했기 때문에 곱한 후에 클립하기에는 너무 늦었습니다. 예를 들어, 16 비트 정수 또는 부동 소수점에 대한 입력을 업 케이트하고 곱셈 및 * 다음 * 클립을 수행해야합니다. –

+0

@warrenWeckesser 곱하기 전에'clip' 즉,'scaled = img.clip (0, 255 // factor) * factor'가됩니다. –

+0

의견이 옳다. 그래서 암묵적인 최종 조언은 두 번째 단락에서 byte에서 float로 변환하고 작업을 수행 한 다음 다시 변환하는 것입니다. – heltonbiker

관련 문제