Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm IMAGEMAGICK:合并多个图像,但保留具有特定颜色的区域_Algorithm_Image Processing_Imagemagick - Fatal编程技术网

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,如何:

  • 使用任何技术/任何东西获得所需的结果
  • 从上面实现算法 你不需要回答这两个问题,只要找到一个imagemagick方法来获得想要的结果就可以了

    [编辑]

    提示:我刚刚有了一个想法,我认为你可以为两幅图像生成遮罩(包括蓝色部分),并对遮罩进行一些“设置相交/并集/差异/任何”操作,以生成适当的“最终”遮罩,从而只复制图像b的真实相关部分。

    好的,我执行了“合并像素”策略,它成功了

    需要“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
    }