我想处理在图像上使用大小不同的内核时出现的一些边缘问题。
首先:我知道opencv中有预编译的选项可以处理这些情况,但是由于这是大学的一项职业,因此我不允许使用这些选项。 Edge handling in OpenCV
基本上,我想实现这样的功能(为了便于阅读,请输入字母)
a b c e d e
d e f b a b
g h i e d e
左边是一组示例值,右边是字母 a ,它是内核的中心,其大小为3x3。现在,我想反射并跳过图像边缘上的字母(也可以不跳过而进行反射,但这对于使用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;
}
clamp(double value)只是将给定的double值钳位为0-255,如果有人需要知道,则将其作为uchar返回