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