1. 程式人生 > >對KLT,主成分分析(PCA)演算法的理解

對KLT,主成分分析(PCA)演算法的理解

複製程式碼
  1 #include "pcaface.h"
  2 #include "ui_pcaface.h"
  3 #include <QString>
  4 #include <iostream>
  5 #include <stdio.h>
  6 
  7 using namespace std;
  8 
  9 PCAFace::PCAFace(QWidget *parent) :
 10     QDialog(parent),
 11     ui(new Ui::PCAFace)
 12 {
 13     ui->setupUi(this
); 14 src_face1 = imread("./images/1.pgm", 0); 15 16 //下面的程式碼為設定圖片顯示區域自適應圖片的大小 17 ui->face1Browser->setFixedHeight(src_face1.rows+1); 18 ui->face1Browser->setFixedWidth(src_face1.cols+1); 19 ui->face2Browser->setFixedHeight(src_face1.rows+1); 20 ui->face2Browser->setFixedWidth(src_face1.cols+1
); 21 ui->face3Browser->setFixedHeight(src_face1.rows+1); 22 ui->face3Browser->setFixedWidth(src_face1.cols+1); 23 24 ui->face4Browser->setFixedHeight(src_face1.rows+1); 25 ui->face4Browser->setFixedWidth(src_face1.cols+1); 26 ui->face5Browser->setFixedHeight(src_face1.rows+1
); 27 ui->face5Browser->setFixedWidth(src_face1.cols+1); 28 ui->face6Browser->setFixedHeight(src_face1.rows+1); 29 ui->face6Browser->setFixedWidth(src_face1.cols+1); 30 31 ui->face7Browser->setFixedHeight(src_face1.rows+1); 32 ui->face7Browser->setFixedWidth(src_face1.cols+1); 33 ui->face8Browser->setFixedHeight(src_face1.rows+1); 34 ui->face8Browser->setFixedWidth(src_face1.cols+1); 35 ui->face9Browser->setFixedHeight(src_face1.rows+1); 36 ui->face9Browser->setFixedWidth(src_face1.cols+1); 37 38 for(int i = 1; i <= 15; i++) 39 { 40 stringstream ss; 41 string num; 42 ss<<i; //將整數i讀入字串流 43 ss>>num; //將字串流中的資料傳入num,這2句程式碼即把數字轉換成字元 44 string image_name = ("./images/" + num + ".pgm");//需要讀取的圖片全名 45 src.push_back(imread(image_name, 0)); 46 } 47 total= src[0].rows*src[0].cols; 48 } 49 50 PCAFace::~PCAFace() 51 { 52 delete ui; 53 } 54 55 void PCAFace::changeEvent(QEvent *e) 56 { 57 QDialog::changeEvent(e); 58 switch (e->type()) { 59 case QEvent::LanguageChange: 60 ui->retranslateUi(this); 61 break; 62 default: 63 break; 64 } 65 } 66 67 //將Mat內的內容歸一化到0~255,歸一化後的型別為但通道整型 68 Mat PCAFace::normalize(const Mat& src) { 69 Mat srcnorm; 70 cv::normalize(src, srcnorm, 0, 255, NORM_MINMAX, CV_8UC1); 71 return srcnorm; 72 } 73 74 75 void PCAFace::on_startButton_clicked() 76 { 77 //先顯示3張原圖 78 ui->face1Browser->append("<img src=./images/1.pgm>"); 79 ui->face2Browser->append("<img src=./images/7.pgm>"); 80 ui->face3Browser->append("<img src=./images/14.pgm>"); 81 82 //mat陣列用來存放讀取進來的所有圖片的資料,其中mat的每一列對應1張圖片,該實現在下面的for函式中 83 Mat mat(total, src.size(), CV_32FC1); 84 for(int i = 0; i < src.size(); i++) 85 { 86 Mat col_tmp = mat.col(i); 87 src[i].reshape(1, total).col(0).convertTo(col_tmp, CV_32FC1, 1/255.); 88 } 89 int number_principal_compent = 4; //保留最大的主成分數 90 91 //構造pca資料結構 92 PCA pca(mat, Mat(), CV_PCA_DATA_AS_COL, number_principal_compent); 93 94 95 //pca.eigenvectors中的每一行代表輸入資料協方差矩陣一個特徵向量,且是按照該協方差矩陣的特徵值進行排序的 96 pca_face1 = normalize(pca.eigenvectors.row(0)).reshape(1, src[0].rows); //第一個主成分臉 97 imwrite("./result/pca_face1.jpg", pca_face1);//顯示主成分特徵臉1 98 ui->face7Browser->append("<img src=./result/pca_face1.jpg>"); 99 100 pca_face2 = normalize(pca.eigenvectors.row(1)).reshape(1, src[0].rows); //第二個主成分臉 101 imwrite("./result/pca_face2.jpg", pca_face2);//顯示主成分特徵臉2 102 ui->face8Browser->append("<img src=./result/pca_face2.jpg>"); 103 104 pca_face3 = normalize(pca.eigenvectors.row(2)).reshape(1, src[0].rows); //第三個主成分臉 105 imwrite("./result/pca_face3.jpg", pca_face3);//顯示主成分特徵臉3 106 ui->face9Browser->append("<img src=./result/pca_face3.jpg>"); 107 108 //將原始資料通過PCA方向投影,即通過特徵向量的前面幾個作用後的資料,因此這裡的dst的尺寸變小了 109 dst = pca.project(mat); 110 111 //通過方向投影重構原始人臉影象 112 project_face1 = normalize(pca.backProject(dst).col(1)).reshape(1, src[0].rows); 113 imwrite("./result/project_face1.jpg", project_face1); 114 ui->face4Browser->append("<img src=./result/project_face1.jpg>"); 115 116 project_face2 = normalize(pca.backProject(dst).col(7)).reshape(1, src[0].rows); 117 imwrite("./result/project_face2.jpg", project_face2); 118 ui->face5Browser->append("<img src=./result/project_face2.jpg>"); 119 120 project_face3 = normalize(pca.backProject(dst).col(14)).reshape(1, src[0].rows); 121 imwrite("./result/project_face3.jpg", project_face3); 122 ui->face6Browser->append("<img src=./result/project_face3.jpg>"); 123 } 124 125 void PCAFace::on_closeButton_clicked() 126 { 127 close(); 128 }
複製程式碼

相關推薦

KLT成分分析PCA演算法理解

1 #include "pcaface.h" 2 #include "ui_pcaface.h" 3 #include <QString> 4 #include <iostream> 5 #include <stdio.h> 6 7 usi

成分分析PCA演算法做人臉識別

詳細資料可以參考https://www.cnblogs.com/xingshansi/p/6445625.html一、概念主成分分析(PCA)是一種統計方法。通過正交變換將一組可能存在相關性的變數轉化為一組線性不相關的變數,轉換後的這組變數叫主成分。二、思想PCA的思想是將n

成分分析pca演算法原理

影象處理中對很多副圖片提取特徵時,由於特徵的維數過高而影響程式的效率,所以用到pca進行特徵降維。 那怎樣才能降低維數呢?它又用到了什麼數學方法呢? 1.協方差矩陣         假設有一個樣本集X,裡面有N個樣本,每個樣本的維度為d。即: 將這些樣本組織成樣本矩陣形

成分分析pca演算法的實現步驟及程式碼

%%%%%%%%%%%%開啟一個30行8列資料的txt檔案%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %第一步:輸入樣本矩陣%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% filename='src.txt'; fid=fopen(filename,'

深入學習成分分析PCA演算法原理及其Python實現

一:引入問題   首先看一個表格,下表是某些學生的語文,數學,物理,化學成績統計:   首先,假設這些科目成績不相關,也就是說某一科目考多少分與其他科目沒有關係,那麼如何判斷三個學生的優秀程度呢?首先我們一眼就能看出來,數學,物理,化學這三門課的成績構成了這組資料的主成分(很顯然,數學作為第一主成分,

成分分析PCA演算法以及PCA在人臉識別上的應用及程式碼

        PCA(Principal Component Analysis)是一種常用的資料分析方法,PCA通過線性變換將原始資料變換為一組各維度線性無關的表示,可用於提取資料的主要特徵分量,可用於高維資料的降維。        一般情況下,在資料探勘和機器學習中,資

使用成分分析PCA方法資料進行降維

我們知道當資料維度太大時,進行分類任務時會花費大量時間,因此需要進行資料降維,其中一種非常流行的降維方法叫主成分分析。 Exploratory Data Analysis 鳶尾花資料集: import numpy as np from skle

成分分析PCA原理詳解轉載

增加 信息 什麽 之前 repl 神奇 cto gmail 協方差 一、PCA簡介 1. 相關背景 上完陳恩紅老師的《機器學習與知識發現》和季海波老師的《矩陣代數》兩門課之後,頗有體會。最近在做主成分分析和奇異值分解方面的項目,所以記錄一下心得體會。

[python機器學習及實踐(6)]Sklearn實現成分分析PCA

相關性 hit 變量 gray tran total 空間 mach show 1.PCA原理 主成分分析(Principal Component Analysis,PCA), 是一種統計方法。通過正交變換將一組可能存在相關性的變量轉換為一組線性不相關的變量,轉換後的這組

【原始碼】成分分析PCA與獨立分量分析ICAMATLAB工具箱

本MATLAB工具箱包含PCA和ICA實現的多個函式,並且包括多個演示示例。 在主成分分析中,多維資料被投影到最大奇異值相對應的奇異向量上,該操作有效地將輸入訊號分解成在資料中最大方差方向上的正交分量。因此,PCA常用於維數降低的應用中,通過執行PCA產生資料的低維表示,同時,該低維表

成分分析PCA詳細講解

介紹 主成分分析(Principal Component Analysis,PCA)是一種常用的資料降維演算法,可以將高維度的資料降到低維度,並且保留原始資料中最重要的一些特徵,同時去除噪聲和部分關聯特徵,從而提高資料的處理效率,降低時間成本。 資料降維優點: 低維資

成分分析PCA原理詳解

1. 問題      真實的訓練資料總是存在各種各樣的問題: 1、 比如拿到一個汽車的樣本,裡面既有以“千米/每小時”度量的最大速度特徵,也有“英里/小時”的最大速度特徵,顯然這兩個特徵有一個多餘。 2、 拿到一個數學系的本科生期末考試成績單,裡面有三列,一列是對數學的

成分分析PCA在壓縮影象方面的應用

一、主成分分析的原理主成分分析能夠通過提取資料的主要成分,減少資料的特徵,達到資料降維的目的。具體的原理可參見之前寫的關於PCA原理的一篇文章:二、使用matlab模擬實現%% 利用PCA對影象壓縮 close all clear all clc %% 輸入 In = i

Machine Learning第八講【非監督學習】--成分分析PCA

一、Principal Component Analysis Problem Formulation(主成分分析構思) 首先來看一下PCA的基本原理: PCA會選擇投影誤差最小的一條線,由圖中可以看出,當這條線是我們所求時,投影誤差比較小,而投影誤差比較大時,一定是這條線偏離最優直線。

機器學習實戰學習筆記5——成分分析PCA

1.PCA演算法概述 1.1 PCA演算法介紹 主成分分析(Principal Component Analysis)是一種用正交變換的方法將一個可能相關變數的觀察值集合轉換成一個線性無關變數值集合的統計過程,被稱為主成分。主成分的數目小於或等於原始

成分分析PCA-理論基礎

要解釋為什麼協方差矩陣的特徵向量可以將原始特徵對映到 k 維理想特徵,我看到的有三個理論:分別是最大方差理論、最小錯誤理論和座標軸相關度理論。這裡簡單探討前兩種,最後一種在討論PCA 意義時簡單概述。 最大方差理論 在訊號處理中認為訊號具有較大的方差

成分分析PCA的線性代數推導過程

【摘自Ian Goodfellow 《DEEP LEANRNING》一書。覺得寫得挺清楚,儲存下來學習參考使用。】 主成分分析(principal components analysis, PCA)是一個簡單的機器學習演算法,可以通過基礎的線性代數知識推導。 假設在n維的R空間中我們有 m

成分分析PCA與Kernel PCA

本部落格在之前的文章【1】中曾經介紹過PCA在影象壓縮中的應用。其基本思想就是設法提取資料的主成分(或者說是主要資訊),然後摒棄冗餘資訊(或次要資訊),從而達到壓縮的目的。本文將從更深的層次上討論PCA

機器學習十三:CS229ML課程筆記9——因子分析成分分析PCA、獨立成分分析ICA

1.因子分析:高維樣本點實際上是由低維樣本點經過高斯分佈、線性變換、誤差擾動生成的,因子分析是一種資料簡化技術,是一種資料的降維方法,可以從原始高維資料中,挖掘出仍然能表現眾多原始變數主要資訊的低維資料。是基於一種概率模型,使用EM演算法來估計引數。因子分析,是分析屬性們的公

成分分析PCA原理總結

    主成分分析(Principal components analysis,以下簡稱PCA)是最重要的降維方法之一。在資料壓縮消除冗餘和資料噪音消除等領域都有廣泛的應用。一般我們提到降維最容易想到的演算法就是PCA,下面我們就對PCA的原理做一個總結。 1. PCA的思想     PCA顧名思義,就是找出