разделить изображения jpg по заданным пропорциям (imagemagick)

541
acman123

У меня есть куча изображений, отсканированных в формате jpg. Как вы видите на рисунках ниже, карточки двусторонние, при сканировании я поместил 6 карточек внутрь сканера.

На первой картинке лицевая сторона первой карты обозначена цифрой 1, а обратная сторона - цифрой 7. Лицевая сторона второй карточки обозначена цифрой 2, а обратная сторона - цифрой 8 и т. Д.

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

1.jpg(1) 2.jpg(7) (since 7 is the back side of the 1.jpg)   3.jpg(2) 4.jpg(8) etc 

(image1.jpg) Лицевая сторона шести карт: Front side of the Cards

(image2.jpg) Обратная сторона шести карт: Back side of the cards

1- Как я могу разделить изображения на основе этих разделительных линий, используя imagemagick (или любое другое решение)? (Я могу получить x и y этих строк, потому что все изображения имеют размер 2550x3507)

разделительные линии выделены красным: Divider Lines are in red

  1. после разделения или во время разделения можно ли автоматически их нумеровать в соответствии с желаемым порядком, описанным выше?
0

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

1
Anaksunaman

Как я могу разделить изображения на основе этих разделительных линий, используя [ImageMagick?]

Возможно, самым простым решением было бы использовать -crop следующим образом:

convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg 

Эта команда:

  • Делит каждое изображение на 6 (примерно) плиток одинакового размера ( -crop 3x2 @ ), нумеруя каждый по порядку.

  • Начинает последовательность нумерации с 1( -сцена 1 ), а не с 0.

  • Дает окончательным числам 0-padding ( %02d) из одной цифры [ 01-09].

Команды Примечания

  • Хотя можно указать точный размер (например 1000x1000) или использовать проценты (например 33%x50%) для кадрирования, это может потенциально привести к «обрезке» изображений (что, вероятно, нежелательно).

  • Использование, например, -3x2@обычно создает изображения, которые ближе по размеру (относительно друг друга), чем проценты «перерегулирования» (например 33.4%x50%), чтобы избежать создания «обрезки» изображений.

  • В пакетном файле вам нужно удвоить знаки процента, чтобы они работали как задумано:

    convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg 
  • Если вы пишете в форматы, которые могут иметь смещения изображения / холста (например .png), вы можете включить + repage после вашего -crop:

    convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png 
  • Если ваши входные форматы могут содержать смещения изображения / холста, вы также можете +repageих использовать.


Переименование

Можно ли автоматически нумеровать их в соответствии с порядком, описанным выше?

С одним ImageMagick я был не в состоянии это сделать (я подозреваю, что это, вероятно, невозможно, но я, честно говоря, не уверен в этом). Конечно, отдельно от ImageMagick, это вполне возможно.

Поскольку вы пометили этот вопрос batch, стоит упомянуть, что я, вероятно, не могу помочь с какими-либо хорошими решениями в пакетном режиме. Имея это в виду, очень вероятно, что вы (или кто-то еще) могли бы придумать что-то лучшее, чем то, что я подробно опишу ниже.

Обязательный пакетный (не) ответ

Переименование методом перебора возможно с помощью пакета. Сначала временно переименуйте каждый файл (кроме первого и последнего), например:

rename cropped_02.jpg cropped_02_temp.jpg  [...] rename cropped_11.jpg cropped_11_temp.jpg  

Затем переименуйте их на новые позиции, например:

rename cropped_02_temp.jpg cropped_03.jpg rename cropped_03_temp.jpg cropped_05.jpg  rename cropped_04_temp.jpg cropped_07.jpg  rename cropped_05_temp.jpg cropped_09.jpg  rename cropped_06_temp.jpg cropped_11.jpg  rename cropped_07_temp.jpg cropped_02.jpg  rename cropped_08_temp.jpg cropped_04.jpg  rename cropped_09_temp.jpg cropped_06.jpg  rename cropped_10_temp.jpg cropped_08.jpg  rename cropped_11_temp.jpg cropped_10.jpg  

Пакет имеет возможность принимать аргументы из командной строки и выполнять математические операции, а также иметь forциклы, ifоператоры и т. Д., Так что это решение (очевидно) может быть улучшено.


Переименование заметок

Если вы посмотрите на вторую половину процесса переименования выше, вы заметите шаблон в именах файлов. Фактически, для данной Позиции N мы можем использовать одну из следующих двух формул, чтобы найти новую позицию элемента в вашей схеме:

  • Предметы до точки «на полпути» (например, 2-6): (Position_N * 2) - 1
  • Предметы, находящиеся за пределами "середины пути" (например, 7-11): (Position_N * 2) - Total_Items

Примечание. Хотя эти формулы можно применять ко всей последовательности (например, 1 и 12), первый и последний элементы никогда не меняют позиций. Это, возможно, делает переименование их ненужным.


Кроме того, они должны работать для любого четного (не нечётного) количества позиций / позиций (4 или больше), при условии, что имена ваших файлов в порядке (например, от 1 до 12). Итак, для ваших оригинальных примеров:

Temp Item 2 becomes (2 * 2) - 1 = Item 3 Temp Item 7 becomes (7 * 2) - 12 = Item 2 Temp Item 8 becomes (8 * 2) - 12 = Item 4 [...] 

Таким образом, приведенные формулы потенциально могут быть основой для пакетных (или других сценариев) решений. Однако есть несколько других вещей, о которых нужно знать, если вы решите использовать их как таковые ...

Сортировка

Сортировка (как упомянуто выше) может иметь практические последствия в таких вещах, как сценарии, поскольку элементы, возвращаемые «не по порядку» Windows, будут «нарушать» приведенные формулы. В частности:

  • Windows по умолчанию сортирует имена в лексикографическом порядке. Это означает, что элементы, которые не имеют 0перед одной цифрой (например, image_1.jpg против image_01.jpg ), не будут отображаться в (естественном) порядке, если они возвращаются непосредственно Windows. То есть они будут возвращены как, например:

    cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc. 
  • Определенные слова и фразы (например, - Copy) в именах файлов также могут влиять на порядок, в котором имена файлов возвращаются.

Если вы используете вышеприведенные формулы, убедитесь, что в 0именах ваших файлов -pad указаны одинарные цифры, и удалите что-то вроде - Copy(или иным образом примите меры для смягчения этих проблем).

Циклы / счетчики, начиная с 0

Если вы используете язык, который начинает считать с 0(например, в циклах), то это может немного изменить формулы:

  • Предметы до точки «на полпути» (например, 1-5): (Position_N * 2)
  • Предметы за пределами "середины" (например, 6-10): (Position_N * 2) - (Total_Items - 1)

Помните, что, начиная с 0, будет запущено 12 предметов 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.


Скрипт Python

Если вам интересно, я написал небольшой (вероятно, ужасный) скрипт на Python для Python 3.x (протестирован с 3.6.4), который можно использовать из командной строки для переименования произвольных файлов в последовательности (например, cropped_01. jpg ... cropped_XX.jpg ) в порядке, указанном в вашем вопросе. Вам нужно будет установить копию Python, если вы решите попробовать ее.

Ограничения

  • Не читает из текстовых файлов информацию (поэтому не указывать список файлов в настоящее время). Аналогично, префикс и расширение имени изображения / файла требуются в командной строке.

  • Таким образом, скрипт ожидает, что имена файлов будут возвращены в правильном порядке автоматически (см. Windows и 0-padding выше).

  • Существует возможность использовать сторонний модуль, который называется natsort(устанавливается с помощью, например python -m pip install natsort), если ваши элементы не 0дополнены. Однако вам нужно раскомментировать строку 13 ( from natsort import natsorted) и строку 105 ( item_list = list(natsorted(item_list))) в скрипте после установки, natsortчтобы использовать эту опцию.

Для ясности, «раскомментировать» означает удалить #пробел и ведущий в начале строки. Дополнительные инструкции по использованию включены в скрипт.

Ваш скрипт на python не работал, хотя ваша первая часть ответа выполнила работу так, как мне нужно acman123 6 лет назад 0
Хм ... ну я рад, что хоть какой-то ответ сработал! = Р Anaksunaman 6 лет назад 0

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