如何筛选含条件元素的大量图片?实现单张图片审核与名称留存判断
针对图片筛选+交互式留存需求的解决方案
我来帮你搞定这两个需求,分两种场景给你方案:一种是用Python脚本自定义实现(灵活度拉满),另一种是用现成工具快速解决(不用写一行代码)。
方案一:Python脚本自定义实现(完全可控)
1. 批量筛选符合条件的图片
筛选需求分两类,我都给你写好示例代码:
(1)基于元数据/属性筛选(比如尺寸、格式、拍摄日期)
用Pillow库就能轻松搞定,先安装依赖:
pip install pillow
比如筛选宽度≥1920像素且格式为JPG/PNG的图片,脚本如下:
from PIL import Image import os def filter_images_by_metadata(folder_path, min_width=1920, allowed_formats=('jpg', 'jpeg', 'png')): filtered = [] for filename in os.listdir(folder_path): ext = filename.split('.')[-1].lower() if ext not in allowed_formats: continue try: with Image.open(os.path.join(folder_path, filename)) as img: width, height = img.size if width >= min_width: filtered.append(filename) print(f"符合条件:{filename}") except Exception as e: print(f"无法读取{filename}:{e}") # 把筛选结果保存到文件 with open("filtered_images.txt", "w") as f: f.write('\n'.join(filtered)) print(f"筛选完成,共找到{len(filtered)}张符合条件的图片,结果已保存到filtered_images.txt") # 替换成你的图片文件夹路径 filter_images_by_metadata("/path/to/your/image/folder")
如果需要按拍摄日期筛选,可以加exifread库读取EXIF信息,安装后在脚本里加判断逻辑就行。
(2)基于图像内容筛选(比如包含特定物体、颜色)
如果要筛选包含特定内容的图片,比如红色物体、猫,用OpenCV做简单识别:
先安装依赖:
pip install opencv-python numpy
示例:筛选**红色占比超过10%**的图片:
import cv2 import numpy as np import os def filter_images_by_color(folder_path, threshold=0.1): filtered = [] # 定义红色的HSV范围 lower_red = np.array([0, 120, 70]) upper_red = np.array([10, 255, 255]) lower_red2 = np.array([170, 120, 70]) upper_red2 = np.array([180, 255, 255]) for filename in os.listdir(folder_path): ext = filename.split('.')[-1].lower() if ext not in ('jpg', 'jpeg', 'png'): continue img_path = os.path.join(folder_path, filename) img = cv2.imread(img_path) if img is None: print(f"无法读取{filename}") continue hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask1 = cv2.inRange(hsv, lower_red, upper_red) mask2 = cv2.inRange(hsv, lower_red2, upper_red2) mask = mask1 + mask2 # 计算红色区域占比 red_pixels = cv2.countNonZero(mask) total_pixels = img.shape[0] * img.shape[1] if red_pixels / total_pixels >= threshold: filtered.append(filename) print(f"符合条件:{filename}") with open("color_filtered_images.txt", "w") as f: f.write('\n'.join(filtered)) print(f"筛选完成,共找到{len(filtered)}张符合条件的图片") filter_images_by_color("/path/to/your/image/folder")
2. 交互式逐个查看并留存文件名
这个脚本会遍历图片,逐个打开让你查看,输入y就记录文件名,输入n跳过,最后生成留存列表:
from PIL import Image import os import subprocess def open_image(img_path): # 根据系统选择默认打开方式 if os.name == 'nt': os.startfile(img_path) elif os.name == 'posix': subprocess.run(['open' if os.uname().sysname == 'Darwin' else 'xdg-open', img_path]) def interactive_select_images(folder_path): keep_list = [] image_files = [f for f in os.listdir(folder_path) if f.lower().endswith(('jpg', 'jpeg', 'png'))] for idx, filename in enumerate(image_files, 1): img_path = os.path.join(folder_path, filename) print(f"正在查看第{idx}/{len(image_files)}张:{filename}") try: open_image(img_path) # 等待用户输入 choice = input("留存此图片?(y/n,输入q退出):").lower() if choice == 'y': keep_list.append(filename) print(f"已添加到留存列表") elif choice == 'q': break except Exception as e: print(f"无法打开{filename}:{e}") continue # 保存留存列表 with open("kept_images.txt", "w") as f: f.write('\n'.join(keep_list)) print(f"交互完成,共留存{len(keep_list)}张图片,列表已保存到kept_images.txt") interactive_select_images("/path/to/your/image/folder")
方案二:现成工具快速解决(无需编程)
如果你不想写代码,这些工具能快速搞定:
1. 批量筛选图片
- Windows/macOS通用:用XnView MP,支持按尺寸、格式、EXIF信息(拍摄日期、相机型号)筛选,还能简单识别图像内容(比如颜色、物体),筛选后可以直接导出文件名列表。
- Linux:用
find命令结合identify(ImageMagick工具),比如筛选宽度≥1920的JPG:
find /path/to/folder -type f -name "*.jpg" -exec identify -format "%w %f\n" {} \; | awk '$1 >= 1920 {print $2}' > filtered.txt
2. 交互式查看留存
- Windows:用IrfanView,打开图片文件夹后进入幻灯片模式(按
S),按M标记要留存的图片,最后在文件→批量重命名/转换里导出标记的文件名,或者直接把标记的图片复制到新文件夹。 - macOS/Linux:用
feh图片查看器,绑定快捷键记录选中的图片,比如先安装feh,然后运行:
feh -F /path/to/folder --action1 "echo %f >> kept_images.txt"
按1键就会把当前图片名写入kept_images.txt,按右箭头跳转到下一张。
注意事项
- 操作前一定要备份原图片文件夹,避免误操作导致文件丢失。
- 处理上千张图片时,Python脚本可能需要一点时间,耐心等待就行。
- 如果是内容筛选,简单的颜色/物体识别可能有误差,你可以根据需求调整阈值或模型。
内容的提问来源于stack exchange,提问作者Ziv Kassner
相关产品推荐
相关产品推荐

