我有一个16位图像,我想转换为8位图像。但是我想在那之前做一些过滤。小于某个值(例如P1)的所有值都应变为0。并且大于另一个值(例如P2)的所有值都应变为255。这些值之间的所有值都应根据它们与P1和P2的距离进行缩放。>
以下代码可以做到这一点:
def transform(value):
if value < P1:
value = 0
elif value > P2:
value = 255
else:
value = (value - P1) * (255.0 / (P2 - P1))
return value
然后使用原始的16位图像作为输入:
newImage= [[transform(value) for value in row] for row in originalImage]
但是这太慢了……我尝试使用cv2.convertScaleAbs
做同样的事情,虽然速度很快,但是并不能完全满足我的要求。尤其是此功能中的“ Abs”部分使我无法使用。
我可以使用不同的功能来更快地获取想要的东西吗?
答案 0 :(得分:0)
我找到了一个使用cv2.convertScaleAbs
首先将要插入的原始图像缩放为int32:
originalImage = numpy.array(originalImage, dtype=np.int32)
然后减去P1值,使所有小于P1的值都为负:
newImage = np.array(originalImage - P1)
然后将负值裁剪为0:
newImage = newImage.clip(min=0)
最后以正确的字母使用convertScaleAbs
:
alpha = 255.0 / (P2 - P1)
newImage= cv2.convertScaleAbs(newImage, alpha=alpha)