Для класса обработки изображений я делаю точечные операции над монохромными изображениями. Пиксели - uint8 [0,255].
numpy uint8 будет завернут. Например, 235 + 30 = 9. Мне нужно, чтобы пиксели насыщались (max = 255) или усекались (min = 0) вместо обертывания.
Мое решение использует int32 пиксели для математики точки, затем преобразует в uint8 для сохранения изображения.
Это лучший способ? Или есть более быстрый способ?
#!/usr/bin/python
import sys
import numpy as np
import Image
def to_uint8( data ) :
# maximum pixel
latch = np.zeros_like( data )
latch[:] = 255
# minimum pixel
zeros = np.zeros_like( data )
# unrolled to illustrate steps
d = np.maximum( zeros, data )
d = np.minimum( latch, d )
# cast to uint8
return np.asarray( d, dtype="uint8" )
infilename=sys.argv[1]
img = Image.open(infilename)
data32 = np.asarray( img, dtype="int32")
data32 += 30
data_u8 = to_uint8( data32 )
outimg = Image.fromarray( data_u8, "L" )
outimg.save( "out.png" )
Входное изображение:
Выходное изображение: