我正在尝试使用以下代码来均衡灰度图像的直方图:
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
任何猜测?
答案 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)
我遇到了同样的错误,这是解决方法:
感谢:zwep(Error using cv2.equalizeHist)和 Reti43(Conversion of image type int16 to uint8)
错误
错误是因为数组的dtype如zwep所说。
但是我们不能只使用img.astype(np.uint8)
或np.uint8(img)
;它将改变图像。这是结果。
plt.imshow(np.uint8(img),cmap=plt.cm.gray)
解决方案
img1=np.uint8(cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX))
plt.imshow(cv2.equalizeHist(img1),cmap=plt.cm.gray)
PS:MRI的自适应直方图均衡效果更好。
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
plt.imshow(clahe.apply(img1),cmap=plt.cm.gray)
答案 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)
编辑:虽然可能做错了...因为输出现在在某些转换情况下会产生奇怪的结果。