【问题标题】:error: (-215) _src.type() == CV_8UC1 in function equalizeHist when trying to equalize a float64 image错误:(-215) _src.type() == CV_8UC1 在函数 equalizeHist 中尝试均衡 float64 图像时
【发布时间】:2017-02-07 11:02:01
【问题描述】:

我正在尝试像这样均衡 1 个单通道图像:

img = cv2.equalizeHist(img)

但由于它是 float64 img,我收到以下错误:

错误:(-215) _src.type() == CV_8UC1 在函数 equalizeHist

我该怎么做?

【问题讨论】:

  • 是否可以选择将其转换为 8UC1?
  • 是 8UC1 的二进制图像,它只会给我黑白像素吗?如果是这样,那么不幸的是,没有。
  • 不,它是 0 到 255 之间的整数,这是 RGB 图像中每个通道的标准范围。取决于您的问题,损失 og 精度是否正常。为什么你有 float64 类型?
  • 在这种情况下如何将其转换为 8UC1?
  • img.convertTo(dst, CV_8UC1) 是 c++ 语法。不确定python,对不起。确保您的值范围在转换前在 0..255 以内,而不是在 0..1 以内

标签: python opencv numpy


【解决方案1】:

所以基本上直方图均衡适用于灰度图像。 所以如果你想在彩色图像上做直方图均衡,你可以使用这个代码。

R, G, B = cv2.split(img)

output1_R = cv2.equalizeHist(R)
output1_G = cv2.equalizeHist(G)
output1_B = cv2.equalizeHist(B)

equ = cv2.merge((output1_R, output1_G, output1_B))

【讨论】:

    【解决方案2】:

    函数equalizeHist是图像的直方图均衡,只对CV_8UC1类型实现,它是一个单通道8位无符号整数类型。

    要将您的图像转换为这种类型,您可以使用函数convertTo 与目标类型(通道数必须相同)。

    确保源图像具有正确的值范围,通常浮点图像被解释为 0 = 黑色和 1 = 白色,灰度范围介于两者之间,而整数图像被解释为 0 = 黑色和最大值 =白色(无符号 8 位类型为 255)。因此,您通常必须将源图像乘以 255 以适应范围。函数convertTo 有一个参数可以在转换期间缩放您的值,与手动缩放相比,这可以提高您的速度。

    【讨论】:

    • 这个方法convertTo在哪里?它不在cv2afaict
    • 对不起,我只知道c++语法。看看:stackoverflow.com/questions/16162227/…
    • 好的,谢谢我在尝试np.uint8(img),但我仍然遇到同样的错误。
    【解决方案3】:

    您也可以使用 .astype(numpy.uint8)。

    【讨论】:

      【解决方案4】:

      初始化图像变量时,不要忘记标志,它为我解决了问题。

      img = cv2.imread("my_image.png", 0)
      

      我使用 0 作为标志,因为我使用的是灰度图像。

      【讨论】:

        【解决方案5】:

        读取图像并将其转换为灰色后。使用
        img = np.float32(img)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-19
          • 1970-01-01
          相关资源
          最近更新 更多