Duplication des valeurs de pixels dans OpenCV

J’ai des images RVB, par exemple de taille 2×2, comme suit:

[ 0, 14, 255, 75, 156, 255; 45, 255, 234, 236, 141, 255] 

Je voudrais dupliquer 2×2 fois chaque pixel (tous les canaux RVB) et obtenir des images ressemblant à:

 [ 0, 14, 255, 0, 14, 255, 75, 156, 255, 75, 156, 255; 0, 14, 255, 0, 14, 255, 75, 156, 255, 75, 156, 255; 45, 255, 234, 45, 255, 234, 236, 141, 255, 236, 141, 255; 45, 255, 234, 45, 255, 234, 236, 141, 255, 236, 141, 255 ] 

En Matlab ou en Python, je le ferais simplement en utilisant la fonction kron mais je ne savais pas comment le faire facilement avec OpenCV C ++. Notez que ceci est un exemple sortingvial, je voudrais en fait dupliquer chaque pixel de 16×16 et le faire sur des images beaucoup plus grandes, pas 2×2 bien sûr.

Vous pouvez utiliser le resize avec l’interpolation du voisin le plus proche INTER_NEAREST :

Code:

 Mat mInput(2, 2, CV_8UC3),mOutput(4, 4, CV_8UC3); mInput.at(0,0)= Vec3b(0,14,255); mInput.at(0,1)= Vec3b(75,156,255); mInput.at(1,0)= Vec3b(45,255,234); mInput.at(1,1)= Vec3b(236,141,255); cout< 

Sortie

 [ 0, 14, 255, 75, 156, 255; 45, 255, 234, 236, 141, 255] [ 0, 14, 255, 0, 14, 255, 75, 156, 255, 75, 156, 255; 0, 14, 255, 0, 14, 255, 75, 156, 255, 75, 156, 255; 45, 255, 234, 45, 255, 234, 236, 141, 255, 236, 141, 255; 45, 255, 234, 45, 255, 234, 236, 141, 255, 236, 141, 255] Press any key to continue . . . 

Merci à @wendelbsilva pour l'avoir signalé dans les commentaires.

Vous pouvez envelopper la fonction kron et faire comme dans Matlab et Python. Notez que le produit Kronecker est défini sur des masortingces à canal unique. Vous devez donc scinder la masortingce BGR des plans, appliquer le kron , puis fusionner en arrière.

Ce code ci-dessous produira votre sortie exacte:

 #include  #include  using namespace std; using namespace cv; 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() { Mat3d A(2,2); A(0, 0) = Vec3d(0, 14, 255); A(0, 1) = Vec3d(75, 156, 255); A(1, 0) = Vec3d(45, 255, 234); A(1, 1) = Vec3d(236, 141, 255); cout << "A:" << endl; cout << A << endl; Mat1d B = Mat1d::ones(2,2); cout << "B:" << endl; cout << B << endl; vector planes; split(A, planes); for (int i = 0; i < 3; ++i) { planes[i] = kron(planes[i], B); } Mat K; merge(planes, K); cout << "K:" << endl; cout << K << endl; return 0; }