Обрезка внешнего пустого пространства с помощью ImageMagick не работает на отсканированных документах

1153
caw

Учитывая изображение, которое имеет некоторое реальное содержание внутри и обычно немного нежелательного белого или черного цвета или прозрачность вокруг него, я хотел бы обрезать или обрезать внешние части, используя ImageMagick.

Следующее изображение было нарисовано в цифровом виде на компьютере (в HTML <canvas>):

canvas.png

Следующая команда ImageMagick - это то, что я пробовал:

$ convert canvas.png -trim +repage canvas_trimmed.png 

И это сработало отлично:

canvas_trimmed.png

Так что это именно то, что я хочу. Но теперь я хочу, чтобы это работало и с отсканированными документами, которые не настолько «идеальны», как изображения, сгенерированные компьютером, то есть имеют больше оттенков «белого» и «черного» и не имеют прозрачности, которую было бы легче обнаружить. Иногда у них даже есть черные полосы вокруг белого фона бумаги, потому что область сканера больше, чем бумага:

scan.jpg

С этим изображением я попробовал следующие команды в указанном порядке, каждая из которых пыталась быть более агрессивной, но ни одна не дала никаких результатов - вы не видите никакой разницы между исходным изображением и «обрезанными» изображениями, т.е. обрезкой или обрезкой не работает вообще:

$ convert scan.jpg -trim +repage scan_trimmed.jpg $ convert scan.jpg -fuzz 10% -trim +repage scan_trimmed.jpg $ convert scan.jpg -fuzz 60% -trim +repage scan_trimmed.jpg $ convert scan.jpg -fuzz 60% -bordercolor white -border 1x1 -trim +repage scan_trimmed.jpg $ convert scan.jpg -fuzz 60% -bordercolor black -border 1x1 -trim +repage scan_trimmed.jpg 

Что я здесь не так делаю? Каким образом можно изменить команду ImageMagick, которая надежно обрезает сгенерированные компьютером изображения, чтобы с такой же надежностью обрезать отсканированные документы вышеописанного стиля?

4
Если вы посмотрите на отсканированное изображение, на боковых сторонах четко видны небелые области. Это означает, что в ImageMagick по-прежнему есть контент, который он не может обрезать, так как изображение все еще имеет контент. Нет простого решения, о котором я знаю. JakeGould 6 лет назад 0
Зачем все усложнять? Используйте функцию автоматической обрезки в вашем драйвере сканера, и все готово. Некоторые драйверы сканера также предлагают удаление темных краев, как показано на вашем отсканированном примере. Возможно, ImageMagick также предлагает такое удаление темных краев. user291737 6 лет назад 0
@ user291737 Спасибо! Хотелось бы, чтобы это было возможно, но это не так. Легко представить некоторые случаи использования, когда это невозможно: ваш сканер может не поддерживать эту функцию, вы можете выполнять обработку для кого-то другого (кто использовал свой сканер, к которому у вас нет доступа) и т. Д. caw 6 лет назад 0
Как насчет возможного тестирования с помощью [-shave] (http://www.imagemagick.org/script/command-line-options.php?#shave) и посмотреть, сможете ли вы просто [побрить] (http: //www.imagemagick) .org / Usage / crop / # shave) и затем использовать логику, которую вы используете? Дайте мне знать, если это поможет, но просмотрите *** обе эти ссылки, когда вы получите шанс Pimp Juice IT 6 лет назад 1
Взгляните на скрипты ImageMagick Фреда [autotrim] (http://www.fmwconcepts.com/imagemagick/autotrim/) и [multicrop] (http://www.fmwconcepts.com/imagemagick/multicrop/). Смотрите эту [связанную статью] (http://start.sethanil.com/exploring-software/49-image_cropping). harrymc 6 лет назад 0

3 ответа на вопрос

3
Pimp Juice IT

Вы можете использовать -shave и просто сбрить края, а затем использовать логику, которую вы используете впоследствии, для соответствующей обработки.

Примечание: Сумма, которую вы брить от (например, аргумент после «-shave» 40x40или 10x10, и т.д.) имеет важное значение, так что не забудьте тщательно проверить, чтобы убедиться, эта установка работает повсеместно в вашей среде для ваших изображений.

Пример логики

@ECHO ON  SET Convert="C:\Program Files\ImageMagick\Convert.exe" %convert% C:\Folder\Circle.jpg -shave 40x40 C:\Folder\ShavedCircle.jpg <The rest of your logic against C:\Folder\ShavedCircle.jpg now> 

До

После


Дополнительные ресурсы

  • Бритье, удаляя края с изображения

    Обратной операцией «-border» или «-frame» является « -shave », которая, если заданы те же аргументы, удалит пространство, добавленное этими командами.

    Главное, что нужно помнить об этих трех операторах, это то, что они добавляют и удаляют пространство на противоположных сторонах изображений, а не только на одной стороне или соседних сторонах.

    Если вы хотите удалить только один край изображения, вам нужно будет использовать оператор «-chop». (См. Примеры Чопа ниже).

    Как и прежде, все операторы «-border», «-frame» и « -shave » воздействуют только на реальное изображение на виртуальном холсте, но не на сам виртуальный холст.

    источник

Спасибо за это! Ну, опция `-shave` работает нормально, по крайней мере, так кажется. Я не знал эту опцию (как-то всегда упускал ее из виду), и она весьма полезна для краев. Используя что-то вроде `-shave 90x90` для образца изображения, все края исчезли. * Но *, края никогда не были единственной проблемой. Даже после полного их удаления и даже с мягкими настройками, такими как `-fuzz 80%`, верхняя белая часть удаляется только, если она вообще есть. Кажется, что в белых областях, генерируемых сканером, есть "грязь", которая препятствует работе `-trim`. Возможно, нет лучшего решения, хотя. caw 6 лет назад 0
Пока еще не совсем уверен, потому что это не решило проблему и не дало ответ на полный вопрос, а лишь решило ее часть. Во всяком случае, я уже получил награду (+100). caw 6 лет назад 0
На самом деле это именно то изображение из вопроса, с которым я работаю: https://i.stack.imgur.com/yVhlM.jpg Я перепробовал все команды и опции с этим изображением. Не работает для меня caw 6 лет назад 0
Еще раз спасибо! Вместе с вашим вторым ответом, это действительно работает отлично. caw 6 лет назад 0
1
Pimp Juice IT

Удаление грязных пятен или шума с изображений с помощью ImageMagick

Ниже приведено то, что я использовал, чтобы избавиться от пятен грязи в файле изображения на изображении в вашем вопросе, но я пошел дальше и использовал бритье с 90x90первым, что, как вы подтвердили, помогло решить проблему с помощью другого решения, которое я предоставил награждаемая награда.

Пример логики

@ECHO ON  SET Convert="C:\Program Files\ImageMagick\Convert.exe" %convert% C:\Folder\Circle.jpg -shave 90x90 C:\Folder\ShavedCircle.jpg %convert% C:\Folder\ShavedCircle.jpg -write MPR:source ^ -morphology close rectangle:3x4 ^ -morphology erode square MPR:source -compose Lighten -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ C:\Folder\cleaned.jpg 

До

enter image description here

После

enter image description here


Из-за природы звонящего шума все черные помехи отделены как минимум на 1 пиксель от букв.

Один хороший подход для устранения этого шума состоит в том, чтобы расширить изображение так, чтобы осталась хотя бы одна «начальная» часть каждой буквы, а затем разрушить эти семена, используя исходное изображение в качестве маски; фактически заполнение каждой буквы.

Таким образом, форма букв и других больших сгустков сохраняется идеально, а более мелкие сгустки исчезают.

Наибольшее расширение, которое все еще оставляет часть каждой буквенной формы, кажется, прямоугольник 3х4 для данных примера; возможно используйте что-то меньшее, чтобы быть на безопасной стороне.

Эта команда сначала расширяет этот прямоугольник 3x4, затем end, а затем размывает до тех пор, пока буквы снова не станут целыми.

Код

convert cleanup.tif -write MPR:source ^ -morphology close rectangle:3x4 ^ -morphology erode square MPR:source -compose Lighten -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ -morphology erode square MPR:source -composite ^ cleaned.png 

источник


Дополнительные ресурсы

Делая это до того, как другая команда (`-trim`) очистит и обрежет изображение по желанию. Большое спасибо! caw 6 лет назад 0
1
caw

То, что в конечном итоге дало отличные результаты, по крайней мере для моего конкретного примера, показанного в исходном вопросе ( scan.jpg), было следующее двухэтапное решение:

convert \ scan.jpg \ -write MPR:source \ -morphology close rectangle:3x4 \ -clip-mask MPR:source \ -morphology erode:8 square \ +clip-mask \ scan_intermediate.jpg  convert scan_intermediate.jpg -shave 40x40 -fuzz 10% -trim +repage scan_final.jpg 

Это решение состоит из трех частей:

  1. Команда из моего оригинального вопроса
  2. Удаление шума показано в этом ответе
  3. -shaveОператор предложил в этом ответе

Похожие вопросы