使用带混合的GraphicsMagick拼接图像

时间:2018-05-04 06:12:09

标签: imagemagick graphicsmagick

我必须使用GraphicsMagick缝合多个图块来创建一个图像。我目前正在使用-convert with -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 :(得分:3)

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

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

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

  3. 散。你在移动物体或相机吗?照明也在移动吗?如果移动对象,则可能会出现散射问题:当光线在光线下移动时,对象的明亮部分会将光线散射到暗区域。你需要建模并删除它,否则你会在较暗的区域看到接缝。

  4. 旋转。您可以获得少量旋转,具体取决于您的翻译阶段的工作方式以及您设置相机的程度。您还可以在整个领域内改变焦点。你可能会发现你也需要纠正这个问题。

  5. 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

    libvips GUI的

    nip2具有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")
    

答案 1 :(得分:1)

以下是使用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)将遮罩放入每张图像的Alpha通道

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

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