clean-scan

star 3

Очистка сканов PDF от серого/желтого фона. Адаптивный подбор параметров под конкретный скан. Use for: clean scan, remove background, pdf scan cleaning, убрать фон, очистить скан, белый фон. Triggers: "очистить скан", "убрать фон", "clean scan", "remove background", "pdf cleaning", "скан фон"

imvladikon By imvladikon schedule Updated 2/26/2026

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: Визуальный анализ

Проанализируй изображение по этим критериям:
  1. Цвет фона: серый / желтоватый / коричневый / неравномерный
  2. Интенсивность фона: светлый (>200) / средний (150-200) / тёмный (<150)
  3. Равномерность: равномерный / градиент / пятна / тени по краям
  4. Качество текста: чёткий / слегка размытый / очень размытый
  5. Контраст: высокий / средний / низкий
  6. Артефакты: шум / точки / линии сгиба / пятна
  7. Размер шрифта: крупный / средний / мелкий (формулы, сноски)

Шаг 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"

Автоматический режим:

  1. Извлекает 3 страницы из разных частей PDF
  2. Анализирует характеристики фона
  3. Классифицирует тип скана
  4. Подбирает оптимальные параметры
  5. Обрабатывает весь PDF

Классификация типов сканов

Тип Признаки Параметры
GRAY_UNIFORM Равномерный серый фон Стандартные
YELLOW_AGED Желтая бумага (высокий b* в LAB) Агрессивное отбеливание
UNEVEN_LIGHTING Тени, градиенты Большой kernel + CLAHE
HIGH_CONTRAST Уже контрастный Мягкая обработка
CLEAN Чистый фон Пропустить
COLOR_PAGE Цветная страница Пропустить

Алгоритм очистки

  1. Морфологическое выделение фона: cv2.morphologyEx(MORPH_CLOSE) с большим ядром
  2. Нормализация освещения: деление изображения на фон
  3. Растяжение контраста: по перцентилям (устойчиво к выбросам)
  4. Отбеливание: пиксели светлее порога → белые
  5. Повышение резкости: 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"

Типичные проблемы

Это нормально при lossless PNG сжатии. Для уменьшения: - Понизь DPI (150 вместо 200) - Используй JPEG сжатие в финальном PDF - Уменьши whitening_threshold (230 → 225) - Уменьши percentile_high (98 → 97) - Увеличь kernel_size (41 → 51 или 61) - Включи CLAHE для неравномерного освещения - Уменьши kernel_size (41 → 35) - Увеличь DPI (200 → 250)
Install via CLI
npx skills add https://github.com/imvladikon/dot-claude --skill clean-scan
Repository Details
star Stars 3
call_split Forks 1
navigation Branch main
article Path SKILL.md
More from Creator