首页 > 解决方案 > 使用带有混合的 GraphicsMagick 拼接图像

问题描述

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

最终图像如下所示: 具有重叠边框的最终图像

如何无边界拼接和混合?

标签: imagemagickgraphicsmagick

解决方案


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

  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 像素的猜测重叠 - 马赛克程序将进行搜索并为您找到确切的位置。然后它使用升余弦进行羽化连接以生成:

在此处输入图像描述

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

对于这对我得到:

在此处输入图像描述

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")

推荐阅读