在openCV中使用掩码循环显示图像

时间:2012-04-05 17:35:39

标签: c++ image-processing opencv

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

例如,我有一个简单的交叉掩码:

  1  
1 1 1
  1

我需要知道Image每个点的灰度值总和。

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

// 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()这样的东西?

我需要将mask作为参数,所以我可以使用任何类型的蒙版。

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

1 个答案:

答案 0 :(得分: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指定的边框外推类型。 From the docs

  

本节中描述的函数和类的另一个共同特征是,与简单的算术函数不同,它们需要推断一些不存在的像素的值。例如,如果要使用Gaussian 3 \ times 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'
 */