OpenCV无法调整大小()从pygame.PixelArray创建的numpy数组,错误:src数据类型= 8不受支持。

14 浏览
0 Comments

OpenCV无法调整大小()从pygame.PixelArray创建的numpy数组,错误:src数据类型= 8不受支持。

我想要对一个numpy数组中的图像进行缩放。\n例如,我有这张可口可乐瓶的图片:\nbottle-1\n它对应一个形状为(528, 203, 3)的numpy数组,我想要将它缩放到与这张第二张图片一样大小:\nbottle-2\n它的形状为(140, 54, 3)。\n我要如何改变图像的大小而保持原始图像?其他答案建议去除每隔一行或第三行,但我想要做的是像图像编辑器那样缩小图像,只不过用Python代码实现。是否有任何在numpy/SciPy中实现此功能的库?

0
0 Comments

OpenCV无法调整由pygame.PixelArray创建的numpy数组的大小,错误:src数据类型= 8不受支持。这个问题的出现原因是OpenCV的resize()函数不支持数据类型为8的数组。解决方法是将数据类型转换为OpenCV支持的类型。

解决方法如下:

1. 首先,使用numpy的astype()函数将数据类型转换为OpenCV支持的类型。代码如下:

import numpy as np
import cv2
# 创建pygame.PixelArray
pixel_array = pygame.PixelArray(surface)
# 将数据类型转换为OpenCV支持的类型
pixel_array = pixel_array.astype(np.uint8)
# 使用OpenCV的resize()函数调整大小
resized_image = cv2.resize(pixel_array, (new_width, new_height))

2. 确保像素数组的数据类型为8位无符号整数(np.uint8)。

这样,就可以通过将数据类型转换为OpenCV支持的类型来解决这个问题。这个解决方法非常简单和有效,可以帮助你调整由pygame.PixelArray创建的numpy数组的大小,而不会出现上述错误。

0
0 Comments

OpenCV无法对从pygame.PixelArray创建的numpy数组进行resize()操作,错误:src数据类型=8不支持。造成这个问题的原因是OpenCV只支持特定的数据类型进行resize操作。解决方法是使用scikit-image库的resize函数来进行图像处理。具体操作如下:

from skimage.transform import resize
bottle_resized = resize(bottle, (140, 54))

这个函数会自动处理插值、抗锯齿等问题。需要注意的是,该函数返回的是float类型的ndarray数组,而不是uint8类型。如果要保持原始图像的范围,可以添加preserve_range=True参数。

以上方法适用于任意通道数的图像。但是需要注意的是,有用户在使用上述方法将大小为(137,236,3)的图像数组缩放为(64,64)时,发现图像变为单一颜色,似乎丢失了所有信息。这可能是正常现象,因为resize操作可能会导致信息丢失。如果要保留通道数,应该得到(64,64,3)的图像。可以尝试添加preserve_range=True参数来保留范围,例如:

skimage.transform.resize(..., , preserve_range=True)

这样可以保持图像的范围。

0
0 Comments

问题原因:出现此问题的原因是OpenCV的resize()函数不支持从pygame.PixelArray创建的numpy数组。

解决方法:可以使用其他库(如scikit-image)来代替OpenCV的resize()函数。另外,还可以尝试使用其他插值算法(如skimage.transform.resize函数的order参数)来达到期望的结果。

最近有人在使用OpenCV的resize()函数时遇到了一个问题。他尝试将一个从pygame.PixelArray创建的numpy数组进行调整大小,但是遇到了以下错误信息:src data type = 8 is not supported。

根据错误信息,我们可以知道问题出在resize()函数中的数据类型不被支持。经过一番搜索,我找到了一种解决方法。

首先,我们需要安装OpenCV库,这是一个用于图像处理和计算机视觉的库。然后,我们可以使用cv2.resize()函数来调整图像的大小。以下是一个示例代码:

import cv2
import numpy as np
img = cv2.imread('your_image.jpg')
res = cv2.resize(img, dsize=(54, 140), interpolation=cv2.INTER_CUBIC)

在这个代码中,img是一个包含原始图像的numpy数组,而res是一个包含调整大小后图像的numpy数组。需要注意的是,插值参数是一个重要的方面。插值算法有几种不同的方法可供选择,具体取决于调整大小的需求。其中包括最近邻插值、双线性插值、像素区域插值、双三次插值和兰索斯插值等。

不同的插值算法有不同的特点,没有一种是绝对最好的。根据不同的调整大小方案,可能会有一种策略优于另一种。

另外,还有一种避免使用cv2的方法。可以使用scikit-image库的imread()和resize()函数来替代。这样做的好处是不会交换图像的维度,并且默认加载图像的通道顺序是RGB,而不是BGR。以下是示例代码:

import skimage.io
from skimage.transform import resize
img = skimage.io.imread('your_image.jpg')
res = resize(img, (140, 54), order=3)

需要注意的是,skimage.transform.resize函数的order参数可以控制插值算法的使用。order=0表示最近邻插值,1表示双线性插值,2表示双二次插值,3表示双三次插值等。然而,skimage.transform.resize函数没有提供像素区域插值和兰索斯插值等插值算法。

总之,根据个人需求和性能要求,可以选择使用cv2或者skimage库来调整图像的大小。cv2库速度更快,而skimage库提供了更多的插值算法选项。

0