如何修改Python OpenCV图像处理代码避免覆盖原图像并写入新文件
解决方案
核心原因是你的代码直接使用原文件路径作为保存路径,因此会覆盖原图。只需修改保存时的目标路径即可,下面提供两种常用实现方案:
方案1:同目录下加后缀保存
处理后的图片和原图保存在同一个文件夹,文件名添加自定义后缀区分,无需新建目录:
首先需要导入os模块处理路径,修改后代码如下:
import os import cv2 import numpy as np import glob def drop_green_from_path(path_list, suffix='_no_green'): for img_path in path_list: src = cv2.imread(img_path, cv2.IMREAD_UNCHANGED) # 剔除绿色通道,直接赋值0比创建zeros数组更高效 src[:,:,1] = 0 # 拆分路径生成新文件名 dir_path, full_name = os.path.split(img_path) base_name, ext = os.path.splitext(full_name) new_file_name = f"{base_name}{suffix}{ext}" new_save_path = os.path.join(dir_path, new_file_name) # 保存到新路径,不会覆盖原图 cv2.imwrite(new_save_path, src) DATA_IMAGES_PATHS= glob.glob('../data/train/train-1-0/*.png') drop_green_from_path(DATA_IMAGES_PATHS)
方案2:保存到指定独立目录
所有处理后的图片统一保存到单独的输出文件夹,文件管理更清晰,适合批量处理场景:
import os import cv2 import numpy as np import glob def drop_green_from_path(path_list, output_dir='../data/processed_no_green/'): # 自动创建输出目录,已存在时不会报错 os.makedirs(output_dir, exist_ok=True) for img_path in path_list: src = cv2.imread(img_path, cv2.IMREAD_UNCHANGED) src[:,:,1] = 0 # 直接用原文件名保存到新目录 file_name = os.path.basename(img_path) new_save_path = os.path.join(output_dir, file_name) cv2.imwrite(new_save_path, src) DATA_IMAGES_PATHS= glob.glob('../data/train/train-1-0/*.png') # 调用时也可以自定义输出目录 drop_green_from_path(DATA_IMAGES_PATHS, output_dir='./my_output/')
额外优化说明
- 原代码中
src[:,:,1] = np.zeros([src.shape[0], src.shape[1]])可以直接简化为src[:,:,1] = 0,numpy会自动广播赋值,不需要额外创建全零数组,运行效率更高 - 如果需要同时保留两种特性,也可以同时加后缀和指定输出目录,按需修改即可
内容的提问来源于stack exchange,提问作者Hector Auvinen
相关产品推荐
相关产品推荐

