使用OpenCV调整图像数据集尺寸时遇func!=0断言错误的解决方法
解决OpenCV resize报错:
func != 0的问题 我之前处理图像缩放时也碰到过这个坑,这个断言错误基本都是OpenCV对输入图像的数据类型或数值范围不满意导致的,咱们来一步步解决:
最常见的原因:图像是浮点数类型(0-1范围)
OpenCV的cv.resize默认是为uint8类型的图像(数值范围0-255)设计的,如果你的数据集是归一化后的浮点数(比如0到1之间),它会找不到合适的插值函数,直接抛出这个错误。
修复代码:先转成uint8类型
在resize之前,把浮点数图像映射到0-255范围并转换类型就行:
import cv2 as cv import numpy as np def resize_dataset(images): resized_images = [] for img in images: img = img.reshape((28,28)) # 处理浮点数图像的情况 if img.dtype in (np.float32, np.float64): img = (img * 255).astype(np.uint8) resized_img = cv.resize(img, dsize=(10, 10)) resized_images.append(resized_img) return np.array(resized_images)
额外检查:确认图像是2D数组
虽然你已经用reshape((28,28))处理了,但如果原始数据不小心带了多余的通道维度(比如(28,28,1)),也可能触发问题,可以加个小检查:
# 在resize前确保是2D灰度图 if len(img.shape) != 2: img = img.squeeze() # 去掉多余的单通道维度
替代方案:用scikit-image的resize(更友好支持浮点数)
如果不想纠结OpenCV的类型限制,直接用skimage的resize函数,它对浮点数图像支持更好,还自带抗锯齿:
from skimage.transform import resize import numpy as np def resize_dataset(images): resized_images = [] for img in images: img = img.reshape((28,28)) resized_img = resize(img, (10,10), anti_aliasing=True) resized_images.append(resized_img) return np.array(resized_images)
内容的提问来源于stack exchange,提问作者zeyger
相关产品推荐
相关产品推荐

