Я хочу задать вопрос, который похож на этот пост , но я думаю, что мне нужен более подробный ответ.
В MATLAB я пишу код PCA, который дает мне матрицу коэффициентов 3x3 (собственный вектор, упомянутый в документации):
function [Ipc1, Ipc2, Ipc3] = applyPCA(I)
X = reshape(I,size(I,1)*size(I,2),size(I,3));
[l score latent] = pca(X);
Itransformed = X*coeff;
Ipc1 = reshape(Itransformed(:,1),size(I,1),size(I,2));
Ipc2 = reshape(Itransformed(:,2),size(I,1),size(I,2));
Ipc3 = reshape(Itransformed(:,3),size(I,1),size(I,2));
figure, imshow(Ipc1,[]);
figure, imshow(Ipc2,[]);
figure, imshow(Ipc3,[]);
end
Размер моего изображения 307x309x3, и я применяю PCA к каждому каналу rgb (пикселям). Я сделал тот же метод, используя OpenCV с C ++.
cv::Mat scene = cv::imread("deneme.JPG");
std::cout<<"scene.type(): "<<scene.type()<<std::endl;
scene.convertTo(scene, CV_32FC3, 1/255.0);
std::vector<cv::Mat> bgr; //destination array
split(scene,bgr);//split source
cv::Mat data(static_cast<int>(3), scene.rows * scene.cols, CV_32F);
// Turn an image into one row vector in the data matrix
for(unsigned int i = 0; i < bgr.size(); i++)
{
// Extract image as one long vector of size w x h x 3
cv::Mat image = bgr[i].reshape(1,1);
// Copy the long vector into one row of the destm
image.copyTo(data.row(i));
}
cv::PCA pca(data, cv::Mat(), CV_PCA_DATA_AS_ROW);
cv::Mat mean=pca.mean; // get mean of Data in Mat form
cv::Mat eigenvalue=pca.eigenvalues;
cv::Mat eigenvectors=pca.eigenvectors;
, но размер собственного вектора и другие такие же
- scene.size (): [309 x 307]
- eigenvectors.size (): [94863 x 3]
- eigenvalues.size (): [1 x 3]
Я что-то упустил или вы можете сказать мне, как использовать OpenCV PCA для получения матрицы коэффициентов, как я сделал с помощью MATLAB?