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

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

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

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

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

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

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

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

$ 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, которая надежно обрезает сгенерированные компьютером изображения так, чтобы она уравновешивала отсканированные документы вышеописанного стиля?

3 ответа

Решение

Вы можете использовать -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" воздействуют только на реальное изображение на виртуальном холсте, но не на сам виртуальный холст.

    источник

Удаление грязных пятен или шума с изображений с помощью 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

До

После


Из-за природы звонящего шума все пятнышки черного шума отделены как минимум на 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

источник


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

Что в итоге дало отличные результаты, по крайней мере, для моего конкретного примера, показанного в исходном вопросе (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 оператор предложил в этом ответе
Другие вопросы по тегам