基本图像处理-1(图像直方图与数据降维-主成分分析PCA)

直方图

图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来
指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。该
(灰度)图像的直方图可以使用python PIL中的 hist() 函数绘制。

hist(im.flatten(),128)

flatten() 方法将任意数组按照行优先准则转换成一维数组

直方图均衡化

直方图均衡化是指将一幅
图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图
像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好
的方法,并且可以增强图像的对比度。
直方图均衡化的变换函数是图像中像素值的累积分布函数(cumulative distribution function, 简写为 cdf,将像素值的范围映射到目标范围的归一化操作)

def histeq(im,nbr_bins=256):
	""" 对一幅灰度图像进行直方图均衡化 """
	# 计算图像的直方图
	imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
	cdf = imhist.cumsum() # cumulative distribution function
	cdf = 255 * cdf / cdf[-1] # 归一化
	12 | 第 1# 使用累积分布函数的线性插值,计算新的像素值
	im2 = interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape), cd

主成分分析-PCA

PCA( Principal Component Analysis,主成分分析)是一个非常有用的降维技巧。它
可以在使用尽可能少维数的前提下,尽量多地保持训练数据的信息。PCA 产生的投影矩阵可以
被视为将原始坐标变换到现有的坐标系,坐标系中的各个坐标按照重要性递减排列。
为了对图像数据进行 PCA 变换,图像需要转换成一维向量表示。我们可以使用
NumPy 类库中的 flatten() 方法进行变换。
将变平的图像堆积起来,我们可以得到一个矩阵,矩阵的一行表示一幅图像。在计算
主方向之前,所有的行图像按照平均图像进行了中心化。我们通常使用 SVD(Singular
Value Decomposition,奇异值分解)方法来计算主成分。

from PIL import Image
from numpy import *
def pca(X):
	""" 主成分分析:
	输入:矩阵 X,其中该矩阵中存储训练数据,每一行为一条训练数据
	返回:投影矩阵(按照维度的重要性排序)、方差和均值 """
	# 获取维数
	num_data,dim = X.shape
	# 数据中心化
	mean_X = X.mean(axis=0)
	X = X - mean_X
	if dim>num_data:
	# PCA- 使用紧致技巧
	M = dot(X,X.T) # 协方差矩阵
	e,EV = linalg.eigh(M) # 特征值和特征向量
	tmp = dot(X.T,EV).T # 这就是紧致技巧
	V = tmp[::-1] # 由于最后的特征向量是我们所需要的,所以需要将其逆转
	S = sqrt(e)[::-1] # 由于特征值是按照递增顺序排列的,所以需要将其逆转
	for i in range(V.shape[1]):
	V[:,i] /= S
	else:
	# PCA- 使用 SVD 方法PCA( Principal Component Analysis,主成分分析)是一个非常有用的降维技巧
	U,S,V = linalg.svd(X)
	V = V[:num_data] # 仅仅返回前 nun_data 维的数据才合理
	# 返回投影矩阵、方差和均值
	return V,S,mean_X

你可能感兴趣的:(计算机视觉,numpy,opencv,算法)