0

基本问题是这样的:

我有一个 CVMat,类型为 CV_8UC1,它主要用 1 到 100 之间的整数(嗯,实际上是字符,但无论如何)填充。其余元素为零。

在这种情况下,0 基本上意味着“未知”。我想用它最近邻居的平均值来填充未知元素......即,如果这个矩阵表示一个带有一堆洞的3d表面,我想顺利地填充这些洞。

当然,请记住,可能存在一些相当大的漏洞。

效率并不是非常重要,因为这个操作只会发生一次,并且有问题的矩阵不大于 1000x1000 左右。

这是我需要完成的代码:

for(int x=0; x<heightMatrix.cols; x++) {
    for (int y=0; y<heightMatrix.rows; y++) {
        if (heightMatrix.at<char>(x,y) == 0) {
            // ???
        }
    }
}

谢谢!!

4

2 回答 2

0

这个怎么样:

将您的数据放入图像中并使用带有大内核(或大量迭代)的图像关闭:http: //opencv.willowgarage.com/documentation/image_filtering.html#morphologyex

于 2012-08-24T10:16:10.883 回答
0

那这个呢?

int sum = 0;

... paste the following part inside the loop ...

sum += heightMatrix.at<char>(x - 1,y);
sum += heightMatrix.at<char>(x + 1,y);
sum += heightMatrix.at<char>(x,y - 1);
sum += heightMatrix.at<char>(x,y + 1);

heightMatrix.at<char>(x,y) = sum / 4;

由于您处理的是 CV_8UC1 Mat,因此实际上您有一个二维数组,每个像素只有 4 个最近的邻居。

但是有一些警告:

1)将您的平均像素放在浮动垫中以避免四舍五入!

2) to fill the whole Mat with this average may not be what you are looking for if the non-zero pixels are quite sparse: when there is a lot of empty pixels and really few non-zero pixels the more you move away from a non-zero pixel, the more the average converges to 0. And this may happen in as few as 3-4 iterations (another good reason to store not to store the values in a Mat of integers).

于 2018-07-04T13:06:33.923 回答