2

我需要从图像中收集一些数据。循环应该用面具完成。

例如,我有一个简单的十字掩码:

  1  
1 1 1
  1

我需要知道图像每个点的灰度值之和。

我可以使用简单的循环,如下所示:

// looping except first and last
int nr = image.rows-1;
int nc = image.cols-1;

    for (int j=1; j<nr; j++) { // for all rows

    const uchar* previous = image.ptr<const uchar>(j-1); // previous row
    const uchar* current = image.ptr<const uchar>(j); // current row
    const uchar* next = image.ptr<const uchar>(j+1); // next row

    for (int i=1; i<nc; i++) {
        sum = previos[i] + current[i] + current[i-1] 
                          + current[i+1] + next[i];

    }
}

但我认为我做错了。也许我应该使用类似的东西cv::Mat kernel()

我需要掩码作为参数,所以我可以使用任何类型的掩码。

是否有现成的功能可以循环使用蒙版的图像?(有 filter2D 功能,但我不需要对图像进行更改,只需对像素进行一些计算)。

4

1 回答 1

2

如果您想要每个像素的总和,那不正是这样filter2d()做的吗?您计算每个像素的总和,然后使用这些总和继续 SUSAN:(未经测试的代码)

cv::Mat img;
// TODO: load img
cv::Mat kernel = cv::Mat::ones(3,3,CV_8U);
// TODO: set some elements to zero you don't like
cv::Mat sums = img.clone();
cv::filter2d(img, sums, -1, kernel);
// TODO: use sums for further computation 

在图像边缘发生的情况取决于您为 指定的边框外插类型filter2d从文档

本节中描述的函数和类的另一个共同特征是,与简单的算术函数不同,它们需要外推一些不存在的像素的值。例如,如果要使用高斯 3×3 滤波器对图像进行平滑处理,那么在处理每行中最左侧的像素时,需要它们左侧的像素,即图像外部的像素。您可以让这些像素与最左边的图像像素相同(“复制边界”外推法),或者假设所有不存在的像素为零(“恒定边界”外推法),等等。OpenCV 使您能够指定外推方法。有关详细信息,请参阅函数borderInterpolate() 和本节中对borderType 参数的讨论以及下面的各种函数。

/*
 Various border types, image boundaries are denoted with '|'

 * BORDER_REPLICATE:     aaaaaa|abcdefgh|hhhhhhh
 * BORDER_REFLECT:       fedcba|abcdefgh|hgfedcb
 * BORDER_REFLECT_101:   gfedcb|abcdefgh|gfedcba
 * BORDER_WRAP:          cdefgh|abcdefgh|abcdefg
 * BORDER_CONSTANT:      iiiiii|abcdefgh|iiiiiii  with some specified 'i'
 */
于 2012-04-05T21:09:06.860 回答