使用for循环批量转换RGB图像为YCbCr时遇TypeError的解决方法
解决OpenCV转换图像格式时的TypeError问题
嘿,我来帮你搞定这个报错!你遇到的TypeError: src is not a numpy array, neither a scalar,核心原因很直白:你直接把filename(这只是个字符串格式的文件名)传给了cv2.cvtColor,但这个函数需要的是已经读取到内存里的图像numpy数组,不是文件名本身呀~
修复后的代码
我帮你把代码调整好了,加了详细注释,适合编程基础薄弱的你直接用:
import numpy as np import cv2, os # 替换成你的图像目录实际路径 path = 'the_path_to_the_images' # 遍历目录里的每个文件 for filename in os.listdir(path): # 1. 拼接完整的文件路径(必须!不然OpenCV找不到目标文件) full_file_path = os.path.join(path, filename) # 2. 先读取图像,得到numpy数组格式的图像数据 img = cv2.imread(full_file_path) # 先检查图像是否读取成功(避免因为非图像文件触发报错) if img is not None: # 3. 把BGR格式转成YCbCr(注意OpenCV默认读入是BGR,不是RGB哦) ycbcr_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 4. 保存转换后的图像,建议加个后缀区分原文件,避免误覆盖 name, ext = os.path.splitext(filename) save_name = f"{name}_ycbcr{ext}" save_path = os.path.join(path, save_name) cv2.imwrite(save_path, ycbcr_img) else: print(f"无法读取文件:{full_file_path},可能不是图像文件")
更简洁的替代方案(用glob)
如果你觉得os.listdir还要手动拼接路径麻烦,可以用glob直接获取所有图像的完整路径,代码更简洁直观:
import cv2 from glob import glob # 匹配目录下所有常见图像格式(可以根据需要添加,比如.png/.bmp等) image_paths = glob('the_path_to_the_images/*.jpg') + glob('the_path_to_the_images/*.jpeg') for img_path in image_paths: img = cv2.imread(img_path) if img is not None: ycbcr_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 给保存的文件加后缀,区分原图像 name, ext = os.path.splitext(img_path) cv2.imwrite(f"{name}_ycbcr{ext}", ycbcr_img)
额外小提醒
- OpenCV读入的图像默认是BGR格式,不是你提到的RGB,所以用
cv2.COLOR_BGR2YCrCb是正确的,不用改成RGB相关的转换参数哦~ - 保存的时候尽量不要直接覆盖原图像,加个后缀区分会更安全!
内容的提问来源于stack exchange,提问作者bit_scientist
相关产品推荐
相关产品推荐

