如何在OpenCV中执行图像阈值化和归一化?

时间:2019-05-03 07:47:20

标签: python opencv image-processing cv2

我有一个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”部分使我无法使用。

我可以使用不同的功能来更快地获取想要的东西吗?

1 个答案:

答案 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)