簡體   English   中英

在 OpenCV 中復制像素值

[英]Duplicating pixel values in OpenCV

我有 RGB 圖像,例如大小為 2x2 如下:

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

我想將每個像素(所有 RGB 通道)復制 2x2 次並獲得如下所示的圖像:

[  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  ]

在 Matlab 或 Python 中,我只需使用kron函數即可完成此操作,但我無法弄清楚如何在 OpenCV C++ 中輕松完成。 請注意,這是一個微不足道的示例,我實際上想將每個像素復制 16x16 並在更大的圖像上進行復制,當然不是 2x2。

您可以使用最近鄰插值INTER_NEAREST resize

碼:

Mat mInput(2, 2, CV_8UC3),mOutput(4, 4, CV_8UC3);

mInput.at<Vec3b>(0,0)= Vec3b(0,14,255);
mInput.at<Vec3b>(0,1)= Vec3b(75,156,255);
mInput.at<Vec3b>(1,0)= Vec3b(45,255,234);
mInput.at<Vec3b>(1,1)= Vec3b(236,141,255);

cout<<mInput<<"\n";

resize(mInput,mOutput,Size(4,4),0,0,INTER_NEAREST);

cout<<mOutput<<"\n";;    

產量

[  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 . . .

感謝@wendelbsilva在評論中指出這一點。

你可以包裝kron函數,就像在Matlab和Python中那樣。 請注意,Kronecker產品是在單通道矩陣上定義的,因此您需要拆分平面BGR矩陣,應用kron ,然后合並回來。

以下代碼將生成您的確切輸出:

#include <opencv2\opencv.hpp>
#include <iostream>
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<Mat> 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;
}

我只會使用OpenCV 重復功能,它比使用最近的鄰居調整大小更快(並且更具可讀性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM