Algorithm IMAGEMAGICK:合并多个图像,但保留具有特定颜色的区域
我最近不得不合并如下图像: 这些图像表示在不同位置发生的不同类型的事件。我们的想法是以一种方式合并这些图像,以保持每个图像的“热点”区域(红-黄-绿),从而获得全球情况的全局图片 在我目前的方法中,我拍摄第二张图像并提取红色/绿色通道,以便形成相关部分的遮罩,如下所示: 然后我使用这个遮罩将它与第一个图像合并,这样只有相关的部分被复制过来 以下是用于此操作的脚本:Algorithm IMAGEMAGICK:合并多个图像,但保留具有特定颜色的区域,algorithm,image-processing,imagemagick,Algorithm,Image Processing,Imagemagick,我最近不得不合并如下图像: 这些图像表示在不同位置发生的不同类型的事件。我们的想法是以一种方式合并这些图像,以保持每个图像的“热点”区域(红-黄-绿),从而获得全球情况的全局图片 在我目前的方法中,我拍摄第二张图像并提取红色/绿色通道,以便形成相关部分的遮罩,如下所示: 然后我使用这个遮罩将它与第一个图像合并,这样只有相关的部分被复制过来 以下是用于此操作的脚本: #/bin/bash #提取RGB 转换b.png-颜色空间RGB-单独的b-sep-%d.png #只保留红色和绿色 转换b
#/bin/bash
#提取RGB
转换b.png-颜色空间RGB-单独的b-sep-%d.png
#只保留红色和绿色
转换b-sep-2.png b-sep-0.png-合成-合成b-tmp-br.png
转换b-sep-2.png b-sep-1.png-合成-合成b-tmp-bg.png
转换b-tmp-br.png b-tmp-bg.png-合成+合成-级别10%,100%b-mask.png
#复合材料!
复合b.png a.png b-mask.png final.png
以下是我目前的结果:
如您所见,它适用于红-黄-绿部分,但缺少蓝色部分。问题是,如果我放大遮罩以包含蓝色部分,那么它将用第二张图像中的蓝色部分覆盖第一张图像中的红黄绿色部分!这在最终结果中已经可见,左上角第一幅图像的红色部分被第二幅图像的绿色部分覆盖
正确获取蓝色部分比较困难,但我认为以下算法应该可以工作(伪代码):
也就是说,在合并图像时,根据对最终图像最重要的颜色,从图像a或b复制像素。也许这个算法不合理(例如,如何处理梯度部分,可能有一个阈值),请随意揭穿它
真正的问题:
使用imagemagick,如何:
需要“RMagick”
包括Magick
def像素_分数(p)
r、 g,b=[p.red,p.green,p.blue].map{i | i/256}
是平坦的=(r-g)。abs<20&&(r-b)。abs<20&&(g-b)。abs<20
灰色=平坦且r<200
红色=r>=240&&g=150&&g>=100&&b
function merge_pixel(pixel a, pixel b)
{
points = { :red => 4, :yellow => 3, :green => 2, :blue => 1, :default => 0 }
a_points = points[a.color()]
b_points = points[b.color()]
return a_points > b_points ? a : b
}