【问题标题】:Stitching images using GraphicsMagick with Blending使用带有混合的 GraphicsMagick 拼接图像
【发布时间】:2018-05-04 06:12:09
【问题描述】:

我必须使用 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"

最终图像如下所示:

如何无边框拼接和混合?

【问题讨论】:

  • 在每张图片的 Alpha 通道中加入渐变蒙版。
  • @fmw42,我不确定你的意思。你能解释一下吗?

标签: imagemagick graphicsmagick


【解决方案1】:

我参与了多个制作无缝图像马赛克的项目。您可能还需要考虑其他几个因素:

  1. 平整。用你的镜头和照明设置拍摄一张白卡,然后用它来使图像亮度变平。我不知道通用汽车是否有这方面的打算,@fmw42 会知道的。平场图像特定于照明设置、镜头光圈设置、焦点设置和变焦设置,因此您需要在拍摄后锁定焦点/光圈/变焦。您需要在线性光下进行此校正。

  2. 镜头畸变。一些镜头,尤其是广角镜头,会引入明显的几何失真。拍一张方格纸,检查线条是否平行。可以使用方格纸照片自动生成可用于消除几何误差的镜头模型,但只需选择低失真的镜头更容易。

  3. 分散。你是在移动物体还是相机?灯光是否也在移动?如果您移动物体,您可能会遇到散射问题:物体的明亮部分在灯光下移动时会将光线散射到黑暗区域。您需要建模并移除它,否则您会在较暗的区域看到接缝。

  4. 旋转。您可以进行少量旋转,具体取决于您的平移台的工作方式以及您设置相机的仔细程度。您还可以在整个领域中改变焦点。您可能会发现您也需要对此进行更正。

libvips 具有用于制作无缝图像马赛克的功能包,包括上述所有功能。我为你做了一个例子:这些源图像(近红外图像的绘画underdrawing):

输入:

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

对文件join.jpg 进行水平连接。这些数字给出了 100 像素的猜测重叠 - 马赛克程序将进行搜索并为您找到确切的位置。然后它使用升余弦进行羽化连接:

虽然图像已被平面化,但您可以看到一个连接。这是因为相机的灵敏度随着物体的移动而改变。 libvips globalbalance 操作会自动将马赛克分开,为每个帧计算一组权重以最小化平均连接错误,然后重新组装。

对于这对我得到:

nip2,libvips GUI,所有这些都带有一个 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")

【讨论】:

  • 不错的功能,约翰。非常令人印象深刻。
  • 非常有帮助。谢谢@user894762。我能够用 libvips 创建马赛克。 'globalbalance' 操作不起作用。使用命令:vips globalbalancemosaic.tif outputMosaic.tif.
  • 这显示以下错误:im_global_balance: 在 desc 文件中找不到镶嵌根。这真的是马赛克图像吗?
  • 是的,不幸的是,globalbalance 无法从命令行运行。您需要从 nip2 或 Python 中使用它。您是否尝试过 nip2 的 Windows 版本?启动它,然后单击文件/打开示例/1_pt。
  • @user894763,哦!我需要在命令行中使用它,因为稍后我需要在我的应用程序中使用它,并且我可以从我的应用程序发送命令。还有其他选项可以通过命令行或某些 API 使用它吗?
【解决方案2】:

这是一个使用 ImageMagick 的示例。但由于颜色不同,您只能通过渐变混合来减轻锐利边缘。颜色越接近,混合越渐进(即在更大的区域上),它显示的越少。

1) 创建红色和蓝色图像

convert -size 500x500 xc:red top.png

convert -size 500x500 xc:blue btm.png

2) 创建大多数情况下为纯白色的蒙版,并在您想要重叠它们的位置创建渐变。这里我有 100 像素的渐变,100 像素重叠

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

convert mask_btm.png -flip mask_top.png

3) 将蒙版放入每张图片的 alpha 通道

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

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

4) 以 100 重叠的方式拼接两个图像,一个在另一个之上

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

另请参阅http://www.fmwconcepts.com/imagemagick/tidbits/image.php#composite1 我关于塑造渐变的花絮。但我会为此类工作使用线性渐变(如此处所示),因为当您重叠线性渐变时,它们总和为一个恒定的白色,因此结果将在它们重叠的地方完全不透明。

要考虑的另一件事是尝试将图像的颜色与一些常见的颜色图相匹配。这可以通过多种方法来完成。例如,直方图匹配或均值/标准(亮度/对比度)匹配。例如,请参阅我的脚本:http://www.fmwconcepts.com/imagemagick/index.php 的 histmatch、matchimage 和 redist 以及https://www.imagemagick.org/Usage/quantize/#remap 的 ImageMagick -remap

【讨论】:

  • 渐变不适用于我的用例,因为您提到的混合可能是可见的。就我而言,颜色取决于从显微相机拍摄的输入图像,并且可能会有所不同。
  • 据我所知,除了对整个区域进行简单平均之外,没有其他方法可以混合,只有渐变。但如果它们被抵消,这可能会显示特征加倍。但是为了确保它不显示过渡,您需要首先对图像进行色彩平衡/匹配,以便在混合之前颜色尽可能接近,如上所述。请参阅上面的 John Cupitt 的解决方案。它在混合之前匹配两个图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多