使用cv2.equalizeHist时出错

时间:2014-03-03 17:27:48

标签: python image opencv image-processing histogram

我正在尝试使用以下代码来均衡灰度图像的直方图:

import cv2
im = cv2.imread("myimage.png")
eq = cv2.equalizeHist(im)

引发以下异常:

error: (-215) CV_ARE_SIZES_EQ(src, dst) && CV_ARE_TYPES_EQ(src, dst) && CV_MAT_TYPE(src->type) == CV_8UC1 in function cvEqualizeHist

opencv的版本为2.4.2

任何猜测?

3 个答案:

答案 0 :(得分:19)

cv2.equalizeHist仅适用于灰度(1通道)图像。之一:

im = cv2.imread("myimage.png", 0)        # load as grayscale

或:

im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) # or convert

答案 1 :(得分:5)

我遇到了同样的错误,这是解决方法:

  1. 感谢:zwep(Error using cv2.equalizeHist)和 Reti43(Conversion of image type int16 to uint8

  2. 错误

错误是因为数组的dtype如zwep所说。 但是我们不能只使用img.astype(np.uint8)np.uint8(img);它将改变图像。这是结果。

  • 原始图像(img):

enter image description here

plt.imshow(np.uint8(img),cmap=plt.cm.gray)

enter image description here

  1. 解决方案

    img1=np.uint8(cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX))
    plt.imshow(cv2.equalizeHist(img1),cmap=plt.cm.gray)
    

enter image description here

PS:MRI的自适应直方图均衡效果更好。

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
plt.imshow(clahe.apply(img1),cmap=plt.cm.gray)

enter image description here

答案 2 :(得分:1)

如果其他人偶然发现了这个,但已经在使用灰度($ M \次N $)ndarrays ......还有其他问题。

当您使用cv2.imread()时,它会使用dtype=np.uint8将图像作为numpy ndarray读入。但是,当我使用任何其他方法时,它可以存储为dtype=np.uint16,这将触发以下警告

OpenCV Error: Assertion failed (_src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3))) in cv::equalizeHist, file C:\projects\opencv-python\opencv\modules\imgproc\src\histogram.cpp, line 3913
Traceback (most recent call last):
  File "<input>", line 1, in <module>
cv2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\histogram.cpp:3913: error: (-215) _src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) in function cv::equalizeHist

解决方案:

img_int8 = img.astype(np.uint8)

编辑:虽然可能做错了...因为输出现在在某些转换情况下会产生奇怪的结果。