如何在 OpenCV 中执行图像阈值化和归一化?
How to perform image thresholding and normalization in OpenCV?
我有一个 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' 部分让我无法使用。
我可以使用不同的功能来更快地获得我想要的东西吗?
我找到了一个确实使用 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)
我有一个 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' 部分让我无法使用。
我可以使用不同的功能来更快地获得我想要的东西吗?
我找到了一个确实使用 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)