imagemagick - 使用带有混合的 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"
如何无边界拼接和混合?
解决方案
我参与了多个制作无缝图像马赛克的项目。您可能还需要考虑其他几个因素:
平场。用你的镜头和照明设置拍摄一张白卡,然后用它来使图像亮度变平。我不知道通用汽车是否有这方面的打算,@fmw42 会知道的。平场图像特定于照明设置、镜头光圈设置、焦点设置和变焦设置,因此您需要在拍摄后锁定焦点/光圈/变焦。您需要在线性光下进行此校正。
镜头畸变。一些镜头,尤其是广角镜头,会引入明显的几何失真。拍一张方格纸,检查线条是否平行。可以使用方格纸照片自动生成可用于消除几何误差的镜头模型,但只需选择低失真的镜头更容易。
分散。你是在移动物体还是相机?灯光是否也在移动?如果您移动物体,您可能会遇到散射问题:物体的明亮部分在灯光下移动时会将光线散射到黑暗区域。您需要建模并移除它,否则您会在较暗的区域看到接缝。
回转。您可以进行少量旋转,具体取决于您的平移台的工作方式以及您设置相机的仔细程度。您还可以在整个领域中改变焦点。您可能会发现您也需要对此进行更正。
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")
推荐阅读
- jquery - 如何从表单中获取所有输入 - 不适用于选择器
- javascript - 通过 LZString 压缩 Base64 字符串会产生 SyntaxErrors
- python - 正则表达式环视 (?![\+\.])
- reactjs - 在“Connect(withRedux(MyApp))”的上下文中找不到“store”
- sas - 从 SAS 中的多个数据集中获得并减去观察总数
- c# - 使用 mvvm 时可以更改属性文本的颜色吗?
- c# - IIS 中的 Xaml 渲染不起作用(但在 IISExpress 中)
- sql - Access 2013 追加查询仅添加新的日期记录不存在
- javascript - 视频 JS 在 iOS Safari 浏览器和 Android 默认浏览器中无法正常播放
- sql - 如何在 Postgresql 中连接两个表以更新一个表