0

基本的な問題は次のとおりです。

私は CV_8UC1 型の CVMat を持っています。これはほとんどが 1 から 100 までの整数 (実際には char ですが、なんでも) で埋められています。残りの要素はゼロです。

この場合、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

これはどうですか?

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 を扱うので、実際には 2 次元配列があり、各ピクセルには 4 つの最近傍があります。

ただし、いくつかの注意事項があります。

1)丸めを避けるために、平均化されたピクセルをフロートのマットに入れてください!

2) マット全体をこの平均で埋めることは、ゼロ以外のピクセルが非常にまばらな場合、探しているものではない可能性があります。空のピクセルが多く、ゼロ以外のピクセルがほとんどない場合、ゼロ以外のピクセルほど、平均が 0 に収束します。これは、3 ~ 4 回の反復で発生する可能性があります (整数のマットに値を格納しないように格納するもう 1 つの正当な理由)。

于 2018-07-04T13:06:33.923 に答える
0

代わりにこれはどうですか:

データを画像に入れ、大規模なカーネル (または多くの反復) で画像を閉じる: http://opencv.willowgarage.com/documentation/image_filtering.html#morphologyex

于 2012-08-24T10:16:10.883 に答える