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

Imagemagick 使用带有混合的GraphicsMagick拼接图像,imagemagick,graphicsmagick,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:/I

我必须使用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"
最终图像如下所示:


如何在没有边框的情况下缝合和混合?

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

1) 创建红色和蓝色图像

convert -size 500x500 xc:red top.png

2) 创建大多数情况下为纯白的遮罩,并在希望重叠的位置创建渐变。这里我有100像素的渐变,用于100像素的重叠

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

3) 将遮罩放入每个图像的alpha通道

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

4) 将两个图像一个接一个地拼接,重叠100

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

另请参见我关于在顶部塑造渐变的小贴士。但是我会使用线性渐变来完成这类工作(如图所示),因为当你重叠线性渐变时,它们的总和是一个恒定的白色,所以在它们重叠的地方,结果将是完全不透明的


另一个要考虑的事情是尝试将图像的颜色与一些常见的颜色图相匹配。这可以通过多种方法实现。例如,直方图匹配或平均/标准(亮度/对比度)匹配。例如,请参见我的脚本:histmatch、matchimage和redist at以及ImageMagick-remap at

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

  • 平场。用你的镜头和照明设置拍摄一张白卡,然后用它来平展图像亮度。@fmw42会知道,我不知道通用汽车是否与此有关。平场图像特定于照明设置、镜头光圈设置、焦距设置和变焦设置,因此拍摄后需要锁定焦距/光圈/变焦。你需要在线性光线下进行校正

  • 镜头畸变。有些镜头,特别是广角镜头,会引起明显的几何畸变。拍摄一张图表,检查所有线条是否平行。可以使用图纸快照自动生成镜头模型,以消除几何误差,但简单地选择低失真镜头更容易

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

  • 轮换。你可以得到少量的旋转,这取决于你的平移阶段是如何工作的,以及你如何小心地设置相机。您还可以在整个视野中改变焦点。您可能会发现您也需要对此进行纠正

  • 有一套用于制作无缝图像马赛克的功能,包括上述所有功能。我举了一个例子:使用这些源图像(绘画底图的近红外图像):

    输入:

    $ vips mosaic cd1.1.jpg cd1.2.jpg join.jpg horizontal 531 0 100 0
    
    对文件
    join.jpg
    进行水平连接。这些数字给出了100个像素的猜测重叠——马赛克程序将进行搜索并为您找到准确的位置。然后,它使用升余弦进行羽化连接,以生成:

    虽然图像已展开,但您可以看到连接。这是因为随着对象的移动,摄影机的灵敏度发生了变化。libvips
    globalbalance
    操作将自动分离马赛克,为每个帧计算一组权重,以最小化平均连接错误,然后重新组装马赛克

    对于这双鞋,我得到:

    ,libvipsgui,所有这些都带有GUI界面。手册中有一章(按F1键查看)介绍如何组装大型图像马赛克:

    全局平衡将无法从CLI中工作,但它将从LIPVIPS语言绑定(C++、Python、Ruby、JavaScript、C、C++、GO、RIST、PHP等)中工作。例如,在中,您可以编写:

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

    在每个图像的alpha通道中放置一个渐变遮罩。@fmw42,我不知道你的意思。你能解释一下吗?很好的特征,约翰。非常令人印象深刻,非常有帮助。谢谢@user894762。我能够用libvips创建马赛克。“全球平衡”操作不起作用。使用命令:vips globalbalance mosaic.tif outputmaic.tif。这会显示以下错误:im_global_balance:mosaic root未在desc文件中找到。这真的是镶嵌图像吗?是的,很遗憾,globalbalance无法从命令行运行。您需要从nip2或Python使用它。您是否尝试过nip2的Windows版本?启动它,然后单击文件/打开示例/1\u pt@user894763,噢!。我需要在命令行中使用它,因为以后我需要在我的应用程序中使用它,我可以从我的应用程序发送命令。任何其他通过命令行或一些API使用的选项?Gradient在我的用例中都不起作用,因为正如您所提到的,混合可能是可见的。在我的例子中,颜色取决于从显微相机拍摄的输入图像,并且可以变化。据我所知,除了整个区域的简单平均之外,没有其他混合方法,只有渐变。但如果这些特征被偏移,那么它们可能会加倍。但为了确保它不显示过渡,您需要首先对图像进行颜色平衡/匹配,以便在混合之前颜色尽可能接近,正如我上面提到的。见上面约翰·库比特的解决方案。它在混合之前匹配两个图像。
    convert -page +0+0 top2.png -page +0+400 btm2.png -background none -mosaic result.png
    
    $ vips mosaic cd1.1.jpg cd1.2.jpg join.jpg horizontal 531 0 100 0
    
    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")