2017-12-22 10 views
1

私はjavacv/opencvで画像圧縮を行うつもりです。JavaCV/OpenCVでのPCA画像圧縮の方法

Firtsコード:PCA中に

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); 

がプロセスを計算し、私が期待するような方法がbahavingています。

、私の質問は:

私はPCAの結果から、元の画像を圧縮することができますか?

投影後、与えられたコンポーネントの数と画像の高さでMat(projectedMat)を取得します。バックプロジェクション後、ArraySizeは元のImageよりもはるかに高いです。それは私が期待したことではありません。

おかげ

答えて

0

は、私は自分自身のための答えを見つけました。

この問題またはこの文脈での解決策は、浮動小数点演算のために画像を32Fまたは64F型に変換することでした。

イメージまたは偶数行列を計算した後、タイプ8のビット数に変換する必要があります。