图像过滤器内核边缘问题(在边缘反映值)

时间:2019-06-14 13:56:12

标签: c++ image algorithm opencv

我想处理在图像上使用大小不同的内核时出现的一些边缘问题。

首先:我知道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返回

0 个答案:

没有答案