返回顶部
o

organise-photos智能照片整理

Organize a photo folder by cleaning non-photo files, removing bad exposures, detecting blur and burst shots, and classifying photos into numbered subfolders using AI vision analysis.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.0
安全检测
已通过
253
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

organise-photos

照片文件夹整理工具

智能整理照片文件夹:清理非照片文件,本地删除曝光不佳的照片,通过Python检测模糊/连拍,使用AI视觉分析内容,并分类到子文件夹中。

使用方法

用户想要整理一个照片文件夹:$ARGUMENTS

如果用户没有提供文件夹路径,请要求他们提供一个。

语言提示:检测用户使用的语言,并在整个会话过程中使用该语言回复。分类文件夹名称也应使用用户的语言。



步骤1:扫描文件夹

扫描文件夹中的所有文件(仅在根层级,不递归):

bash

列出所有文件及其大小


ls -la $FOLDER

查找照片文件(常见扩展名)

find $FOLDER -maxdepth 1 -type f \( \ -iname .jpg -o -iname .jpeg -o -iname *.png \ -o -iname .heic -o -iname .heif \ -o -iname .raw -o -iname .cr2 -o -iname *.cr3 \ -o -iname .nef -o -iname .arw -o -iname *.dng \ -o -iname .tiff -o -iname .tif -o -iname *.bmp \ -o -iname .webp -o -iname .gif \ \)

查找非照片文件

find $FOLDER -maxdepth 1 -type f ! \( \ -iname .jpg -o -iname .jpeg -o -iname *.png \ -o -iname .heic -o -iname .heif \ -o -iname .raw -o -iname .cr2 -o -iname *.cr3 \ -o -iname .nef -o -iname .arw -o -iname *.dng \ -o -iname .tiff -o -iname .tif -o -iname *.bmp \ -o -iname .webp -o -iname .gif \ \)

向用户报告:

  • - 找到的文件总数
  • 照片文件数量
  • 非照片文件数量(列出它们)



步骤2:处理非照片文件

使用AskUserQuestion(仅当存在非照片文件时):

问题:找到N个非照片文件。您希望如何处理它们?
选项:

  • - 移动到_misc子文件夹(推荐)
  • 删除所有非照片文件
  • 保持原样

bash
mkdir -p $FOLDER/_misc
mv [非照片文件] $FOLDER/_misc/



步骤3:删除曝光不佳的照片(本地Python)

使用AskUserQuestion

问题:您是否希望删除严重曝光不佳的照片(接近全黑或全白)?
选项:

  • - 是,使用默认阈值(亮度平均值 < 5% 或 > 95%)(推荐)
  • 是,让我指定自定义阈值
  • 否,保留所有照片

运行Python脚本检测并报告曝光不佳的照片,但暂不删除

python
#!/usr/bin/env python3
使用Pillow检测接近全黑或全白的照片。
import sys
import os
from pathlib import Path

try:
from PIL import Image
import numpy as np
except ImportError:
os.system(pip install Pillow numpy -q)
from PIL import Image
import numpy as np

FOLDER = sys.argv[1]
LOW_THRESH = float(sys.argv[2]) if len(sys.argv) > 2 else 0.05 # < 5% = 接近全黑
HIGH_THRESH = float(sys.argv[3]) if len(sys.argv) > 3 else 0.95 # > 95% = 接近全白

PHOTO_EXTS = {.jpg, .jpeg, .png, .heic, .heif, .bmp,
.tiff, .tif, .webp, .gif}

bad = []
for f in sorted(Path(FOLDER).iterdir()):
if f.suffix.lower() not in PHOTO_EXTS:
continue
try:
with Image.open(f) as img:
# 转换为灰度图进行亮度分析
gray = img.convert(L)
arr = np.array(gray, dtype=np.float32) / 255.0
mean = float(arr.mean())
if mean < LOWTHRESH or mean > HIGHTHRESH:
label = 接近全黑 if mean < LOW_THRESH else 接近全白
bad.append((f.name, mean, label))
except Exception as e:
print(f跳过 {f.name}: {e}, file=sys.stderr)

if not bad:
print(未发现严重曝光不佳的照片。)
else:
print(f发现 {len(bad)} 张有问题的照片:)
for name, mean, label in bad:
print(f {label} 亮度={mean:.3f} {name})

运行:python3 /tmp/detectbadexposure.py $FOLDER 0.05 0.95

向用户显示列表,然后确认后再删除

bash
rm $BAD_PHOTO


mkdir -p $FOLDER/rejectedexposure
mv $BADPHOTO $FOLDER/rejected_exposure/


步骤4:检测模糊和连拍照片(本地Python)

对所有剩余照片运行全面的Python分析脚本。此步骤:

  1. 1. 为每张照片的清晰度评分(拉普拉斯方差)
  2. 检测连拍组(3秒内拍摄的照片或感知哈希几乎相同的照片)

python
#!/usr/bin/env python3
分析照片的模糊度和连拍分组。
import sys
import os
import json
from pathlib import Path
from datetime import datetime

try:
import cv2
import numpy as np
from PIL import Image
from PIL.ExifTags import TAGS
import imagehash
except ImportError:
os.system(pip install opencv-python-headless Pillow imagehash numpy -q)
import cv2
import numpy as np
from PIL import Image
from PIL.ExifTags import TAGS
import imagehash

FOLDER = sys.argv[1]
BLUR_THRESHOLD = float(sys.argv[2]) if len(sys.argv) > 2 else 80.0 # 拉普拉斯方差低于此值 = 模糊
BURST_SECONDS = int(sys.argv[3]) if len(sys.argv) > 3 else 3 # 拍摄间隔秒数 = 同一连拍
PHASH_DIST = int(sys.argv[4]) if len(sys.argv) > 4 else 8 # 感知哈希距离阈值

PHOTO_EXTS = {.jpg, .jpeg, .png, .heic, .heif, .bmp,
.tiff, .tif, .webp}

def getexifdatetime(img_path):
从EXIF中提取原始日期时间。
try:
with Image.open(img_path) as img:
exifdata = img.getexif()
if exif_data:
for tagid, value in exifdata.items():
tag = TAGS.get(tagid, tagid)
if tag == DateTimeOriginal:
return datetime.strptime(value, %Y:%m:%d %H:%M:%S)
except Exception:
pass
# 回退到文件修改时间
return datetime.fromtimestamp(Path(imgpath).stat().stmtime)

def laplaciansharpness(imgpath):
计算拉普拉斯方差作为清晰度评分。数值越高越清晰。
img = cv2.imread(str(img_path))
if img is None:
return 0.0
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return float(cv2.Laplacian(gray, cv2.CV_64F).var())

收集所有照片

photos = [] for f in sorted(Path(FOLDER).iterdir()): if f.suffix.lower() not in PHOTO_EXTS or f.name.startswith(.): continue photos.append(f)

print(f正在分析 {len(photos)} 张照片..., flush=True)

results = []
for i, f in enumerate(photos):
print(f [{i+1}/{len(photos)}] {f.name}, flush=True)
dt = getexifdatetime(f)
sharp = laplacian_sharpness(f)
try:
ph = imagehash.phash(Image.open(f))
except Exception:
ph = None
results.append

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 organise-photos-1776164470 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 organise-photos-1776164470 技能

通过命令行安装

skillhub install organise-photos-1776164470

下载

⬇ 下载 organise-photos v1.0.0(免费)

文件大小: 5.98 KB | 发布时间: 2026-4-15 14:00

v1.0.0 最新 2026-4-15 14:00
Photo Folder Organizer initial public release.

- Organizes photo folders by removing non-photo files, cleaning up bad exposures (near-black or near-white), and sorting images using AI analysis.
- Detects and offers to remove or move non-photo files.
- Identifies photos with poor exposure and allows user review before deletion.
- Runs local Python scripts to detect blurry images and burst shot groups for organization.
- Classifies and sorts photos into numbered, descriptive subfolders, with all interactions and folder names in the user’s language.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部