Python - 在Python中使用OpenCV mat::convertTo函数

29

在OpenCV Python包装器中是否有与OpenCV 2中Mat的convertTo方法执行相同操作的函数?

我基本上想在Python中调用此函数。

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

out是一张灰度图像。

我已经使用了cv.ConvertScale函数,并将dst参数保持为CV_32FC1类型,但我尝试尽可能使我的Python代码符合cv2规范。有什么线索吗?

3个回答

22
你可以简单地使用Numpy函数来完成这个任务。
例如:
res = np.float32(out)

扩展性方面,你需要单独处理:

res = res*scaling_factor

3
NumPy的函数是否和OpenCV中的convertTo一样快? - user391339
5
因为它不能像.convertTo一样解决溢出问题,所以你不能仅仅使用它。 - Fedor Chervinskii
1
@FedorChervinskii 你可以使用clip(res,0,255)来解决溢出问题。 - Mr.WorshipMe
@Mr.WorshipMe,使用clip()有一个注意事项:您必须拥有足够大的数组数据类型来容纳首先发生的溢出。因此,我更喜欢在可能的情况下使用OpenCV函数,例如convertScaleAbs。 - bfris

15
如果您不打算转换数据类型,可以使用此方法:
cv2.convertScaleAbs(image, result, alpha, beta)

其中alpha是比例因子,beta是偏移值。 OpenCV文档中有更多详细信息。


我更喜欢这个答案,因为它可以在一行代码中自动处理下溢/上溢。通常情况下,OpenCV函数会为您处理下溢/上溢,而且它们速度很快(因此应优先选择它们,而不是NumPy函数)。 - bfris

3
在操作中,multiplier的值在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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接