2017-12-22 13 views
1

Ich bin bereit, Bildkomprimierung in javacv/opencv zu tun.Wie mache ich PCA Bildkomprimierung in JavaCV/OpenCV?

Firts der Code:

CanvasFrame canvasOrig = new CanvasFrame("Original"); 
canvasOrig.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

CanvasFrame canvasOrig = new CanvasFrame("Original"); 
canvasOrig.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

CanvasFrame canvasGray = new CanvasFrame("Gray"); 
canvasGray.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

CanvasFrame canvasPCA = new CanvasFrame("PCA"); 
canvasPCA.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

OpenCVFrameConverter.ToIplImage t = new OpenCVFrameConverter.ToIplImage(); 
IplImage image = cvLoadImage("640x480.jpg"); 

Mat imageOriginal = t.convertToMat(t.convert(image)); 
Mat imageGray = new Mat(); 
cvtColor(imageOriginal, imageGray, CV_RGB2GRAY); 
System.out.println("ArraySize-Original-Mat: "+imageGray.arraySize()); 

PCA pca = new PCA(imageGray,new Mat(), CV_PCA_DATA_AS_ROW, 48); 
Mat eigValues = pca.eigenvalues().clone(); 
Mat eigVectors = pca.eigenvectors().clone(); 

Mat projectedMat = new Mat(); 
pca.project(imageGray, projectedMat); 

Während PCA Berechnung des Prozesses und die Methoden sind bahaving wie ich erwarten würde.

Meine Frage ist:

Wie kann ich das ursprüngliche Bild von den Ergebnissen des PCA komprimieren?

Nach der Projektion bekomme ich eine Mat (projectedMat) mit der Anzahl der gegebenen Komponenten und der Höhe des Bildes. Nach der Rückprojektion ist die ArraySize viel höher als das Originalbild. Das habe ich nicht erwartet.

Dank

Antwort

0

fand ich die Antwort für mich.

Das Problem oder in diesem Zusammenhang die Lösungen war das Bild in Typ 32F oder 64F für Fließkommaoperationen zu konvertieren.

Nach der Berechnung von pca muss die Bild- oder gerade Matrix wieder in 8-Bit-Zahlen umgewandelt werden.