sub_window

画像処理のマスク用に、こんなの用意しました。
周りの画素を取得するのに使えるかなぁと・・・。

#include <pstade/oven/matrix.hpp>
#include <pstade/oven/window.hpp>
#include <pstade/oven/concatenated.hpp>
#include <pstade/oven/any_range.hpp>
#include <pstade/oven/transformed.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

#include <boost/assert.hpp>
#include <boost/array.hpp>
#include <pstade/oven/equals.hpp>

template <class Range>
pstade::oven::any_range<typename boost::range_value<Range>::type, boost::forward_traversal_tag>
    sub_window(const Range& r, std::size_t width, std::size_t height,
                std::size_t x, std::size_t y, std::size_t sub_width, std::size_t sub_height)
{
    using namespace pstade::oven;
    namespace bll = boost::lambda;

    return  r |
            rows(width, height) | window(y, y + sub_height) |
            transformed(bll::bind(make_window, bll::_1, x, x + sub_width)) | concatenated;
}

int main()
{
    const int width = 5;
    const int height = 5;

    const boost::array<int, width * height> m = {
        11, 12, 13, 14, 15,
        21, 22, 23, 24, 25,
        31, 32, 33, 34, 35,
        41, 42, 43, 44, 45,
        51, 52, 53, 54, 55
    };

    const std::size_t x = 1;
    const std::size_t y = 1;
    const std::size_t sub_width = 3;
    const std::size_t sub_height = 2;

    const boost::array<int, sub_width * sub_height> expected = {
        22, 23, 24,
        32, 33, 34
    };

    BOOST_ASSERT(pstade::oven::equals(
        sub_window(m, width, height, x, y, sub_width, sub_height),
        expected
    ));
}


以下のような行列(Windowと見なす)から

11, 12, 13, 14, 15,
21, 22, 23, 24, 25,
31, 32, 33, 34, 35,
41, 42, 43, 44, 45,
51, 52, 53, 54, 55

以下の部分行列を抽出しています。

22, 23, 24,
32, 33, 34


これをsub_window.hppとして切り出したことにして、以降の画像処理を行っていきます。