Обрезка внешнего пустого пространства с помощью 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
Это решение состоит из трех частей:
- Команда из моего оригинального вопроса
- Удаление шума показано в этом ответе
-shave
оператор предложил в этом ответе