Как получить значения в четных / нечетных индексах, используя OpenCV, C ++ элегантным способом?

Считайте, у меня есть следующая матрица

0   1  2  3
4   5  6  7
8   9 10 11
12 13 14 15

Я хочу получить значения в четных индексах (оба индекса x и y четные) без использования цикла for.

0  2
8 10

У меня есть изображения большого размера (многие из 5000 * 5000 + матрицы оттенков серого). Использование цикла for не кажется лучшим способом. Я хотел бы услышать, есть ли лучший способ, чем для петель.

Я попытался использовать следующую маску, затем выполнить операции, но это неэффективно, потому что мне нужно сделать умножение 4 * n ^ 2, а не n ^ 2 (Предположим, исходное изображение 2n * 2n)

1 0 1 0
0 0 0 0
1 0 1 0
0 0 0 0

Обратите внимание, что я делаю несколько операций над матрицей. Любая помощь приветствуется.

Заранее спасибо,

1

Решение

Вы можете Удалить бесполезные строки и столбцы, и работают на матрице с половиной размера исходной матрицы.

Вы можете сделать это легко с resize функция с ближайшей интерполяцией:

    #include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main(int argc, char **argv)
{
Mat1b mat = (Mat1b(4,4) << 0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15);

Mat1b res;
resize(mat, res, Size(0, 0), 0.5, 0.5, INTER_NEAREST);

cout << "Mat:" << endl << mat << endl << endl;
cout << "Res:" << endl << res << endl;

return 0;
}

Тогда значения в res это только те значения в нужных вам индексах:

Mat:
[0, 1, 2, 3;
4, 5, 6, 7;
8, 9, 10, 11;
12, 13, 14, 15]

Res:
[0, 2;
8, 10]

Чтобы восстановить значения в исходное положение, вы можете использовать продукт Kronecker (недоступен в OpenCV, но может быть легко реализуется) с подходящим рисунком. Это даст:

Mat:
[0, 1, 2, 3;
4, 5, 6, 7;
8, 9, 10, 11;
12, 13, 14, 15]

Res:
[0, 2;
8, 10]

Res Modified:
[1, 3;
9, 11]

Restored:
[1, 0, 3, 0;
0, 0, 0, 0;
9, 0, 11, 0;
0, 0, 0, 0]

Код:

#include <opencv2/opencv.hpp>
#include <algorithm>
#include <iostream>
using namespace cv;
using namespace std;

Mat kron(const Mat A, const Mat B)
{
CV_Assert(A.channels() == 1 && B.channels() == 1);

Mat1d Ad, Bd;
A.convertTo(Ad, CV_64F);
B.convertTo(Bd, CV_64F);

Mat1d Kd(Ad.rows * Bd.rows, Ad.cols * Bd.cols, 0.0);

for (int ra = 0; ra < Ad.rows; ++ra)
{
for (int ca = 0; ca < Ad.cols; ++ca)
{
Kd(Range(ra*Bd.rows, (ra + 1)*Bd.rows), Range(ca*Bd.cols, (ca + 1)*Bd.cols)) = Bd.mul(Ad(ra, ca));
}
}
Mat K;
Kd.convertTo(K, A.type());
return K;

}int main(int argc, char **argv)
{
Mat1b mat = (Mat1b(4, 4) << 0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15);

Mat1b res;
resize(mat, res, Size(0, 0), 0.5, 0.5, INTER_NEAREST);

cout << "Mat:" << endl << mat << endl << endl;
cout << "Res:" << endl << res << endl << endl;

// Work on Res
res += 1;

cout << "Res Modified:" << endl << res << endl << endl;

// Define the pattern
Mat1b pattern = (Mat1b(2,2) << 1, 0,
0, 0);

// Apply Kronecker product
Mat1b restored = kron(res, pattern);

cout << "Restored:" << endl << restored << endl << endl;

return 0;
}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]