如何将图像与boost gil结合起来?

时间:2017-12-03 20:12:14

标签: c++ image-processing boost boost-gil

我刚刚熟悉Boost GIL(以及一般的图像处理),并怀疑这很简单,但我没有找到相关的文档。

我有一组图像视图,我想与任意函数结合使用。为简单起见,我们假设图像是对齐的(相同大小和定位器类型),我只想将像素值加在一起。一种方法是create a combining iterator from a zip_iterator and a transform_iterator,但我猜测有一些图像处理算法可以方便地为此目的进行抽象。

文档中的Mandelbrot example可能是相关的,因为它计算了一个函数的像素值,但是我在细节上迷失了,并且无法适应我的情况。

1 个答案:

答案 0 :(得分:2)

我能找到的唯一二进制通道算法是channel_multiply

您可能真正需要的算法是transform_pixels 在二进制变体中合并。

这是我能做的最简单的例子。

#include <boost/gil/gil_all.hpp>
#include <boost/gil/extension/io/png_io.hpp>

namespace gil = boost::gil;

int main() {
    using Img = gil::rgba8_image_t;
    using Pix = Img::value_type;
    Img a, b;
    gil::png_read_image("/tmp/a.png", a);
    gil::png_read_image("/tmp/b.png", b);

    assert(a.dimensions() == b.dimensions());
    Img c(a.dimensions());

    gil::transform_pixels(view(a), view(b), view(c), [](gil::rgba8_ref_t a, gil::rgba8_ref_t b) {
            gil::red_t   R;
            gil::green_t G;
            gil::blue_t  B;
            gil::alpha_t A;
            return Pix (
                    get_color(a, R) + get_color(b, R),
                    get_color(a, G) + get_color(b, G),
                    get_color(a, B) + get_color(b, B),
                    get_color(a, A) + get_color(b, A)
                );
            });

    gil::png_write_view("/tmp/c.png", view(c));
}

当a.png为enter image description here且b.png为enter image description here时(请注意透明胶片),c.png变为enter image description here(再次注意透明胶片)。

你需要微调转换函数以做一些更有用的假设。