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

2024-04-29 13:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

有没有不同的功能,我可以用更快的方式得到我想要的东西?你知道吗


Tags: in图像距离forreturnifvaluedef
1条回答
网友
1楼 · 发布于 2024-04-29 13:28:05

我找到了一个使用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:

alpha = 255.0 / (P2 - P1)
newImage= cv2.convertScaleAbs(newImage, alpha=alpha)

相关问题 更多 >