COLOR_RGB2GRAY提供非灰度图像(可能与jupyter笔记本有关)

时间:2018-07-12 10:32:24

标签: python opencv jupyter-notebook

我正在尝试对有2个问题的图像执行直方图均衡化。首先,我需要绘制灰度图的直方图。当我尝试将RGB图像转换为灰度图像时,输出为蓝色和黄色图像。我的代码如下:

img = cv2.imread(r'D:/UNI/Y3/DIA/2K18/lab.jpg') 
RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(RGB_img, cv2.COLOR_RGB2GRAY)
plt.imshow(gray)
plt.title('My picture (before hist. eq.)')
plt.show()

这是Jupyter Notebook的输出:

This is Jupyter Notebook's output

但是我只是意识到,如果我保存了它,可以正确保存它:

enter image description here

由于我需要提交jupyter文档,我该如何克服这个问题?谢谢!

第二,我执行直方图均衡化,但是当尝试水平堆叠图像时,从此代码得到以下错误:

equ = cv2.equalizeHist(gray)
res = np.hstack((img,equ))

错误-> all the input arrays must have same number of dimensions

据我所知,我完全没有触摸图像的尺寸...


编辑:

enter image description here

左图应该是RGB

1 个答案:

答案 0 :(得分:2)

按照@Fredrik的建议,您可以使用plt.imshow(gray, cmap='gray', vmin = 0, vmax = 255)获得灰度输出,也可以使用gray = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB)将灰度图像转换为3通道RGB图像。

基本上,问题是gray = cv2.cvtColor(RGB_img, cv2.COLOR_RGB2GRAY)返回单个通道矩阵,因为matplotlib期望显示3通道RGB矩阵,所以您可以告诉plt.imshow()您的输入矩阵是单个使用plt.imshow(gray, cmap='gray', vmin = 0, vmax = 255)的通道矩阵,也可以将单个通道矩阵转换为3通道矩阵,然后简单地使用plt.imshow(gray),一切正常。

对于问题的第二部分,res = np.hstack((img,equ))会引发错误,调试矩阵的形状总是很有帮助的,您希望对其应用操作,可以通过print img.shape,{ {1}}。据我所知,您的print equ.shape是一个3通道矩阵(BGR),而您的img是一个单通道矩阵(灰色),因此会出现错误,您需要转换此{{1 }}再次使用equ转换为3通道矩阵。