我有一些图像,想看看图像的特征值(作为图像是一个矩阵)。我的问题是,图像的形状是TensorShape([577, 700, 3])
我怎么可能对其进行一些预处理才能使其特征分解?
我的尝试:
import tensorflow as tf
import numpy as np
from numpy import linalg as LA
import matplotlib.pyplot as plt
image_path = tf.keras.utils.get_file('YellowLabradorLooking_new.jpg', 'https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg')
image_raw = tf.io.read_file(image_path)
image = tf.image.decode_image(image_raw)
image = tf.cast(image, tf.float32)
image = tf.image.resize(image, (224, 224))
LA.eig(image)
灰度图像可以(通常是)用矩阵表示。彩色图像则不能。它用三个矩阵表示,每个颜色通道一个。
这是你的代码片段的问题。la.eig()
期望得到一个正方形数组,或者在其最后两个轴上包含正方形数组的数组,但得到的是形状为(224, 224, 3)
的数组。
要解决这个问题,您可以使用np.rollaxis()
函数将两个224
轴移到末端。对于每个颜色通道,特征值和-向量将分别计算。
如果您有n
图像,并且如果图像大小相同,并且图像以某种方式居中,那么您可以认为图像是来自分布的样本,并且可以使用特征值分解来研究图像中不同像素在整个集合中的变化情况。
在这种情况下:假设你有一个n
[H,W]
图像的集合。您可以将图像扁平化并形成[H*W, n]
矩阵。如果图像是RGB的,它可以是一个[H*W*3, n]
数组——即每个像素位置和每个颜色通道被视为一个独立的维度。
特征值分解会给你一个H*W*3
维向量的集合,它可以被重塑回RGB图像。获得所有特征向量是不可能的(H*W*3*H*W*3
通常是巨大的),但是计算前3-5个特征值和特征向量应该不是问题,即使HxWx3
很大。
你可以找到一个更详细的描述搜索"Eigenfaces";例如openv -eigenfaces-for-face-recognition, wikipedia,经典CVPR91论文等