CV(3)--噪声滤波和特征
前言
仅记录学习过程,有问题欢迎讨论
图像噪声(需要主动干扰的场景):
-
添加高斯噪声:概率密度函数服从高斯分布的一类噪声
通过设置sigma和mean生成符合高斯分布的随机数,然后计算输出像素,放缩到0-255,循环所有像素,输出图像。 -
添加椒盐噪声:随机出现的白点或者黑点
设置信噪比SNR,总数SR,加噪的数量为SNR*SR;随机指定像素位置,指定像素点为0或者255,,输出图像。
图像滤波(消除噪声):
目的: 消除图像中混入的噪声;为图像识别抽取出图像特征。
-
均值滤波:取像素平均值,替换中心像素值,计算速度快,算法简单;
降低噪声的同时使图像产生模糊,特别是景物的边缘和细节部分 -
中值滤波:取像素中值,替换中心像素值,计算速度慢,算法复杂;
抑制效果很好,画面的清析度基本保持;对高斯噪声的抑制效果不是很好 -
最大最小值滤波:排序替换中心为最大or最小值
-
引导滤波:当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。这种模型,在表示非解析函数上,非常有用
图像增强:
点处理技术。只对单个像素进行处理。
- 线性变换:图像增强线性变换主要对图像的对比度和亮度进行调整
- 分段线性变换:对处于某个感兴趣的区域的x,将其对比度系数a增大或减小,从而增大或减小这个区域的对比度
- 对数变换:对数变换将图像的低灰度值部分扩展,将其高灰度值部分压缩,以达到强调图像低灰度部分的目的;
- 幂律变换:主要用于图像的校正,对漂白的图片或者是过黑的图片进行修正
领域处理技术。对像素点及其周围的点进行处理,即使用卷积核
- 直方图均衡化
- 各种滤波
特征选择(3选2):
选择尽可能少的子特征,模型的效果不会显著下降,并且结果的类别分布尽可能的接近真实的类别分布
目的:降维 提升效率 降低学习难度
特征提取(3变为2):
提取特征可以组合新的特征,和特征选择一致都属于降维
-
基于图像传统特征
- 主成分分析PCA(投影降维):
目标:降维后同一维度的方差最大(差异大,可以体现区别),不同维度之间的相关性为0
- 对原始数据零均值化(中心化):平移使得所有数据的中心为0,0
- 求协方差矩阵(同一样本):按照不同维度求协方差矩阵求均值,体现特征之间相关性
- 对协方差矩阵求特征向量和特征值,这些特征向量组成了新的特征空间。
- 按照特征值大小排序,选择前n(降的维度)个特征向量,组成新的特征空间(基底)
- 将原始数据投影到新的特征空间,得到降维后的数据
- 主成分分析PCA(投影降维):
-
基于深度学习特征:CNN
高斯/椒盐噪声和PCA的实现
"""
week4 work
1.实现高斯噪声和椒盐噪声
2.实现PCA
"""
import random
import cv2
import matplotlib.pyplot as plt
import numpy as np
import sklearn.decomposition as dp
# 添加高斯噪声
def GaussianNoise(img, mean, sigma, per):
img_gus = img.copy()
# 随机的像素点个数
random_num = int(img.shape[0] * img.shape[1] * per)
for i in range(random_num):
# 随机像素点
random_x = random.randint(0, img.shape[0] - 1)
random_y = random.randint(0, img.shape[0] - 1)
img_gus[random_x, random_y] = img_gus[random_x, random_y] + random.gauss(mean, sigma)
# 若灰度值小于0则强制为0,若灰度值大于255则强制为255
if img_gus[random_x, random_y] < 0:
img_gus[random_x, random_y] = 0
elif img_gus[random_x, random_y] > 255:
img_gus[random_x, random_y] = 255
return img_gus
# 添加椒盐噪声
def SaltAndPepperNoise(img, per):
img_sp = img.copy()
# 随机的像素点个数
random_num = int(img.shape[0] * img.shape[1] * per)
for i in range(random_num):
# 随机像素点
random_x = random.randint(0, img.shape[0] - 1)
random_y = random.randint(0, img.shape[0] - 1)
# 随机黑白点
if random.random() >= 0.5:
img_sp[random_x, random_y] = 0
else:
img_sp[random_x, random_y] = 255
return img_sp
# 实现PCA 降维
def PCA(data, k):
# 计算均值
mean = np.mean(data, axis=0)
# 矩阵中心化
data_mean = data - mean
# 计算协方差矩阵
cov = np.cov(data_mean, rowvar=False)
# 计算特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov)
# 将特征值和特征向量组合成元组列表,并按特征值从大到小排序
eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i]) for i in range(len(eig_vals))]
print('特征值和特征向量:\n', eig_pairs)
# 按特征值从大到小排序
eig_pairs.sort(key=lambda x: x[0], reverse=True)
# 对特征向量降为为k个维度
eig_vecs = [eig_pairs[i][1] for i in range(k)]
# 转化为array 3×2
eig_vecs = np.transpose(eig_vecs)
print('eig_vecs:\n', eig_vecs)
# # 将特征向量组合成矩阵
# 将数据投影到特征向量上
data_pca = np.dot(data, eig_vecs)
# 返回降维后的数据
return data_pca
# img = cv2.imread("lenna.png", 0) # 注意后面参数 为0 变为一个通道
# cv2.imshow("original", img)
# img_gus = GaussianNoise(img, 2, 4, 0.8)
# cv2.imshow("gus_img", img_gus)
# img_sp = SaltAndPepperNoise(img, 0.2)
# cv2.imshow("sp_img", img_sp)
# cv2.waitKey(0)
X = np.array([[10, 15, 29],
[15, 46, 13],
[23, 21, 30],
[11, 9, 35],
[42, 45, 11],
[9, 48, 5],
[11, 21, 14],
[8, 5, 15],
[11, 12, 21],
[21, 20, 25]])
K = np.shape(X)[1] - 1
print('样本集(10行3列,10个样例,每个样例3个特征):\n', X)
pca = PCA(X,K)
print('降维后的样本集:\n', pca)