基本问题是:
我有一个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) {
// ???
}
}
}
谢谢!
答案 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次迭代(这是不将值存储在整数矩阵中的另一个很好的理由)。