Сравнение сканеров, которые я использовал в разное время:
Фрагмент, перемасштабированный к разрешению 1200dpi. У acer разрешение было исходно чуть лучше, у бумаги чуть хуже. Canon умеет сканировать до 4800dpi, но улучшения качества на больших разрешениях я не заметил.
Пленки загружаются в держатель по два 6-кадровых куска и сканируются вместе. Получение инфракрасного канала - это дополнительный, довольно долгий проход. Для сканирования я сделал простой скрипт, который запускает scanimage и, после сканирования, делает jpg-превьюшку с более-менее осмысленными цветами. Сканирую на 1200 dpi (сканер поддерживает 2400 и 4800, но для моих негативов это слишком много, а времени требует пропорционально больше).
Скрипты и программы я выкладываю сюда: https://github.com/slazav/ph_scan
Цветной 48-битный pnm занимает 164 Mb, плюс 64 Mb на инфракрасный канал. Выглядит результат как-то так (преобразовано в 24-битный jpg):
В этом примере картинка не видна в инфракрасном канале, видна только пыль, что очень удобно. Однако, на некоторых пленках это, увы, не так.
Следующий шаг: я открываю превьюшку в xfig (у меня это делается по нажатию кнопки в программы для просмотра фотографий) и отмечаю прямоугольниками границы кадров. Теперь можно запустить скрипт, который делает следующее:
Проблема: инфракрасный канал не совсем точно совпадает с остальными, он немного сдвинут и растянут. Некая постоянная калибровка у меня зашита в скрипте для вырезания кадров, небольшой дополнительный сдвиг определяется и делается в программе для удаления пыли.
Пыль находится довольно простям способом: ищутся локальные минимумы по вертикали и горизонтали, с заданным размером (обычно +/- 5 точек) и глубиной не меньше заданного значения (обычно 5% от всего цветового диапазона). Программа для коррекции цвета и преобразования в 24-битную картинку примерно та же, что я использовал при сканировании на acer.
Вырезанный кадр, инфракрасный канал для него, найденная пыль, а также кадр после коррекции цвета, без удаления и с удалением пыли:
Видно, что тут сложный случай, картинка просвечивает в инфракрасном канале. Я пытаюсь минимизировать дисперсию инфракрасного канала, вычитая правильную линейную комбинацию всех остальных цветов (результат виден на картинке с пылью). Это помогает, но не так сильно, как хотелось бы -- резкие края в полезном изображении все равно остаются. Из-за этого мелкую пыль найти не получается, но она видна только на небе, где ее потом можно и вручную закрасить.
Вот еще один пример. Тут инфракрасный канал выглядит гораздо лучше:
Все такие картинки генерятся автоматически. Если результат меня устраивает - я удаляю все лишнее и оставляю только конечный jpeg. Если нет - пытаюсь убирать пыль с другими параметрами.