name: clean-scan description: | Очистка сканов PDF от серого/желтого фона. Адаптивный подбор параметров под конкретный скан. Use for: clean scan, remove background, pdf scan cleaning, убрать фон, очистить скан, белый фон. Triggers: "очистить скан", "убрать фон", "clean scan", "remove background", "pdf cleaning", "скан фон" allowed-tools: Bash, Read, Write, Edit, Glob
Очистка сканов PDF от фона
Адаптивная очистка сканированных PDF от серого/желтого фона с автоматическим подбором параметров.
Окружение
Скрипты используют общий venv для skills:
source ~/.claude/venv/bin/activate
Быстрый старт
Если пользователь просто хочет очистить PDF без деталей:
source ~/.claude/venv/bin/activate
python3 ~/.claude/skills/clean-scan/adaptive_cleaner.py "input.pdf" "output_cleaned.pdf"
Интерактивный режим (рекомендуется для новых сканов)
Шаг 1: Извлечь тестовую страницу
# Извлечь страницу ~50 (середина книги) для анализа
pdftoppm -png -f 50 -l 50 -r 150 "input.pdf" /tmp/sample_page
ls -la /tmp/sample_page*.png
Шаг 2: Показать страницу пользователю
Попроси пользователя показать изображение /tmp/sample_page-050.png (или как назвался файл).
Шаг 3: Визуальный анализ
- Цвет фона: серый / желтоватый / коричневый / неравномерный
- Интенсивность фона: светлый (>200) / средний (150-200) / тёмный (<150)
- Равномерность: равномерный / градиент / пятна / тени по краям
- Качество текста: чёткий / слегка размытый / очень размытый
- Контраст: высокий / средний / низкий
- Артефакты: шум / точки / линии сгиба / пятна
- Размер шрифта: крупный / средний / мелкий (формулы, сноски)
Шаг 4: Подбор параметров
kernel_size (размер ядра морфологии):
- 31-37: мелкий шрифт, много деталей, формулы
- 41: стандартный (по умолчанию)
- 47-51: тёмный/неравномерный фон
- 61: сильно неравномерное освещение
percentile_low / percentile_high (перцентили контраста):
- 1 / 99: уже достаточно контрастный скан
- 2 / 98: стандартный (по умолчанию)
- 3 / 97: низкий контраст, много шума
whitening_threshold (порог отбеливания):
- 230: тёмный/желтый фон (агрессивное отбеливание)
- 235: стандартный (по умолчанию)
- 240-245: светлый фон (мягкое отбеливание)
- None: не отбеливать (уже чистый фон)
sharpness_factor / sharpness_subtract (резкость):
- 1.2 / 0.2: уже резкий, не усиливать
- 1.4 / 0.4: стандартный (по умолчанию)
- 1.5 / 0.5: размытый текст
dpi (разрешение извлечения):
- 150: быстро, компактно, достаточно для чтения
- 200: стандартный (по умолчанию)
- 250-300: мелкий шрифт, нужна высокая детализация
Типичные профили:
| Тип скана | kernel | percentiles | whitening | sharpness | dpi |
|---|---|---|---|---|---|
| Стандартный серый фон | 41 | 2/98 | 235 | 1.4/0.4 | 200 |
| Старая желтая бумага | 47 | 2/98 | 230 | 1.3/0.3 | 200 |
| Неравномерное освещение | 61 | 3/97 | 240 | 1.4/0.4 | 200 |
| Мелкий шрифт/формулы | 35 | 2/98 | 235 | 1.5/0.5 | 250 |
| Высокий контраст | 41 | 1/99 | 245 | 1.2/0.2 | 200 |
Шаг 5: Тест на одной странице
source ~/.claude/venv/bin/activate
python3 ~/.claude/skills/clean-scan/adaptive_cleaner.py --test-page 50 \
--kernel 41 \
--percentiles 2 98 \
--whitening 235 \
--sharpness 1.4 0.4 \
--dpi 200 \
"input.pdf"
Это создаст test_original.png и test_cleaned.png для сравнения.
Шаг 6: Обработка всего PDF
После подтверждения параметров:
python3 ~/.claude/skills/clean-scan/adaptive_cleaner.py \
--kernel 41 \
--percentiles 2 98 \
--whitening 235 \
--sharpness 1.4 0.4 \
--dpi 200 \
--skip-pages 1 \
"input.pdf" "output_cleaned.pdf"
Автоматический режим
Скрипт может сам проанализировать скан и подобрать параметры:
python3 ~/.claude/skills/clean-scan/adaptive_cleaner.py --auto "input.pdf" "output.pdf"
Автоматический режим:
- Извлекает 3 страницы из разных частей PDF
- Анализирует характеристики фона
- Классифицирует тип скана
- Подбирает оптимальные параметры
- Обрабатывает весь PDF
Классификация типов сканов
| Тип | Признаки | Параметры |
|---|---|---|
| GRAY_UNIFORM | Равномерный серый фон | Стандартные |
| YELLOW_AGED | Желтая бумага (высокий b* в LAB) | Агрессивное отбеливание |
| UNEVEN_LIGHTING | Тени, градиенты | Большой kernel + CLAHE |
| HIGH_CONTRAST | Уже контрастный | Мягкая обработка |
| CLEAN | Чистый фон | Пропустить |
| COLOR_PAGE | Цветная страница | Пропустить |
Алгоритм очистки
- Морфологическое выделение фона:
cv2.morphologyEx(MORPH_CLOSE)с большим ядром - Нормализация освещения: деление изображения на фон
- Растяжение контраста: по перцентилям (устойчиво к выбросам)
- Отбеливание: пиксели светлее порога → белые
- Повышение резкости: unsharp mask
Зависимости
# Python
pip install opencv-python numpy img2pdf
# Системные
sudo apt install poppler-utils ghostscript
Удаление страниц
После очистки можно удалить ненужные страницы (обложки, пустые):
# Удалить страницы 2,3,4
qpdf --empty --pages "input.pdf" 1,5-z -- "output.pdf"
# Оставить только страницы 10-100
qpdf --empty --pages "input.pdf" 10-100 -- "output.pdf"