PCA的实现方法

一般来说有两种方法,一种用神经网络计算 ,能绕过求关联矩阵,速度快,适合在线提取;另一种是用线代传统方法计算,缺点是计算复杂性高,不适合在线提取。当然,python和matlab都有现成的接口可以调用,嫌麻烦的话可以直接调用,这篇博客采用神经网络的方法。

以lenna的照片为例 ,演示用pca压缩图片

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.io import loadmat
from skimage import io
from sklearn.decomposition import PCAA=io.imread('lenna.jpg')
A=A/255
io.imshow(A)
plt.show()
print(A.shape)

分通道展示

fig,ax_array=plt.subplots(nrows=1,ncols=4,figsize=(32,32))
cmap_list=['Reds','Greens','Blues']
ax_array[0].imshow(A[:,:,:])
ax_array[0].set_xticks([])
ax_array[0].set_yticks([])
ax_array[0].set_title("Combined", size = 30,color='w')
for i in range(3):ax_array[i+1].imshow(A[:,:,i],cmap=cmap_list[i])ax_array[i+1].set_xticks([])ax_array[i+1].set_yticks([])ax_array[i+1].set_title(cmap_list[i][:-1], size = 30,color='w')
plt.tight_layout()
fig.suptitle("IMAGES OF EACH COLOR CHANNEL", size = 30, y = 0.6, fontweight = "bold",color='w')
plt.show()

图片分通道处理与变形

#三通道分别处理
R,G,B=A[:,:,0],A[:,:,1],A[:,:,2]
R.shape,G.shape,B.shape
#图片变形
train_R=np.zeros((64,4096))
train_G=np.zeros((64,4096))
train_B=np.zeros((64,4096))count2=0
for i in range(0,64):for j in range(0,64):count=0for k in range(0,8):for d in range(0,8):train_R[count][count2]=R[i*8+k][j*8+d]train_G[count][count2]=G[i*8+k][j*8+d]train_B[count][count2]=B[i*8+k][j*8+d]count=count+1count2=count2+1
print(train_R[:,0].shape)

核心点:神经网络迭代计算主成分

#Ojia's PCA 用神经网络提取主成分
def Pca(data,max_epochs=1000, lr_rate=1e-3, e=1e-5):w = np.random.randn(64)count=0for epoch in range(max_epochs):randnumber=random.randint(0,4096)x=data[:,randnumber]y=dot(w,x)change = lr_rate * (y*x - y*y*w)w = w + changey = np.matmul(x, w)ch=np.sqrt(np.sum(change**2))if ch<e:count=count+1 else:count=0if count > 10 :print('迭代停止,已经收敛')return w print('迭代停止,未收敛')return w

迭代计算三个通道的主成分

w_R = Pca(train_R,max_epochs=100000,lr_rate=0.02,e=0.02)
w_G = Pca(train_G,max_epochs=100000,lr_rate=0.02,e=0.02)
w_B = Pca(train_B,max_epochs=100000,lr_rate=0.02,e=0.02)

图片的压缩和解压

#压缩
print(w_R.shape)
compress_R=np.matmul(w_R,train_R )
compress_G=np.matmul(w_G,train_G )
compress_B=np.matmul(w_B,train_B )
w_R_T=w_R.reshape((len(w_R),1))
w_G_T=w_G.reshape((len(w_G),1))
w_B_T=w_B.reshape((len(w_B),1))compress_R1=compress_R.reshape((1,len(compress_R)))
compress_G1=compress_G.reshape((1,len(compress_G)))
compress_B1=compress_B.reshape((1,len(compress_B)))
#解压
decompression_R=dot(w_R_T,compress_R1)
decompression_G=dot(w_G_T,compress_G1)
decompression_B=dot(w_B_T,compress_B1)
print(decompression_R.shape)

形状复原

#复原形状
dec_R=np.zeros((512,512))
dec_G=np.zeros((512,512))
dec_B=np.zeros((512,512))count2=0
for i in range(0,64):for j in range(0,64):count=0for k in range(0,8):for d in range(0,8):dec_R[i*8+k][j*8+d]=decompression_R[count][count2]dec_G[i*8+k][j*8+d]=decompression_G[count][count2]dec_B[i*8+k][j*8+d]=decompression_B[count][count2]count=count+1count2=count2+1

展示压缩后的图像(只提取了最大的特征向量方向上的信息,压缩比64:1)

#展示解压后的图像
A_new=np.zeros(A.shape)
A_new[:,:,0]=dec_R
A_new[:,:,1]=dec_G
A_new[:,:,2]=dec_Bfig,ax_array=plt.subplots(nrows=1,ncols=4,figsize=(32,32))
cmap_list=['Reds','Greens','Blues']
ax_array[0].imshow(A_new[:,:,:])
ax_array[0].set_xticks([])
ax_array[0].set_yticks([])
ax_array[0].set_title("Combined", size = 30,color='g')
for i in range(3):ax_array[i+1].imshow(A_new[:,:,i],cmap=cmap_list[i])ax_array[i+1].set_xticks([])ax_array[i+1].set_yticks([])ax_array[i+1].set_title(cmap_list[i][:-1], size = 30,color='g')
plt.tight_layout()
fig.suptitle("IMAGES OF EACH COLOR CHANNEL(K={})".format(1), size = 30, y = 0.6, fontweight = "bold",color='g')
plt.show()

总结:要提升复原后图像的清晰度的话,可以多提取几个特征向量,只要在PCA部分稍作改动即可,但相应的压缩比也会下降。

Oja‘s PCA 用神经网络提取图片主成分 进行压缩和解压相关推荐

  1. Nodejs提取图片主图色(二)

    Nodejs提取图片主图色(一) 如何提高颜色提取的正确率 主要是 images.jpeg-js.pngjs 共用,彼此之间并不冲突 // node-pixels.js 'use strict';va ...

  2. R语言主成分分析PCA和因子分析EFA、主成分(因子)个数、主成分(因子)得分、主成分(因子)旋转(正交旋转、斜交旋转)、主成分(因子)解释

    R语言主成分分析PCA和因子分析EFA.主成分(因子)个数.主成分(因子)得分.主成分(因子)旋转(正交旋转.斜交旋转).主成分(因子)解释 目录

  3. 基于python的K-means聚类提取图片主色

    基于python+opencv的彩色图片主色提取--利用K-means聚类算法 一.K-means聚类算法 1.K-means算法原理 2. K-means聚类算法流程 3.sklearn库中skle ...

  4. ggbiplot-最好看的PCA作图:样品PCA散点+分组椭圆+主成分丰度和相关

    写在前面 https://github.com/vqv/ggbiplot/blob/master/README.md 前几天在<宏基因组0>微信讨论群看到了有人发了一个上面链接,点开一看居 ...

  5. 神经网络提取图片特征,神经网络算法识别图像

    如何用Python和深度神经网络寻找相似图像 代码首先,读入TuriCreate软件包import turicreate as tc我们指定图像所在的文件夹image,让TuriCreate读取所有的 ...

  6. 图片识别 python 神经网络,神经网络提取图片特征

    Python如何图像识别? Python图片文本识别使用的工具是PIL和pytesser. 因为他们使用到很多的python库文件,为了避免一个个工具的安装,建议使用pythonxypytesser是 ...

  7. 神经网络输入图片大小,神经网络提取图片特征

    BP神经网络输入输出格式问题 在你的代码基础上说了.clc;clear;closeall;p=load('');%你问题最后说的数据文件名跟这个不同. p1=p';t=[1];%这个输出(Target ...

  8. 神经网络给图片生成标题,神经网络提取图片特征

    和神经网络有关,labelimg图片标注生成了xml文件,.xml里面记录了什么?希望有大神解答,感激不尽 . 首先说下打开方法:选择用IE打开或者notepad,然后里面从上到下分别记录了:1(fo ...

  9. vue前端下载——jszip压缩和解压,结合file-saver导出图片zip,每20个图片分一个目录

    使用jszip和file-saver导出图片,并打包为zip: import JSZip from "jszip"; import FileSaver from "fil ...

最新文章

  1. NTU商汤提出新 loss!提升图像重建和图像合成的质量 (ICCV2021)
  2. Windows10编译源码安装Aleth(Ethereum C++ client, tools and libraries)
  3. TinyMCE 4.0b1 发布,全新设计和 API
  4. 用这种方式,我每次都是朋友圈里第一个预见AI科技趋势的人
  5. 自然语言处理期末复习(3)-(5)模型与句法分析
  6. fantouch os Android 7,Funtouch OS 3.1 with Android 7.1升级计划
  7. MySQL调优(三):索引基本实现原理及索引优化,哈希索引 / 组合索引 / 簇族索引等
  8. 用C#写MSN机器人
  9. 利用python爬虫(案例7)--X讯招聘的小职位们
  10. P1115 最大子段和(python3实现)
  11. 等式与不等式约束的序列二次规划(SQP)
  12. Bootstrap显示或隐藏内容
  13. typedef 定义函数指针
  14. mysql序列号生成软件_mysql 序列号生成器
  15. 在百度地图中获取当前点击 位置的 经纬度 和 地址信息
  16. Revel模板引擎Template基本语法
  17. iOS 如何判断静音开关是否打开
  18. openGL,glut库安装(vs2013)
  19. sftp stp差异
  20. WPS文档究竟有多好,不服一起跑个分?

热门文章

  1. 我们成功给OpenCV添加了三维点云降采样算法!
  2. (学习笔记)手把手教你学51单片机:变量进阶与点阵LED
  3. 概率论与数理统计学习总结(浙大第四版 第一章)
  4. 含分布式电源的配电网日前两阶段优化调度模型(Matlab代码实现)
  5. Windows下使用VS2019编译libiconv-1.16
  6. Java文字小游戏 The Matrix SalaryMan 1.0v
  7. unity实现镜头拉近拉远的方式
  8. 如何通过PE工具箱进行密码破解,系统/数据备份,恢复
  9. 无法打开文件“opencv_word410d.lib”
  10. 使用json、yaml、toml作为配置文件,你知道他们的区别吗