Как совместить изображения с Boost Gil?

Я только знакомлюсь с Boost GIL (и обработкой изображений в целом) и подозреваю, что это просто, но я не нашел соответствующей документации.

У меня есть набор изображений, которые я хотел бы объединить с произвольной функцией. Для простоты, скажем, изображения выровнены (одинакового размера и типа локатора), и я просто хочу добавить значения пикселей вместе. Одним из подходов было бы создать объединяющий итератор из zip_iterator и transform_iterator, но я предполагаю, что есть алгоритмы обработки изображений, которые удобно абстрагироваться для этой цели.

Пример Мандельброта в документации, вероятно, уместно, потому что она вычисляет значения пикселей из функции, но я теряюсь в деталях и испытываю проблемы с адаптацией к моему случаю.

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 введите описание изображения здесь и b.png это введите описание изображения здесь (обратите внимание на прозрачные пленки тоже), c.png стал введите описание изображения здесь (опять же обратите внимание на прозрачные пленки).

Вы захотите отрегулировать функцию преобразования, чтобы сделать что-то более полезное.

2

Другие решения

Других решений пока нет …