我需要从图像中收集一些数据。循环应该用面具完成。
例如,我有一个简单的交叉掩码:
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功能,但我不需要对图像进行更改,只需要对像素进行一些计算)。
答案 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'
*/