画像処理のマスク用に、こんなの用意しました。
周りの画素を取得するのに使えるかなぁと・・・。
#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として切り出したことにして、以降の画像処理を行っていきます。