使用带有混合的 GraphicsMagick 拼接图像

Stitching images using GraphicsMagick with Blending

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

最终图像如下所示:

如何无边框拼接和融合?

这是一个使用 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 上关于塑造渐变的花絮。但我会为此类工作使用线性渐变(如此处所示),因为当您重叠线性渐变时,它们总和为恒定的白色,因此结果将在它们重叠的地方完全不透明。

要考虑的另一件事是尝试将图像的颜色与一些常见的颜色图相匹配。这可以通过多种方法来完成。例如,直方图匹配或 mean/std (brightness/contrast) 匹配。例如,参见我的脚本:http://www.fmwconcepts.com/imagemagick/index.php and ImageMagick -remap at https://www.imagemagick.org/Usage/quantize/#remap

上的 histmatch、matchimage 和 redist

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

  1. 平场。用你的镜头和照明设置拍摄一张白卡,然后用它来拉平图像的亮度。我不知道 GM 有没有办法做到这一点,@fmw42 会知道的。平场图像特定于照明设置、镜头光圈设置、对焦设置和变焦设置,因此拍摄后需要锁定 focus/aperture/zoom。您需要在线性光下进行此校正。

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

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

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

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

正在输入:

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