egami
C++ Image Processing program
|
00001 #include "../progress.hpp" 00002 #include "order_statistic.hpp" 00003 00004 Image_unit* apply_order_statistic(const Image_unit *in, unsigned char radius, std::function<unsigned char(const std::vector<unsigned char>&)> select){ 00005 Progress prog; 00006 00007 Image_unit *out(new Image_unit(*in)); 00008 00009 std::vector<unsigned char> neighbors_red, neighbors_green, neighbors_blue; 00010 neighbors_red.reserve((radius*2+1)*(radius*2+1)); 00011 neighbors_green.reserve((radius*2+1)*(radius*2+1)); 00012 neighbors_blue.reserve((radius*2+1)*(radius*2+1)); 00013 for(int y=0; y<static_cast<int>(out->height()); ++y){ 00014 prog.advance(static_cast<double>(y)/out->height()); 00015 for(int x=0; x<static_cast<int>(out->width()); ++x){ 00016 neighbors_red.clear(); 00017 neighbors_green.clear(); 00018 neighbors_blue.clear(); 00019 for(int dy=-static_cast<int>(radius); dy<=static_cast<int>(radius); ++dy) 00020 for(int dx=-static_cast<int>(radius); dx<=static_cast<int>(radius); ++dx){ 00021 if(x+dx>=0 && x+dx<static_cast<int>(out->width()) && y+dy>=0 && y+dy<static_cast<int>(out->height())){ 00022 neighbors_red.push_back(in->red(y+dy, x+dx)); 00023 neighbors_green.push_back(in->green(y+dy, x+dx)); 00024 neighbors_blue.push_back(in->blue(y+dy, x+dx)); 00025 } 00026 } 00027 std::sort(neighbors_red.begin(), neighbors_red.end()); 00028 std::sort(neighbors_green.begin(), neighbors_green.end()); 00029 std::sort(neighbors_blue.begin(), neighbors_blue.end()); 00030 out->red(y, x, select(neighbors_red)); 00031 out->green(y, x, select(neighbors_green)); 00032 out->blue(y, x, select(neighbors_blue)); 00033 } 00034 } 00035 00036 return out; 00037 } 00038 00039 namespace Processes{ 00040 void order_statistic(){ 00042 } 00043 }