OpenCV:在CV Mat中填写缺失的元素,平均最近的非零邻居?

时间:2012-08-24 01:47:38

标签: c++ opencv matrix

基本问题是:

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

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

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

效率不是 super 重要,因为此操作只会发生一次,并且所讨论的矩阵不会大于1000x1000左右。

以下是我需要完成的代码:

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

谢谢!

2 个答案:

答案 0 :(得分:0)

相反如何:

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

答案 1 :(得分: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以来,您实际上拥有一个2d数组,每个像素只有4个最近的邻居。

但是有一些警告:

1)将平均像素放入浮点数中,以免舍入!

2)如果非零像素非常稀疏,则用该平均值填充整个Mat可能不是您要查找的内容:当有很多空白像素而实际上非零像素很少时,您移动的越多距离非零像素越远,平均值收敛到0越多。这可能会发生3-4次迭代(这是不将值存储在整数矩阵中的另一个很好的理由)。