Nano Hash - криптовалюты, майнинг, программирование

Есть ли в Linux инструмент для извлечения нескольких обрезанных частей из одного изображения?

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

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

Например, представьте картину книжной полки. Большинство книг находятся в вертикальном положении, толщина книги различается, как и высота книг, а некоторые из них расположены под углом и поддерживают другие. Я ищу инструмент для извлечения корешка каждой книги в отдельное изображение (с шаблоном имени (например, «корешки - %%»), или суффикс оригинала, например, «книги» .png даст "books-1.png", "books-2.png" и т. д. Исходный файл "books.png" будет сохранен. Хорошая возможность переименовать каждый обрезанный фрагмент.) Идея состоит в том, чтобы нарисовать первый прямоугольник обрезки, нажмите кнопку «извлечь», когда он нужного размера / формы, затем сделайте еще один прямоугольник кадрирования и еще один - любое количество раз.

С ImageMagick, GIMP и т. Д. В настоящее время необходимо: - изучить каждое изображение и заранее определить количество желаемых извлечений - сделать копию исходного изображения для каждого желаемого извлечения, слегка изменив имя для каждого - отредактировать (с помощью магии , gimp и т. д.): поместите рамку кадрирования, обрежьте ее, сохраните каждое обрезанное изображение (ImageMagick и другие) или экспортируйте его (GIMP), перезаписав полное изображение (например, копия изображения книжной полки) с теперь гораздо меньшей обрезанной частью рамки - закройте этот файл и откройте следующий из набора (или используйте Next в ImageMagick - второстепенная, но полезная вещь) - при желании удалите исходные файлы с несколькими изображениями или переместите их в безопасное место

Затем сделайте это для сотен составных изображений. Ой! Сценарии, такие как multicrop и multicrop2, не могут этого сделать, потому что они требуют четко определенных промежутков между корешками книги. Инструменты CLI не могут этого сделать, потому что расположение шипов и их размеры меняются на каждом изображении. Как уже отмечалось, GIMP, ImageMagick, gthumb и т. Д. Могут делать это один за другим, но это огромный объем работы с большим количеством промежуточных шагов и файлов, а также вероятность даже небольшой ошибки (например, неправильного подсчета количества книг на полке) всего на один номер требует переделки. Попытка автоматизировать на основе цвета книги, текста и т. Д. Сама по себе была бы огромной задачей, а что, если следующее изображение для мульти-кадрирования будет другим, скажем, извлечением кадрированного изображения каждого бильярдного шара с бильярдного стола? Книжный препроцессор не работал бы (хотя multicrop2 мог бы, если бы шары были достаточно далеко друг от друга, чтобы зеленый войлок можно было использовать в качестве разделителя).

Мысли, кто-нибудь?

10.06.2020

  • Это потрясающее сообщество. Я получил два отличных ответа и несколько полезных комментариев. Я пробовал сценарий ImageMagick, указанный ниже, и получаю хорошие результаты на типичных книжных полках; Лучшее в этом решении заключается в том, что описание того, что делается и почему, превосходно - прочтите его, даже если вам не нужно обрабатывать изображения подобным образом (я не пробовал, но он может работать для множества других типов картинок тоже). 15.06.2020
  • Пожалуйста, подумайте о том, чтобы принять один из ответов и, возможно, проголосовать за оба, если они верны и полезны. Таким образом, и вы, и авторы получают признание, а будущие читатели знают, что ответ работает. Примите ответ, щелкнув пустую галочку (галочку) рядом с подсчетом голосов. Спасибо. 04.11.2020

Ответы:


1

Вот один из подходов с использованием ImageMagick. ImageMagick установлен в Linux и доступен для Windows и Mac OSX. Это просто демонстрация. Он работает только на одной полке за раз.

Идея состоит в том, чтобы обрезать изображение, чтобы удалить большую часть белых границ. Затем возьмите края Canny и отфильтруйте более короткие, используя связанные компоненты. Затем возьмите линии Хафа и отфильтруйте те, которые очерчивают вертикальные стороны книг. Нарисуйте прямые линии черным цветом на белом фоне. Затем снова используйте связанные компоненты, чтобы определить ограничивающие рамки больших белых областей, которые должны соответствовать книгам, и отбросьте меньшие. Наконец, обведите ограничительные рамки, чтобы обрезать изображение в каждой книге.

Вход:

введите здесь описание изображения

Этот раздел кода обрезает изображение, чтобы удалить лишний белый цвет. Затем извлекает края Canny. Затем фильтрует края, чтобы удалить мелкие, используя связанные компоненты. Затем он вычисляет линии Хафа и фильтрует те, которые используют AWK, чтобы получить конечные точки линий для тех линий, которые идеально вертикальны или отклонены от вертикали на 1 градус. Конечные точки хранятся в массиве.

lineArr=(`convert bookshelf.jpg \
-trim +repage +write bookshelf_trim.png \
-canny 0x1+20%+50% +write bookshelf_edges.png \
-define connected-components:exclude-header=true \
-define connected-components:area-threshold=300 \
-define connected-components:mean-color=true \
-connected-components 8 +write bookshelf_edges_filtered.png \
-stroke black -strokewidth 2 \
-hough-lines 9x9+70 +write bookshelf_lines.png MVG:- | \
awk '{ if( $6 == 0 || $6 == 1) {print $2","$3}}'`)

num=${#lineArr[*]}
echo $num
echo "${lineArr[*]}"


Эта часть кода устанавливает обрезанное изображение и белое изображение, на котором нужно рисовать линии.

convert bookshelf_trim.png bookshelf_lines_filtered.png
convert bookshelf_trim.png -fill white -colorize 100 bookshelf_lines_filtered2.png


Эта часть кода проходит по каждой строке и рисует ее на двух изображениях выше.

for((i=0; i<num; i++)); do
line="${lineArr[$i]}"
x1=`echo $line | cut -d, -f1`
y1=`echo $line | cut -d, -f2`
x2=`echo $line | cut -d, -f3`
y2=`echo $line | cut -d, -f4`
echo "$x1,$y1 $x2,$y2"
convert bookshelf_lines_filtered.png -fill black -stroke black -strokewidth 2 -draw "line $x1,$y1 $x2,$y2" -alpha off bookshelf_lines_filtered.png
convert bookshelf_lines_filtered2.png -fill black -stroke black -strokewidth 2 -draw "line $x1,$y1 $x2,$y2" -alpha off bookshelf_lines_filtered2.png
done


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

bboxArr=(`convert bookshelf_lines_filtered2.png \
-type bilevel \
-define connected-components:exclude-header=true \
-define connected-components:area-threshold=0 \
-define connected-components:mean-color=true \
-define connected-components:verbose=true \
-connected-components 8 \
+write bookshelf_regions.png null: | grep "gray(255)" | awk '{print $2}'`)

num=${#bboxArr[*]}
echo "${bboxArr[*]}"


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

for((i=0; i<num; i++)); do
bbox="${bboxArr[$i]}"
convert bookshelf_trim.png -crop $bbox +repage bookshelf_$i.jpg
done


Остроумные края:

введите здесь описание изображения

Отфильтрованные края:

введите здесь описание изображения

Губные строки:

введите здесь описание изображения

Отфильтрованные строки на входе:

введите здесь описание изображения

Отфильтрованные линии на белом фоне:

введите здесь описание изображения

Несколько из 19 обрезанных книг:

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

13.06.2020
  • УХ ТЫ! Это очень впечатляющий результат, и инструкции по его сборке неоценимы. Спасибо! 15.06.2020

  • 2

    nip2, libvips GUI, позволяет перетаскивать рамку кадрирования и сохранять в каждой позиции одним щелчком мыши. Это часть большинства Linux, просто проверьте свой менеджер пакетов. Поставляется с руководством: нажмите F1 для получения справки.

    Загрузите изображение, дважды щелкните, чтобы открыть окно просмотра, удерживая CTRL, перетащите вниз и вправо, чтобы создать область и расположить ее над одним из объектов. Вернувшись в главное окно, щелкните область правой кнопкой мыши и выберите «Сохранить как». В диалоговом окне файла установите флажок «Увеличить имя файла», введите имя, например «area0001.png», затем нажмите «ОК» в диалоговом окне сохранения файла.

    введите здесь описание изображения

    Диалог сохранения останется закрепленным, а имя файла будет увеличиваться. Теперь переместите область на другой объект и снова нажмите ОК. Вы можете продолжать это делать - для каждого сохранения будет достаточно одного клика.

    Вы также можете делать повернутые прямоугольные выделения: просто выберите Toolkits / Image / Transform / Rotate / Free, чтобы сделать повернутое изображение, затем отметьте на нем область. Вы сможете перетаскивать ползунок поворота каждый раз, чтобы вернуть объект в вертикальное положение.

    13.06.2020
  • Это удобное решение, и я прочту руководство (приведенные выше инструкции не работают в том же порядке). Он прост в использовании, и (к счастью?) У меня есть только около 200 файлов, которые нужно распаковать (что в итоге даст около 3000 сохраненных областей). Так что, хотя для многих он многословен, он превосходит альтернативы, которые я нашел до сих пор. 14.06.2020
  • Должен был сказать: Спасибо за подсказку о nip2! 14.06.2020
  • Ха, инструкция должна работать. Пожалуйста, напишите примечание о том, что сработало для вас, и я обновлю ответ. Рад, что это пригодилось! 14.06.2020
  • Я создавал новые регионы - приращение имени файла в них не работало (несмотря на несколько попыток; -!). Я зашел на сайты git, просмотрел документы и не увидел, как это может работать с использованием нескольких регионов, как это делал я. Потом вспомнил ваш комментарий. Вы сказали репозиционирование, и это ДЕЙСТВИТЕЛЬНО работает, и довольно хорошо. Итак, секрет в том, чтобы создать область (CTRL-мышь), которая получит имя типа A2. Не создавайте другого! Вместо этого наведите указатель мыши на углы и измените размер / положение поля, затем снова нажмите «Сохранить», затем снова с помощью мыши переместите углы A2, снова нажмите «Сохранить» и т. Д. 15.06.2020
  • Я постарался сделать понятнее, спасибо! Кроме того, перетащите метку, чтобы переместить область без изменения размера, если это неочевидно. 15.06.2020

  • 3

    ofn-extract-objects - это скрипт, который извлекает и экспортирует за один раз и за столько же файлы по мере необходимости все несмежные непрозрачные области на слое. Так что, если вы можете стереть ненужные части и изолировать каждый корешок книги, он сделает все остальное.

    10.06.2020
  • Я пытался заставить это работать, но, похоже, столкнулся с общей проблемой GIMP - версией python. 13.06.2020
  • Какая у вас ОС? 13.06.2020
  • @ JD53 Из вашего ответа выше, похоже, вы неправильно использовали плагин ... Он не является основным для вызова из командной строки, но доступен в меню GIMP после загрузки изображения в редакторе. 13.06.2020
  • ОС - Linux 20.04. Ко второму посту я пытался запустить изнутри GIMP (v 2.10), но GIMP не загружает плагин из-за версии / библиотек Python. Системный Python по умолчанию - 2.7.18. Во время запуска GIMP выдает сообщения об ошибках, что плагин не может импортировать модуль. Попытка установить этот модуль (с помощью pip) не показывает такой библиотеки; поиски устанавливаемого пакета с ним (даже на сайте с частным кодом) не помогли. Используя pyenv, я переключился на Python 3.7.6, попробовал тот же плагин, в котором не удалось включить модуль и возникла проблема с оператором печати (). 14.06.2020
  • Ох, и поиск этой проблемы привел к появлению множества веб-сайтов, описывающих использование GIMP старых версий Python и проблем с чувствительностью к версиям. 14.06.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..