【问题标题】:python - OpenCV mat::convertTo in pythonpython - Python 中的 OpenCV mat::convertTo
【发布时间】:2013-04-16 05:56:06
【问题描述】:

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

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

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

out 是灰度图像。

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

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    在 OP 中,

    0

    因此您不必担心下溢或溢出。 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)
    

    【讨论】:

      【解决方案2】:

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

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

      其中 alpha 是您的比例因子,而 beta 是移位值。 More details in the OpenCV docs.

      【讨论】:

      • 我比我更喜欢这个答案,因为它会在一行代码中自动处理下溢/溢出。一般来说,OpenCV 函数会为您处理下溢/溢出,而且它们速度很快(因此它们应该优于 NumPy 函数)
      【解决方案3】:

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

      例如:

      res = np.float32(out)
      

      缩放,你必须单独做:

      res = res*scaling_factor
      

      【讨论】:

      • Numpy 函数是否与 opencv convertTo 一样快?
      • 你不能只使用它,因为它不能像 .convertTo 那样解决溢出问题
      • @FedorChervinskii 您可以使用 clip(res,0,255) 解决溢出问题。
      • @Mr.WorshipMe,使用clip() 有一个警告:你必须有一个足够大的数组数据类型来首先容纳溢出。出于这个原因,我更喜欢尽可能使用像 convertScaleAbs 这样的 OpenCV 函数。
      猜你喜欢
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多