Python中的ValueError,数组中的索引数不匹配

Posted

技术标签:

【中文标题】Python中的ValueError,数组中的索引数不匹配【英文标题】:ValueError in Python, Number of Indices in Array not Matching 【发布时间】:2021-02-08 12:49:58 【问题描述】:

我应该编写一个方法,通过使用“平均方法”将 RGB 图像转换为灰度,其中我取 3 种颜色的平均值(不是加权方法或亮度方法)。然后我必须将原始 RGB 图像和灰度图像彼此相邻显示(连接)。我正在编写的语言是 Python。这就是我的代码目前的样子。

import numpy as np
import cv2

def average_method(img):
    grayValue = (img[:,:,2] + img[:,:,1] + img[:,:,0])/3
    gray_img = grayValue.astype(np.uint8)
    return gray_img

def main():
    img1 = cv2.imread('html/images/sunflowers.jpg')
    img1 = cv2.resize(img1, (0, 0), None, .25, .25)
    img2 = average_method(img1)
    numpy_concat = np.concatenate((img1, img2), 1)
    cv2.imshow('Numpy Concat', numpy_concat)
    cv2.waitKey(0)
    cv2.destroyAllWindows

if __name__ =="__main__":
    main()

当我尝试运行它时,它显示了这个错误:

    Traceback (most recent call last):
  File "test.py", line 23, in <module>
    main()
  File "test.py", line 16, in main
    numpy_concat = np.concatenate((img1, img2), 1)
  File "<__array_function__ internals>", line 5, in concatenate
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 3 dimension(s) and the array at index 1 has 2 dimension(s)

有人可以帮我解决这个问题,以便我可以使用“平均方法”成功地将 RGB 和灰度并排放置吗?不确定我是否正确设置了平均方法并导致此问题,或者它是否来自我尝试连接图片的方式。谢谢。

【问题讨论】:

专业提示:您的问题是关于索引错误,而不是关于灰色计算。所以你应该把它放在标题中并作为主要问题,否则人们可能会忽略你的问题 您确定这是彩色图像吗?每一步之后的 img1.shape 是什么? cv2.imread 的第二个参数是什么意思? @GiacomoCatenazzi 感谢您指出这一点!我继续编辑它。 @TurePålsson 是的,img1 应该是彩色图像(原始图像),然后 img2 将是它的灰度图像。感谢您提到 cv2.imread 的第二个参数,我把它拿出来是因为它本身会将其转换为灰度,但我只想显示原始的 rgb 参数。 cv2.imread 之后的 img1.shape 是 (183, 275, 3)。 cv2.resize 后的 img1.shape 为 (46, 69, 3)。 @TurePålsson 在 np.concatenate 行之后打印语句不会打印,这意味着该行没有通过,因为“ValueError:所有输入数组必须具有相同的维数,但数组索引 0 处有 3 个维度,索引 1 处的数组有 2 个维度”。我编辑了我的问题,现在更清楚了。 【参考方案1】:

错误消息几乎可以告诉您发生了什么。您的 img2 现在是灰度(单通道)图像,而 img1 显然仍然是彩色(三通道)。

我不是 numpy 向导,所以可能有更好的解决方案,但我认为您可以使用将 img2 扩展到三个通道

img2 = np.stack(3 * [img2], axis=2)

编辑:可能更高效(也更难理解):

img2 = np.repeat(A[..., np.newaxis], 3, axis=2)

【讨论】:

以上是关于Python中的ValueError,数组中的索引数不匹配的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:groupby Pandas 中的“无法从重复的轴重新索引”

无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量

从变量中的值构造 pandas DataFrame 会给出“ValueError:如果使用所有标量值,则必须传递一个索引”

SKLearn ValueError:使用序列设置数组元素

ValueError:索引必须是单调的

如何过滤数组中不需要的值以进行绘图?使用 numpy 数组的 matplotlib 中的 ValueError