【问题标题】:What is the difference between cv2.addWeighted and numpy mean, in this case?在这种情况下,cv2.addWeighted 和 numpy mean 有什么区别?
【发布时间】:2019-11-27 14:42:16
【问题描述】:

假设我有两个 OpenCV(python 包cv2)加载的灰度图像img1img2,两者尺寸相同。现在,我想取img1img2 的平均值。这里有两种方法:

# Method 1
mean = (img1 * 0.5) + (img2 * 0.5)

# Method 2
mean = cv2.addWeighted(img1,0.5,img2,0.5,0)

但是,当我使用cv2.imshow 显示mean 时,这两种方法在视觉上是不同的。为什么会这样?

【问题讨论】:

  • 你确定 img1 和 img2 的可能范围是 0 到 1?
  • 还有,cv2的完整包名是什么?如果我们不知道它是什么,就很难找到文档。
  • @topher217: img1img2 是 8 位无符号整数,因此它们在 [0,255] 中。 cv2 代表 OpenCV 的 python 实现(完整的包名本身是cv2):opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/…。抱歉,我忘了提。
  • 啊,我得到了错误!问题是 cv2.imshow 期望图像在 [0,1] 范围内。大于 1 的像素设置为 255。
  • 您能否对此进行扩展并为您自己的问题提供答案?您如何将mean 从平均范围 0 -> 255 转换为 cv2.imshow 可以接受的 0 -> 1 之一?方法 1 的值是否超过 255(裁剪),而方法 2 不是?

标签: python-3.x opencv


【解决方案1】:

很高兴您找到了解决问题的有效方法,但这似乎是一种解决方法。这种行为的真正原因在于其他地方。这里的问题是mean = (img1 * 0.5) + (img2 * 0.5) 正在返回一个具有float32 数据类型的矩阵,其中包含0.0 - 255.0 范围内的值。您可以使用print mean.dtype 来验证这一点。由于新的矩阵值已无意中转换为浮点数,我们可以使用(img_1 * 0.5 + img_2 * 0.5).astype("uint8") 恢复此操作。如果是cv2.addWeighted(),它会自动返回一个数据类型为uint8 的矩阵,一切都会正常工作。

我关心的是你得出的结论:

问题在于 cv2.imshow() 方法用于显示图像, 期望您的图像数组被规范化,即在 [0,1] 范围内。

cv2.imshow()[0-255][0.0-1.0] 的范围内工作得很好,但是当您传递一个值在[0-255] 范围内的矩阵时会出现问题,但dtype 是float32 而不是uint8 .

【讨论】:

    【解决方案2】:

    回答我自己的问题,以帮助其他对此感到困惑的人:

    方法 1 和 2 产生相同的结果。您可以通过使用cv2.imwritemean 映像写入磁盘来验证这一点。问题不在于方法。

    问题在于用于显示图像的cv2.imshow 方法期望您的图像数组被标准化,即在[0,1] 范围内。在我的例子中,两个图像数组都是 8 位无符号整数,因此它的像素值在 [0,255] 范围内。由于mean 是两个数组的平均值,因此它的像素值也在 [0,255] 范围内。因此,当我将 mean 传递给 cv2.imshow 时,值大于 1 的像素被解释为值 255,导致视觉效果大不相同。

    解决方案是在将mean 传递给cv2.imshow 之前对其进行规范化:

    # Method 1
    mean = (img1 * 0.5) + (img2 * 0.5)
    
    # Method 2
    mean = cv2.addWeighted(img1,0.5,img2,0.5,0)
    
    # Note that the division by 255 results in the image array values being squeezed to [0,1].
    
    cv2.imshow("Averaged", mean/255.)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多