我刚刚熟悉 Boost GIL(以及一般的图像处理)并怀疑这很简单,但我还没有找到相关文档。
我有一组图像视图,我想将它们与任意函数结合使用。为简单起见,假设图像是对齐的(相同的大小和定位器类型),我只想将像素值相加。一种方法是从 zip_iterator 和 transform_iterator 创建组合迭代器,但我猜测有一些图像处理算法可以方便地为此目的抽象。
文档中的Mandelbrot 示例可能是相关的,因为它从函数计算像素值,但我迷失在细节中,并且无法适应我的情况。
我刚刚熟悉 Boost GIL(以及一般的图像处理)并怀疑这很简单,但我还没有找到相关文档。
我有一组图像视图,我想将它们与任意函数结合使用。为简单起见,假设图像是对齐的(相同的大小和定位器类型),我只想将像素值相加。一种方法是从 zip_iterator 和 transform_iterator 创建组合迭代器,但我猜测有一些图像处理算法可以方便地为此目的抽象。
文档中的Mandelbrot 示例可能是相关的,因为它从函数计算像素值,但我迷失在细节中,并且无法适应我的情况。
我能找到的唯一二进制通道算法是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 是并且 b.png 是(也注意透明胶片)时,c.png 变成了(再次注意透明胶片)。
您将需要微调转换函数以做一些更有用的假设。