【问题标题】:Datatype error in opencv function equalizeHistopencv函数equalizeHist中的数据类型错误
【发布时间】:2019-10-19 22:21:53
【问题描述】:

给定cv2.readimg()读入的图片如下:

cv2.imread(path)

然后调用cv2.equalizeHist 发生以下错误:

Traceback (most recent call last):
    hist = cv2.equalizeHist(cv_image)
cv2.error: OpenCV(4.1.0) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/histogram.cpp:3345: error: (-215:Assertion failed) _src.type() == CV_8UC1 in function 'equalizeHist'

我已阅读并应用了this 问题和this 问题的答案。这是first 答案中应用的代码:

  import cv2
  removedNoise = cv2.medianBlur(img,3)
  removedNoise1 = np.uint8(removedNoise)
  hist = cv2.equalizeHist(cv_image)

这是为尝试second 答案而修改的相同代码:

  from skimage import img_as_ubyte
  cv_image = img_as_ubyte(removedNoise)
  hist = cv2.equalizeHist(cv_image)

在这两种情况下,都会发生相同的原始错误。关于如何解决这个问题的建议将不胜感激。我在macos 上使用opencv 4.1.0

【问题讨论】:

  • 你能上传出现错误的图片吗?
  • 你可以试试看这样的图片吗,img = cv2.imread(path, 0); hist = cv2.equalizeHist(img)
  • @SreeramTP 添加,0 参数似乎已修复它-请回答。
  • 就可以了。我将添加说明

标签: python opencv


【解决方案1】:

附加的回溯指出:

(-215:Assertion failed) _src.type() == CV_8UC1 in function 'equalizeHist'

这表明cv2. equalizeHist() 的输入参数必须是单通道图像。默认情况下cv2.imread() 返回一个 3 通道 BGR 图像,即使图像本质上是灰度图像。您可以尝试以下建议之一来修复此错误:

  1. cv2.imread("path/to/img.png", cv2.IMREAD_GRAYSCALE)

  2. cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

【讨论】:

  • cv2.imread("path/to/img.png", 0) -- 来吧,我相信你知道最好不要在提供了一个很好的命名常量时建议使用幻数。
  • 不在我的 IDE 上:P
  • 那么您的 IDE 配置错误,请参阅文档:cv2.IMREAD_GRAYSCALE 从 3.0 开始就存在(以及之前名称不同的)。
【解决方案2】:

opencv 中的equalizeHist 接受参数src,其中src 应为8 位单通道图像。

在您的代码中,您将图像读取为 3 通道图像或 BGR。您可以像这样将图像读取为灰度,

img = cv2.imread(path, 0)

将此图像传递给equalizeHist,如下所示将得到所需的输出。

hist = cv2.equalizeHist(img)

您可以找到文档here 了解更多详细信息。

imread 中的0 是表示图像颜色类型的标志。你可以阅读更多关于flagshere的信息。

【讨论】:

  • cv2.imread(path, 0) -- 与其他答案相同,请不要建议使用幻数。 docs.opencv.org/3.4.3/d4/da8/…
  • 与其他答案几乎相同:我都赞成。很难在其中做出选择,我打破了决胜局,另一个更快。
  • 但是我首先通过评论给了你解决方案。好吧,没关系:)
【解决方案3】:

为什么不使用 Python Wand(基于 Imagemagick)?这是一个用几行代码实现直方图均衡化的例子。

输入:

#!/bin/python3.7

from wand.image import Image

with Image(filename='zelda.png') as img:
    img.equalize()
    img.save(filename='zelda_equalize.png')


【讨论】:

    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2013-10-24
    • 2016-06-25
    相关资源
    最近更新 更多