我正在运行以下代码,遇到以下错误消息:
img = cv2.imread('C:\\Users\\WaWa\\Jupyter-Demo\\images\\hexagon.jpg')
img = np.pad(img, 200, mode='constant')
img = cv2.resize(img, dsize=(1600, 1600), interpolation=cv2.INTER_CUBIC)
U0 = np.array(img).sum(axis=2).astype(float)
lam1 = 400*u.nm
lam2 = 500*u.nm
lam3 = 600*u.nm
lam4 = 700*u.nm
x = np.linspace(-2,2,U0.shape[0]) * u.mm
xv, yv = np.meshgrid(x, x)
U_new1 = compute_U(U0, xv, yv, lam=lam1, z=6*u.cm)
U_new2 = compute_U(U0, xv, yv, lam=lam2, z=6*u.cm)
U_new3 = compute_U(U0, xv, yv, lam=lam3, z=6*u.cm)
U_new4 = compute_U(U0, xv, yv, lam=lam4, z=6*u.cm)
error Traceback (most recent call last)
Cell In[37], line 6
3 img = cv2.imread('C:\\Users\\William Yeung\\Jupyter-Demo\\images\\hexagon.jpg')
5 img = np.pad(img, 200, mode='constant')
----> 6 img = cv2.resize(img, dsize=(1600, 1600), interpolation=cv2.INTER_CUBIC)
7 #U0 = np.array(img).sum(axis=2).astype(float)
8 lam1 = 400*u.nm
error: OpenCV(4.6.0) :-1: error: (-5:Bad argument) in function 'resize'
> Overload resolution failed:
> - src data type = 17 is not supported
> - Expected Ptr<cv::UMat> for argument 'src'
AxisError Traceback (most recent call last)
Cell In[38], line 7
5 img = np.pad(img, 200, mode='constant')
6 #img = cv2.resize(img, dsize=(1600, 1600), interpolation=cv2.INTER_CUBIC)
----> 7 U0 = np.array(img).sum(axis=2).astype(float)
8 lam1 = 400*u.nm
9 lam2 = 500*u.nm
File ~\anaconda3\lib\site-packages\numpy\core\_methods.py:49, in _sum(a, axis, dtype, out,
keepdims, initial, where)
47 def _sum(a, axis=None, dtype=None, out=None, keepdims=False,
48 initial=_NoValue, where=True):
---> 49 return umr_sum(a, axis, dtype, out, keepdims, initial, where)
AxisError: axis 2 is out of bounds for array of dimension 0
字符串
我正在运行Python 3.10,作为Python的新手,我无法找到解决方案。非常感谢您的反馈。
1条答案
按热度按时间wz1wpwve1#
在没有图像的情况下,我可以告诉你的一件事是,默认情况下,
imread
返回BGR彩色图像(即使图像在磁盘上是灰度图像)。因此,一个3D阵列(形状为(H,W,3),W×H是图像的分辨率)。和这里使用的
np.pad
,将2000
添加到阵列的每个轴的每一侧。所以左边200,右边200,上面200,下面200,和B值前200,R值后200。所以如果你的图像是1920×1080,imread
返回一个1080×1920×3的数字数组(每个像素的蓝色,绿色,红色分量)。在np.pad之后,你有一个1480×1320×403的阵列,每个像素(包括真实的像素,或pad一个)都包含400个新的未知颜色。Open CV可以处理具有403种不同颜色分量的图像。它只处理1、3或4种颜色(灰度、BGR/RGB或BGRA/RGBA,带alpha/透明度组件)。
所以,resize当然不知道如何处理1420×1320×402的数组,从opencv的Angular 来看,这肯定不是一个图像。
但这个答案是基于
img
实际上是一个彩色图像,也就是一个3D阵列。这是默认的。如果img
是一个黑色&您得到的下一个错误似乎表明并非如此。似乎说
img
是2D阵列(因此是灰度图像)。如果你传递了可选参数cv2.IMREAD_GRAYSCALE
到imread
,你会得到什么)。在这种情况下,np.pad
应该已经完成了您所期望的任务。而cv2.resize
应该已经工作了。但是,实际上,.sum(axis=2)
不能在2D数组上工作。所以,我在这里看到的是两个相互矛盾的错误。如果
img
是一个BGR图像(如果你真的从这个imread
得到它的话),那么第一个错误是正常的,来自你对np.pad
的误解,但是第二个错误不应该发生。如果
img
是一个灰度图像,一个2D数组,第一个错误不应该发生,但第二个应该发生。我还看到,从你发布的
1.您似乎有做
img=sometransformationof(img)
之类事情的习惯1.你似乎用笔记本(你甚至把你的问题标记为“jupyter-notebook”,顺便说一句,这是离题的,因为你的问题与笔记本无关。这就像标记“滚动椅”,因为您在编写代码时坐在其中。但是,至少,这是一个进一步的证明,您正在使用的笔记本电脑,添加到
cell[1]
出现在您的副本的错误消息当同时执行这两种操作时(重载
img
是什么,使用像img=somefunc(img)
这样的行,在notebook中这样做),我们通常最终得到的img
并不是前一个单元之后的真正内容,而是另一个单元执行之后的内容,因为在notebook中,单元并不总是以线性顺序执行(毕竟,这是notebook的全部意义)。所以,我在你的错误消息中看到的矛盾可能来自于这样一个事实,即对于第二条消息,
img
并不是你的cv2.imread
之后应该是什么,而是在你尝试解决np.pad/np.resize
问题之后。所以,说了这么多,你必须选择:
np.pad
是可以的,但是沿着轴2求和没有意义。字符串
(意思是(上200,下200),(左200,右200),(没有额外的颜色分量))