COLOR_RGB2GRAY 给出非灰度图像(可能是 jupyter-notebook 的问题)

Ste*_*zzi 0 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()
Run Code Online (Sandbox Code Playgroud)

这是 Jupyter Notebook 的输出:

这是 Jupyter Notebook 的输出

但我刚刚意识到,如果我保存它是否正确保存:

在此处输入图片说明

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

其次,我执行直方图均衡,但是当我尝试水平堆叠图像时,我从这段代码中得到以下错误:

equ = cv2.equalizeHist(gray)
res = np.hstack((img,equ))
Run Code Online (Sandbox Code Playgroud)

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

据我所知,我根本没有触及图像的尺寸......


编辑:

在此处输入图片说明

左图应该是RGB

Zda*_*daR 7

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

基本上问题是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,来做到这一点print equ.shape。据我所知,您img是一个 3 通道矩阵(BGR),而您equ是一个单通道矩阵(灰色),因此出现错误,您需要equ使用cv2.cvtColor(equ, cv2.COLOR_GRAY2RGB).