当前位置: 首页 > news >正文

图像的特征提取

特征提取的方法主要是通过属性间的关系,如组合不同的属性得到新的属性,这样就改变了原来的特征空间。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。特征的好坏对泛化性能有至关重要的影响。

1. 特征降维:主成分分析法(PCA)

PCA所做的就是旋转所有的数据点直到它们分布到可以解释大部分数据分布的两个坐标系中。

接下来通过一个例子,感受主成分分析法的作用:

In [ ]:

%matplotlib inline

import numpy as np

import matplotlib.pyplot as plt

import cv2

首先创建一个散点图,模拟原始图像的分布:

In [ ]:

#均值

mean = [20, 20]

#协方差矩阵

cov = [[5 ,0], [25, 25]]

x, y = np.random.multivariate_normal(mean,cov,1000).T

# 输出原始图像

plt.plot(x,y,'o',zorder=1)

plt.xlabel('feature1')

plt.ylabel('feature2')

plt.show()

下面将特征向量x和y组成一个特征矩阵X:

In [ ]:

#把特征向量x和y组合成一个特征矩阵X

X= np.vstack((x,y)).T

#在特征X上计算PCA,指定一个空的np.array([])数组用作蒙版参数,告诉opencv使用特征矩阵上的所有数据点。

mu,eig= cv2.PCACompute(X, np.array([]))

print(eig)

返回两个值:投影前减去的平均值,和协方差矩阵的特征向量(eig)
这些特征向量指向PCA认为最有信息性的方向。

In [ ]:

# 画出上面得出的特征向量

plt.plot(x, y, 'o', zorder=1)

plt.quiver(mean[0], mean[1], eig[:, 0], eig[:, 1], zorder=3, scale=0.2, units='xy')

plt.text(mean[0] + 5 * eig[0, 0], mean[1] + 5 * eig[0, 1], 'u1', zorder=5,

         fontsize=16, bbox=dict(facecolor='white', alpha=0.6))

plt.text(mean[0] + 7 * eig[1, 0], mean[1] + 4 * eig[1, 1], 'u2', zorder=5,

         fontsize=16, bbox=dict(facecolor='white', alpha=0.6))

plt.axis([0, 40, 0, 40])

plt.xlabel('feature 1')

plt.ylabel('feature 2')

plt.show()

用PCA进行压缩阵列,旋转数据将最大分布方向的两个坐标轴与xy轴对齐:

In [ ]:

X2= cv2.PCAProject(X,mu,eig)

plt.plot(X2[:, 0], X2[:, 1], 'o')

plt.xlabel('first principal component')

plt.ylabel('second principal component')

plt.axis([-20, 20, -10, 10])

plt.show()

还可以基于sklearn实现独立的主成分分析:

In [ ]:

from sklearn import decomposition

ica= decomposition.FastICA()

X3= ica.fit_transform(X)

plt.plot(X3[:, 0], X3[:, 1], 'o')

plt.xlabel('first independent component')

plt.ylabel('second independent component')

plt.axis([-0.2, 0.2, -0.2, 0.2])

plt.show()

基于sklearn实现非负矩阵分解:

In [ ]:

nmf = decomposition.NMF()

X4 = nmf.fit_transform(X)

plt.plot(X4[:, 0], X4[:, 1], 'o')

plt.xlabel('first non-negative component')

plt.ylabel('second non-negative component')

plt.axis([-5, 15, -5, 15])

plt.show()

2. 局部二值模式LBP

BP的基本思想是以图像中某个像素为中心,对相邻像素进行阈值比较。如果中心像素的亮度大于等于它的相邻像素,把相邻像素标记为1,否则标记为0。我们可以用二进制数字来表示LBP图中的每个像素的LBP编码,比如下图中的中心像素,它的LBP编码为:00010011,其十进制值为19。

下面例子展示了LBP的基本用法:

In [ ]:

%matplotlib inline

from skimage.transform import rotate

from skimage.feature import local_binary_pattern

from skimage import data, io,data_dir,filters, feature

from skimage.color import label2rgb

import skimage

import numpy as np

import matplotlib.pyplot as plt

from PIL import Image

import cv2

设定LBP参数并读取图像,本节依然选用经典的lena.jpg

In [ ]:

# settings for LBP

radius = 1  # LBP算法中范围半径的取值

n_points = 8 * radius # 领域像素点数

# 读取图像

image = cv2.imread('./lena.jpg')

#显示到plt中,需要从BGR转化到RGB,若是cv2.imshow(win_name, image),则不需要转化

image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

plt.imshow(image1)

plt.show()

转为灰度图像:

In [ ]:

image = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

plt.imshow(image, plt.cm.gray)

plt.show()

进行LBP处理,得到纹理特征图像:

In [ ]:

lbp = local_binary_pattern(image, n_points, radius)

plt.imshow(lbp, plt.cm.gray)

plt.show()

进行Sobel处理,得到边缘特征图像:

In [ ]:

edges = filters.sobel(image)

plt.subplot(111)

plt.imshow(edges, plt.cm.gray)

plt.show()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 树莓派4/5:运行Yolov5n模型(文末附镜像文件)
  • LVS实验——部署DR模式集群
  • VSCODE platformio ESP32-S3 内置 JTAG 接口断点单步调试笔记
  • 【云服务器系列】基于华为云OBS实现Picgo和Typora的完美融合
  • 常见硬件工程师面试题(四)
  • 自动化测试 — selenium + Java
  • Docker最佳实践(四):安装redis
  • IDEA彻底卸载以及安装总结
  • 江科大/江协科技 STM32学习笔记P21
  • 加密案例分享:电子设备制造行业
  • 鸿蒙(API 12 Beta2版)媒体开发【Audio Kit简介】音频服务
  • python实战:数据分析基础知识
  • MySQL——索引(三)删除索引
  • 【Nacos无压力源码领读】(二) 集成 LoadBalancer 与 OpenFeign
  • flink1.18 编译遇到的问题
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【Linux系统编程】快速查找errno错误码信息
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Django 博客开发教程 16 - 统计文章阅读量
  • golang中接口赋值与方法集
  • HTTP 简介
  • mysql innodb 索引使用指南
  • PAT A1092
  • SOFAMosn配置模型
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 类orAPI - 收藏集 - 掘金
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 以太坊客户端Geth命令参数详解
  • AI算硅基生命吗,为什么?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​ArcGIS Pro 如何批量删除字段
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #每天一道面试题# 什么是MySQL的回表查询
  • #数据结构 笔记一
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二)测试工具
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (转)程序员疫苗:代码注入
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ***测试-HTTP方法
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net core 6 集成和使用 mongodb
  • .net core Redis 使用有序集合实现延迟队列
  • .NET Core 发展历程和版本迭代
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .net 使用ajax控件后如何调用前端脚本
  • .Net 执行Linux下多行shell命令方法
  • .NET/C# 使窗口永不获得焦点
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .Net6使用WebSocket与前端进行通信
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @html.ActionLink的几种参数格式
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [Android] Amazon 的 android 音视频开发文档