読者です 読者をやめる 読者になる 読者になる

ネガ処理

画像処理 C++

OpenCVがRGBの並び順をユーザーがコンパイル時に選択できないと知って、Boost.GILに乗り換えました。

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

using namespace boost::gil;

rgb8_pixel_t nega(rgb8_pixel_t x)
{
    return rgb8_pixel_t(
                255 - at_c<0>(x),
                255 - at_c<1>(x),
                255 - at_c<2>(x)
            );


//  こう書きたかった・・・
//  return fusion::transform(x, 255 - boost::lambda::_1);
}

int main()
{
    rgb8_image_t img;
    png_read_image("belle.png",img);

    transform_pixels(view(img), view(img), nega);

    png_write_view("out.png", view(img));
}

こちらはこちらで、ピクセルをBoost.Fusionのシーケンスとして扱えないのでもやっと。
ピクセル操作を楽にする方法あるのかな・・・。


追記:
static_transformでできました。

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

using namespace boost::gil;

struct functor {
    template <class T>
    T operator()(T x) const
    {
        return 255 - x;
    }
};

rgb8_pixel_t nega(rgb8_pixel_t x)
{
    return (static_transform(x, x, functor()), x);
}

int main()
{
    rgb8_image_t img;
    png_read_image("belle.png",img);

    transform_pixels(view(img), view(img), nega);

    png_write_view("out.png", view(img));
}

belle.png

out.png