1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| template <typename T>
struct TriRGBCroissant
{
bool operator ()(const vigra::RGBValue<T>& a1, const vigra::RGBValue<T>& a2) const
{
return (a1.luminance() < a2.luminance() );
}
};
template <typename T>
T inspectVoisinage(typename vigra::BasicImage<T>::traverser & A, typename vigra::BasicImage<T>::traverser & B, T val)
{
std::vector<T> vect;
vigra::BasicImage<T>::traverser iter_x = A;
for (; iter_x.x != B.x ; ++iter_x.x) {
vigra::BasicImage<T>::traverser iter_y = iter_x;
for (; iter_y.y != B.y ; ++iter_y.y) {
if (*iter_y != val) {
vect.push_back(*iter_y);
}
}
}
if (vect.empty() )
return 0;
else
{
if (isRGB<T>::value) {
std::sort(vect.begin(), vect.end(), TriRGBCroissant<T>() );// Cas RGB
}
else {
std::sort(vect.begin(), vect.end(), typename std::greater<T>() ); // Cas NORMAL
}
}
return vect[static_cast<int>(vect.size()*0.5)];
} |