26

OpenCV python 包装器中是否有与 OpenCV 2 中 Mat 的 convertTo 方法相同的功能?

我基本上想在python中调用这个函数

out.convertTo( out, CV_32F, 1.0/255, 0 );

其中 out 是灰度图像。

我已经通过将我的 dst 参数保持为 CV_32FC1 类型来使用 cv.ConvertScale,但我试图让我的 python 代码尽可能地与 cv2 一致。有什么线索吗?

4

3 回答 3

20

您可以为此简单地使用 Numpy 函数。

例如:

res = np.float32(out)

缩放,你将不得不单独做:

res = res*scaling_factor
于 2013-04-23T06:22:52.860 回答
15

如果您不尝试转换数据类型,请使用以下命令:

cv2.convertScaleAbs(image, result, alpha, beta)

其中 alpha 是您的比例因子,而 beta 是移位值。 OpenCV 文档中的更多详细信息。

于 2016-11-07T11:50:24.080 回答
3

在OP中,

0 < 乘数 < 1,

所以你不必担心下溢或溢出。Adid Rahman K 和 knipknap 的解决方案可以正常工作。他们应该足够快。

如果出于任何原因,您需要一个大于 1 的乘数,那么您可能会遇到溢出问题。也就是说,该值不足以容纳所选的数据类型。大多数 OpenCV 函数将通过截断到数据类型的最大值来处理溢出。但是,NumPy 只会“翻转”该值(例如,对于 8 位数据类型——最大值 255——OpenCV 将强制 260 变为 255,但 NumPy 将强制 260 变为 4!)。

因此,要处理 8 位灰度图像并处理欠/溢出流,请执行以下操作:

img2 = np.int16(img1)     # convert to signed 16 bit integer to allow overflow
img2 = scale_factor*img2  # apply scale factor
img2 = clip(img2, 0, 255) # force all values to be between 0 and 255

# after clip img2 is effectively unsigned 8 bit, but make it explicit:
img2 = np.uint8(img2)
于 2018-04-27T00:05:14.380 回答