Сшивание изображений с использованием GraphicsMagick с Blending - PullRequest
0 голосов
/ 04 мая 2018

Я должен сшить количество плиток, используя GraphicsMagick, чтобы создать одно изображение. В настоящее время я использую -convert с -mosaic с некоторым перекрытием для сшивания плиток. Но у сшитого изображения есть граница, где выполняется перекрытие.

Ниже приводится команда, которую я использую:

gm convert -background transparent 
-page "+0+0" "E:/Images/Scan 001_TileScan_001_s00_ch00.tif" 
-page "+0+948" "E:/Images/Scan 001_TileScan_001_s01_ch00.tif" 
-page "+0+1896" "E:/Images/Scan 001_TileScan_001_s02_ch00.tif" 
-page "+0+2844" "E:/Images/Scan 001_TileScan_001_s03_ch00.tif" 
-mosaic "E:/Output/temp/0.png"

Окончательное изображение выглядит так: Final Image with Overlap Border

Как прошивать и смешивать без рамки?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

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

  1. Flatfielding. Сделайте снимок белой карточки с помощью объектива и настройки освещения, а затем используйте ее, чтобы сгладить яркость изображения. Я не знаю, есть ли у GM что-то для этого, @ fmw42 будет знать. Изображение с ровным полем зависит от настроек освещения, диафрагмы объектива, фокуса и масштаба, поэтому после съемки необходимо заблокировать фокусировку / диафрагму / увеличение. Вам нужно будет сделать эту коррекцию в линейном свете.

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

  3. Scatter. Вы перемещаете объект или камеру? Освещение движется тоже? У вас могут возникнуть проблемы с рассеиванием, если вы смещаете объект: яркие части объекта рассеивают свет в темных областях, когда они движутся под действием света. Вам нужно смоделировать и удалить это, или вы увидите швы в темных областях.

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

libvips имеет пакет функций для создания бесшовных мозаик изображений, включая все вышеперечисленные функции. Я сделал для вас пример: с этими исходными изображениями (вблизи ИК-изображений рисунка с подрисовкой):

enter image description here

Ввод:

$ vips mosaic cd1.1.jpg cd1.2.jpg join.jpg horizontal 531 0 100 0

Создает горизонтальное соединение с файлом join.jpg. Числа дают предполагаемое перекрытие в 100 пикселей - программа-мозаика выполнит поиск и найдет для вас точную позицию. Затем он выполняет соединение с перьями, используя приподнятый косинус, чтобы сделать:

enter image description here

Несмотря на то, что изображения были плоскими, вы можете увидеть соединение. Это связано с тем, что чувствительность камеры изменилась при перемещении объекта. Операция libvips globalbalance автоматически разберет мозаику, вычислит набор весов для каждого кадра, который минимизирует среднюю ошибку соединения, и соберет ее.

За эту пару я получаю:

enter image description here

nip2 , графический интерфейс libvips, имеет все это с интерфейсом GUI. В руководстве есть глава (нажмите F1 для просмотра) о сборке мозаики большого изображения:

https://github.com/jcupitt/nip2/releases

Глобальный баланс не будет работать с CLI, к сожалению, но он будет работать с любыми привязками языка libvips (C #, Python, Ruby, JavaScript, C, C ++, Go, Rust, PHP и т. Д. И т. Д.). Например, в pyvips вы можете написать:

import pyvips

left = pyvips.Image.new_from_file("cd1.1.jpg")
right = pyvips.Image.new_from_file("cd1.2.jpg")
join = left.mosaic(right, "horizontal", 531, 0, 100, 0)
balance = join.globalbalance()
balance.write_to_file("x.jpg")
0 голосов
/ 04 мая 2018

Вот пример использования ImageMagick. Но так как цвета разные, вы сможете смягчить острый край только с помощью плавной смеси. Чем ближе цвета и чем более плавный переход (т. Е. На большей площади), тем меньше он будет отображаться.

1) Создание красных и синих изображений

convert -size 500x500 xc:red top.png

enter image description here

convert -size 500x500 xc:blue btm.png

enter image description here

2) Создайте маску, которая для большинства является сплошной белой, и градиент, где вы хотите, чтобы они перекрывали друг друга. Здесь у меня градиент 100 пикселей для перекрытия 100 пикселей

convert -size 500x100 gradient: -size 500x400 xc:black -append -negate mask_btm.png

enter image description here

convert mask_btm.png -flip mask_top.png

enter image description here

3) Поместите маски в альфа-каналы каждого изображения

convert top.png mask_top.png -alpha off -compose copy_opacity -composite top2.png

enter image description here

convert btm.png mask_btm.png -alpha off -compose copy_opacity -composite btm2.png

enter image description here

4) Мозаика двух изображений одно над другим с перекрытием 100

convert -page +0+0 top2.png -page +0+400 btm2.png -background none -mosaic result.png

enter image description here

См. Также мой кусок о формировании градиента в http://www.fmwconcepts.com/imagemagick/tidbits/image.php#composite1. Но я бы использовал линейный градиент для такой работы (как показано здесь), потому что, когда вы перекрываете линейные градиенты, они суммируются в постоянный белый, поэтому результат будет полностью непрозрачным там, где они перекрываются.

Еще одна вещь, которую следует учитывать, - это попытка сопоставить цвета изображений с какой-либо общей цветовой картой. Это можно сделать несколькими способами. Например, соответствие гистограммы или среднее / стандартное (яркость / контраст) соответствие. См., Например, мои сценарии: Histmatch, Matchimage и Redist на http://www.fmwconcepts.com/imagemagick/index.php и ImageMagick -remap на https://www.imagemagick.org/Usage/quantize/#remap

...