numpy 遇到错误:CV2.Resize,Array.Sum

bakd9h0s  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(84)

我正在运行以下代码,遇到以下错误消息:

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的新手,我无法找到解决方案。非常感谢您的反馈。

wz1wpwve

wz1wpwve1#

在没有图像的情况下,我可以告诉你的一件事是,默认情况下,imread返回BGR彩色图像(即使图像在磁盘上是灰度图像)。因此,一个3D阵列(形状为(H,W,3),W×H是图像的分辨率)。
和这里使用的np.pad,将200 0添加到阵列的每个轴的每一侧。所以左边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_GRAYSCALEimread,你会得到什么)。在这种情况下,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问题之后。
所以,说了这么多,你必须选择:

  • 您可以使用2D阵列(灰度)。然后你的np.pad是可以的,但是沿着轴2求和没有意义。
  • 要么你工作的三维阵列(彩色)图像。然后,沿着轴2求和是有意义的(这是一种将彩色图像转换为灰度图像的廉价方法,灰度值在0和255×3=765之间)。但是,您必须只填充轴0和1,而不是轴2(颜色分量)。
paddedimg=np.pad(img, ((200,200), (200,200), (0,0)), mode='constant')

字符串
(意思是(上200,下200),(左200,右200),(没有额外的颜色分量))

相关问题