Я хочу разобраться с некоторыми крайними проблемами, которые возникают при использовании ядер разного размера на изображениях.
Прежде всего: я знаю, что в opencv есть предварительно скомпонованные опции для обработки этих случаев, но так как это упражнение для университетаМне не разрешено использовать их. Обработка кромок в OpenCV
По сути, я хочу добиться чего-то подобного (буквы для облегчения чтения)
a b c e d e
d e f b a b
g h i e d e
Слева приведен пример набора значений исправа мы смотрим на букву a как центр нашего ядра размером 3х3.Теперь я хочу отразить и пропустить букву, которая находится прямо на краю изображения (а также отразить без пропуска, но это не очень приятно визуализировать с ядром 3x3)
Очевидно, что можно просто пойти дальше и сделатьПримерно 6 различных случаев if / else, чтобы решить эту проблему, но должно быть лучшее и более простое решение, которое я просто не могу найти, и я также не нашел при поиске.
Вот как я это сделалнапример, другие мои крайние режимы (см. mode_clamp, я ищу решение такого рода):
uchar get_edge_intensity(cv::Mat m, int y, int x, int edge_mode, double edge_intensity) {
uchar result = 0;
switch (edge_mode) {
case MODE_NULL:
break;
case MODE_CLAMP:
result = m.at<uchar>( std::min(std::max(0, y), m.rows - 1),
std::min(std::max(0, x), m.cols - 1));
break;
case MODE_MIRROR:
// TODO
break;
case MODE_MIRROR_SKIP:
// TODO
break;
case MODE_CONSTANT:
result = clamp(PIXEL_MAX_VALUE * edge_intensity);
break;
}
return result;
}
зажим (двойное значение) просто ограничивает заданное двойное значение до 0-255 и возвращает его как учар, если кто-то должен знать это