图像缩放后所有输出均为同一张图的问题排查求助(Colab环境)
图像批量缩放输出重复问题排查与修复
核心错误原因
你代码里的第二个图像处理循环存在致命问题:没有重新生成当前图像的完整路径。第一个循环中你给ruta_img赋值了对应图像的路径,但第二个循环里仅写了ruta_img这行无效代码,没有根据当前循环的img重新拼接路径,导致每次都复用第一个循环最后一次的ruta_img值,最终所有输出图像都是同一张。
核心修复步骤
修改第二个循环,每次迭代都重新生成当前图像的完整路径:
for img in listaimg: # 关键修复:重新拼接当前图像的完整路径 ruta_img = os.path.join(pixelextract, img) if img.endswith(".jpg") or img.endswith(".PNG") : try: imgopen= Image.open(ruta_img) imgsized= imgopen.resize(newsize) ruta_sizedimg= os.path.join(pixelsized, img) imgsized.save(ruta_sizedimg) counter += 1 plt.clf() except Exception as e: # 修复异常输出:用当前文件名而非未定义的imgopen,同时打印具体错误 print(f'处理文件 {img} 出错,计数:{counter},错误信息:{str(e)}')
其他优化建议
- 提前创建输出文件夹:如果
pixelsized文件夹不存在,保存图像会报错,在定义pixelsized后添加:os.makedirs(pixelsized, exist_ok=True) - 统一后缀判断逻辑:改成小写匹配,避免遗漏
.png等小写后缀的文件:if img.lower().endswith((".jpg", ".png")): - 路径写法规范:Colab中路径用单斜杠
/更通用,把//content//pixelxtract改成/content/pixelxtract。
完整修复后代码
from google.colab import files import os import zipfile import matplotlib.pyplot as plt from PIL import Image archivos = files.upload() # 解压zip文件 with zipfile.ZipFile("pixelsdataset.zip", "r") as zip_ref: zip_ref.extractall("pixelxtract") pixelextract = '/content/pixelxtract' pixelsized = '/content/pixelsized' # 确保输出文件夹存在 os.makedirs(pixelsized, exist_ok=True) listaimg = os.listdir(pixelextract) print("原始图像列表:", listaimg) # 预览原始图像 for img in listaimg: if img.lower().endswith((".jpg", ".png")): ruta_img = os.path.join(pixelextract, img) imagenfull = plt.imread(ruta_img) plt.imshow(imagenfull) plt.title(img) plt.show() plt.clf() newsize = (500, 500) counter = 0 # 批量缩放图像 for img in listaimg: ruta_img = os.path.join(pixelextract, img) if img.lower().endswith((".jpg", ".png")): try: imgopen = Image.open(ruta_img) imgsized = imgopen.resize(newsize) ruta_sizedimg = os.path.join(pixelsized, img) imgsized.save(ruta_sizedimg) counter += 1 plt.clf() except Exception as e: print(f'处理文件 {img} 出错,计数:{counter},错误:{str(e)}') # 预览缩放后的图像 listaimgszed = os.listdir(pixelsized) print("缩放后图像列表:", listaimgszed) counter = 0 for img in listaimgszed: if img.lower().endswith((".jpg", ".png")): ruta_sizedimg = os.path.join(pixelsized, img) resultado = plt.imread(ruta_sizedimg) plt.imshow(resultado) plt.title(f"{img} ({counter+1}/{len(listaimgszed)})") plt.show() counter += 1
内容的提问来源于stack exchange,提问作者omarzmr
相关产品推荐
相关产品推荐

