对于图像处理类,我正在对单色图像执行点操作。像素是uint8[0255]。
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" )
输入图像:
输出图像:
使用numpy.clip:
请注意,您也可以通过以下方式在不使用numpy的情况下使图像变亮:
您可以使用OpenCV ^{} 或^{} 函数(附加说明here)。
不幸的是,不可能为输出数组使用索引,因此可以用这种效率较低的方式对每个图像通道执行就地计算:
基本上,可以归结为在添加之前进行检查。例如,可以定义如下函数:
相关问题 更多 >
编程相关推荐