Я только знакомлюсь с Boost GIL (и обработкой изображений в целом) и подозреваю, что это просто, но я не нашел соответствующей документации.
У меня есть набор изображений, которые я хотел бы объединить с произвольной функцией. Для простоты, скажем, изображения выровнены (одинакового размера и типа локатора), и я просто хочу добавить значения пикселей вместе. Одним из подходов было бы создать объединяющий итератор из zip_iterator и transform_iterator, но я предполагаю, что есть алгоритмы обработки изображений, которые удобно абстрагироваться для этой цели.
Пример Мандельброта в документации, вероятно, уместно, потому что она вычисляет значения пикселей из функции, но я теряюсь в деталях и испытываю проблемы с адаптацией к моему случаю.
Единственный алгоритм двоичного канала, который я могу найти, 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 стал (опять же обратите внимание на прозрачные пленки).
Вы захотите отрегулировать функцию преобразования, чтобы сделать что-то более полезное.
Других решений пока нет …