智能识别系统设计---图像特征提取
文章目录
- 特征提取的简介
- LBP特征提取
- 介绍
- 原理
- 代码实现
- Gabor特征提取
- 介绍
- Gabor滤波器介绍
- Gabor特征介绍
- 原理
- 代码实现
- 生成一个Gabor滤波器并对图像进行滤波
- Gabor特征提取
- 基于颜色直方图的特征提取与反向投影
- 介绍
- 代码
- 图片的RGB像素分布和HSV像素分布图
- 末尾
特征提取的简介
特征提取
:通过统计或学习等方法从图像中提取出能够有效表示原始图像内容的特征向量的集合
LBP特征提取
这位大哥讲的很不错
介绍
局部二值模式(Local Binary Patter,LBP)是一种用来描述图像
局部纹理特征
的算子
由于计算简单,可用于基于纹理分类的实时应用场景,例如目标检测,人脸识别(LBP+AdaBoost)
LBP特征只考虑纹理信息,不包含颜色信息,因此彩色图需转换为灰度图
原理
LBP特征提取操作可以去除光照对图片的影响
对于一张单通道灰度图,我们对每一个像素进行如下操作:
首先,我们可以取这个像素点X以及其周围一圈8个像素点,组成3x3
的像素矩阵(每个像素的灰度值的范围 0-255
)
对于这个3x3
的矩阵,对其进行LBP操作,将其二值化
公式:
LBP(xc,yc)=∑p=0p−12ps(ip−ic)LBP(x_c,y_c)=\sum^{p-1}_{p=0}2^ps(i_p-i_c)LBP(xc,yc)=p=0∑p−12ps(ip−ic)s(x)={1ifx≥00elses(x)= \begin{cases} 1& if \ x \geq 0\\ 0& else \end{cases}s(x)={10if x≥0else
二值化后的矩阵
然后将像素点X外的一圈01值重组为一个长度为9的二进制数,这个二进制数对应的十进制数即为像素点X的新值
代码实现
导入算法所需的包
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
读入所需处理的单通道灰度图
filepath='anime2.PNG'
img=cv.imread(filepath,0)
plt.imshow(img,cmap='gray')
print("img shape:",img.shape)
img shape: (654, 843)
这是自己实现的LBP函数
def LBP(img):dst=np.zeros(img.shape,dtype=img.dtype)for i in range(1,img.shape[0]-1):for j in range(1,img.shape[1]-1):center=img[i][j]code=0code |= (img[i-1][j-1]>=center)<<7code |= (img[i-1][j ]>=center)<<6code |= (img[i-1][j+1]>=center)<<5code |= (img[i ][j+1]>=center)<<4code |= (img[i+1][j+1]>=center)<<3code |= (img[i+1][j ]>=center)<<2code |= (img[i+1][j-1]>=center)<<1code |= (img[i ][j-1]>=center)<<0dst[i][j]=codereturn dst
进行LBP处理
plt.imshow(LBP(img),cmap='gray')
再测试一下,是否对阳光干扰有作用
img_=cv.imread('beam_face.jpg',0)plt.figure(figsize=[8,8])
plt.subplot(2,2,1)
plt.imshow(cv.cvtColor(img_,cv.COLOR_BGR2RGB))
plt.title('src image')plt.subplot(2,2,2)
plt.imshow(cv.cvtColor(LBP(img_),cv.COLOR_BGR2RGB))
plt.title('LBP image')
貌似有用?
Gabor特征提取
介绍
Gabor滤波器介绍
实在看不懂,转载一位大哥的博客内容
在图像处理中,Gabor函数是一个用于边缘提取
的线性滤波器
,Gabor函数十分适合纹理表达和分离。
在空间域
中,一个二维Gabor滤波器是一个由正弦平面波
调制的高斯核函数
。
Gabor滤波器的脉冲响应
,可以定义为一个正弦波(对于二维Gabor滤波器是正弦平面波
)乘以高斯函数。由于乘法的卷积性质,Gabor滤波器的脉冲响应的傅立叶变换是其调和函数的傅立叶变换
和高斯函数傅立叶变换
的卷积。该滤波器由实部和虚部组成,二者相互正交。
一组不同频率不同方向的Gabor函数对于图像特征提取非常有用。
Gabor特征介绍
Gabor函数可以在频域
上不同尺度,不同方向上提取相关的特征(采用不同参数的Gabor函数),由于Gabor函数与人眼的作用相仿,所以常用在纹理识别
上。
Gabor特征提取主要包含取模
,特征降维
,特征归一化
和特征选取
等操作。
- 取模
就是使用图像变换后的实部和虚部的模(二范数)作为图像特征.
mod(combine)=real2+imag2mod(combine)=\sqrt{real^2+imag^2}mod(combine)=real2+imag2 - 特征降维
图像识别领域一般使用8个方向和5个尺度的Gabor滤波器,会得到40幅变换图像
,这些变换图像的特征串联起来即为图像的特征(40维的特征),由于特征维度较高,故需要降维。最简单的方法就是对每个模图像进行下采样
。
下图为图像的一个变换图像(即使用了一个Gabor滤波器对原图像滤波后得到的图像)
- 特征归一化
一般使用Z-score标准化方法
x=x−μσx=\frac{x-\mu}{\sigma}x=σx−μ- 本方法要求原始数据的分布为高斯分布,不然归一化的效果很糟糕。
- 在分类,聚类算法中,需要使用距离来度量相似性的时候,或者使用PCA技术进行降维的时候,Z-score 标准化方法表现更好
- 特征选取
在经过以上三步之后,图像特征(各模图像串联得到)可能存在大量冗余,最好在进行一次特征选择操作,可以使用PCA
或Fisher
等线性子空间分析方法
原理
通过Gabor函数生成Gabor滤波器(size x size的矩阵),再利用Gabor滤波器对图像进行卷积(滤波)操作,得到包含Gabor特征的图像
Gabor函数:gϕ(x,y)=g(x,y,σx,σy,fx,fy,θ)g^\phi(x,y)=g(x,y,σ_x,σ_y,f_x,f_y,\theta) gϕ(x,y)=g(x,y,σx,σy,fx,fy,θ) =exp(−((X(x,y,θ)σx)+(Y(x,y,θ)σy)))exp(i(fxx+fyy))=exp(-((\frac{X(x,y,\theta)}{σ_x})+(\frac{Y(x,y,\theta)}{σ_y})))exp(i(f_xx+f_yy))=exp(−((σxX(x,y,θ))+(σyY(x,y,θ))))exp(i(fxx+fyy))
其中:X(x,y,θ)=xcos(θ)+ysin(θ)X(x,y,\theta)=xcos(\theta)+ysin(\theta)X(x,y,θ)=xcos(θ)+ysin(θ)Y(x,y,θ)=−xsin(θ)+ycos(θ)Y(x,y,\theta)=-xsin(\theta)+ycos(\theta)Y(x,y,θ)=−xsin(θ)+ycos(θ)
- x和y为坐标,θ是Gabor的方向
- σx\sigma_xσx和σy\sigma_yσy分别是x和y方向的带宽,是一个标量参数
- fxf_xfx和fyf_yfy分别是x和y方向的中心调频,是一个标量参数
实部:
geϕ(x,y)=exp(−((Xσx)2+(Yσy)2))cos(fxx+fyy)g_e^\phi(x,y)=exp(-((\frac{X}{σ_x})^2+(\frac{Y}{σ_y})^2))cos(f_xx+f_yy)geϕ(x,y)=exp(−((σxX)2+(σyY)2))cos(fxx+fyy)
虚部:
goϕ(x,y)=exp(−((Xσx)2+(Yσy)2))sin(fxx+fyy)g_o^\phi(x,y)=exp(-((\frac{X}{σ_x})^2+(\frac{Y}{σ_y})^2))sin(f_xx+f_yy)goϕ(x,y)=exp(−((σxX)2+(σyY)2))sin(fxx+fyy)
代码实现
生成一个Gabor滤波器并对图像进行滤波
matlab代码
主要功能是生成一个Gabor滤波器
function [RealTemplate,ImagTemplate,CombineTemplate]=CreateGaborTemplate(Diameter_x,Diameter_y,Band_sigma_x,Band_sigma_y,Frequency_fx,Frequency_fy,Rotation_sita)[GridX,GridY]=meshgrid(-Diameter_x:Diameter_x,-Diameter_y:Diameter_y);X=GridX*cos(Rotation_sita)+GridY*sin(Rotation_sita);
Y=-GridX*sin(Rotation_sita)+GridY*cos(Rotation_sita);%实部计算
RealTemplate=exp(-((X/Band_sigma_x).^2 + (Y/Band_sigma_y).^2)).*cos( Frequency_fx*GridX +Frequency_fy*GridY);%虚部计算
ImagTemplate=exp(-((X/Band_sigma_x).^2 + (Y/Band_sigma_y).^2)).*sin( Frequency_fx*GridX +Frequency_fy*GridY);%计算结合的模版
CombineTemplate=sqrt(RealTemplate.*RealTemplate + ImagTemplate.*ImagTemplate);
clear;clc;close allDiameter_x=15;%Gabor滤波x方向半径大小
Diameter_y=15;%Gabor滤波y方向半径大小
Band_sigma_x=8;%x方向带宽
Band_sigma_y=2;%y方向带宽
Frequency_fx=1;%x方向中心调频
Frequency_fy=0.25;%y方向中心调频
Rotation_sita=3*pi/4;%[RealTemplate,ImagTemplate,CombineTemplate]=CreateGaborTemplate(Diameter_x,Diameter_y,Band_sigma_x,Band_sigma_y,Frequency_fx,Frequency_fy,Rotation_sita);[X,Y]=meshgrid(-Diameter_x:Diameter_x,-Diameter_y:Diameter_y);figure
subplot(1,3,1)
surf(X,Y,RealTemplate)
xlabel('x')
ylabel('y')
title('Real')
subplot(1,3,2)
surf(X,Y,ImagTemplate)
xlabel('x')
ylabel('y')
title('imaginary')
subplot(1,3,3)
surf(X,Y,CombineTemplate)
xlabel('x')
ylabel('y')
title('combined')
python实现
主要功能也是生成一个Gabor滤波器
def Gabor(x,y,sigma_x,sigma_y,f_x,f_y,theta):range_x=np.array(list(range(-x,x+1,1)))range_y=np.array(list(range(-y,y+1,1)))grid_x,grid_y=np.meshgrid(range_x,range_y)X=grid_x*np.cos(theta)+grid_y*np.sin(theta)Y=-grid_x*np.sin(theta)+grid_y*np.cos(theta)# 实部计算real_template=np.exp(-((X/sigma_x)**2+(Y/sigma_y)**2))*\np.cos(f_x*grid_x+f_y*grid_y)# 虚部计算imag_template=np.exp(-((X/sigma_x)**2+(Y/sigma_y)**2))*\np.sin(f_x*grid_x+f_y*grid_y)# 计算结合的模板combine_template=np.sqrt(real_template**2+imag_template**2)return real_template,imag_template,combine_template
# 测试
x=15
y=15
sigma_x=8# 8
sigma_y=2# 2
f_x=1
f_y=0.25
theta=3*np.pi/4real,imag,combine=Gabor(x,y,sigma_x,sigma_y,f_x,f_y,theta)range_x=np.array(list(range(-x,x+1,1)))
range_y=np.array(list(range(-y,y+1,1)))
x,y=np.meshgrid(range_x,range_y)
我们可以看看
%matplotlib inline
def plot_surface(types):fig=plt.figure(figsize=[10,10])titles=['real','imag','combine']for i,type in enumerate(types):ax=fig.add_subplot(2,2,i+1,projection='3d')ax.view_init(elev=0,azim=45)ax.set_xlabel('x-label',color='r')ax.set_ylabel('y-label',color='g')ax.set_zlabel('z-label',color='b')ax.plot_surface(x,y,type,cmap=cm.coolwarm)plt.title(titles[i])
下图打印得就是Gabor滤波器的实部,虚部和模的三维图像
(x,y轴为矩阵的行与列,z轴为矩阵的元素值)
plot_surface([real,imag,combine])
将三维图俯视来看看
def plot_overlook(types):fig=plt.figure(figsize=[10,10])titles=['real','imag','combine']for i,type in enumerate(types):ax=fig.add_subplot(2,2,i+1,projection='3d')ax.view_init(elev=90,azim=0)ax.plot_surface(x,y,type,cmap=cm.coolwarm)plt.title(titles[i])
plot_overlook([real,imag,combine])
各种不同参数的Gabor滤波器的实部的三维曲面图
对图像进行Gabor滤波测试
img=cv.imread('anime2.PNG')
img=cv.cvtColor(img,cv.COLOR_BGR2RGB)
plt.imshow(img,cmap='gray')
img.shape
调用库函数进行滤波
retval1=cv.getGaborKernel(ksize=(31,31),sigma=10,theta=0,lambd=10,gamma=1.2)
result=cv.filter2D(img,-1,retval1)
plt.imshow(result,cmap='gray')
测试一下自己实现的
# 自己实现的Gabor进行滤波
## 别人的(效果不好)
# Gabor_kernel=Gabor_filter()
# result=cv.filter2D(img,-1,Gabor_kernel)## 自己的(效果也不好)
# 测试
x=15
y=15
sigma_x=8# 8
sigma_y=2# 2
f_x=1
f_y=0.25
theta=0_,_,combine=Gabor(x,y,sigma_x,sigma_y,f_x,f_y,theta)result=cv.filter2D(img,-1,combine)
plt.imshow(result,cmap='gray')
龟龟,根本没有作用,可能是参数没调好吧(以后来填坑,也欢迎dude指导操作)
Gabor特征提取
在上面我们利用了生成的Gabor滤波器对图像进行了一次滤波,得到了变换图像
(即滤波后的图像)
在下面的代码,我们利用Gabor滤波得到的图像的实部和虚部,对它们进行取模,特征降维,特征归一化等操作后,得到图像的一个特征向量
当然,在下面代码中,我们只使用了一个Gabor滤波器进行滤波,在实际的目标识别任务上,一般会使用40个Gabor滤波器进行滤波
from skimage import filters
filename='anime2.PNG'
img = cv.imread(filename)#读图像
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)#转灰度
#gabor变换
real, imag = filters.gabor(img_gray, frequency=0.6,theta=45,n_stds=5)
#取模
img_mod=np.sqrt(real.astype(float)**2+imag.astype(float)**2)
#图像缩放(下采样)
newimg = cv.resize(img_mod,(0,0),fx=1/4,fy=1/4,interpolation=cv.INTER_AREA)
tempfea = newimg.flatten()#矩阵展平
tmean = np.mean(tempfea)#求均值
tstd = np.std(tempfea)#求方差
newfea = (tempfea - tmean)/tstd#数值归一化
print(newfea)
这是最终得到的图像的特征向量
[-0.62839034 -0.62531086 -0.62531086 ... -0.62839034 -0.63146983-0.63146983]
基于颜色直方图的特征提取与反向投影
介绍
对于原灰度矩阵
Image=
1 2 3 4
5 6 7 7
9 8 0 1
5 6 7 6
我们经过将灰度值划分区间,便可得到该图像的灰度直方图
我们 将灰度值划分为如下四个区间:
[0,2] [3,5] [6,7] [8,10]
例子:
然后我们计算反向投影矩阵
back_Projection=
4 4 4 4
4 6 6 6
2 2 4 4
4 6 6 6
所以直方图的反向投影就是将原图像中256个灰度值变成了bins
个灰度值,我们实际上把原图简化了,这个过程就是提取出了图像的某个特征,然后我们就可以用这个特征(反向投影矩阵)来对比两幅图,如果两幅图的反射投影矩阵相似或相同,那么我们可以判定两幅图的这个特征是相同的
这种性质可以用来定位图像中某个局部图像所在的位置
代码
导入图片
# 源图片
target=cv.imread('anime4.PNG')
hsvt=cv.cvtColor(target,cv.COLOR_BGR2HSV)
# 感兴趣区域
roi=cv.imread('anime4_target.PNG')
hsv=cv.cvtColor(roi,cv.COLOR_BGR2HSV)
# 提取了h,s两个通道,绘制二维直方图
## roi区域
M=cv.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])
## target区域
I=cv.calcHist([hsvt],[0,1],None,[180,256],[0,180,0,256])# 打印原图片
plt.figure(figsize=[10,8])
plt.subplot(2,2,1)
plt.imshow(cv.cvtColor(target,cv.COLOR_BGR2RGB))
plt.title('target image')plt.subplot(2,2,2)
plt.imshow(cv.cvtColor(roi,cv.COLOR_BGR2RGB))
plt.title('roi image')plt.show()
# 计算比率,M为roi image,I为target image
R=M/Ih,s,v = cv.split(hsvt)# 分割目标的通道
'''
h: 色调值
s: 饱和度
'''
B = R[h.ravel(),s.ravel()]# 计算概率
B = np.minimum(B,1)
B = B.reshape(hsvt.shape[:2])
对图像B进行卷积操作
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))#定义结构形状,5×5的椭圆
B=cv.filter2D(B,-1,disc)#对图像进行卷积运算
B = np.uint8(B)
cv.normalize(B,B,0,255,cv.NORM_MINMAX)
概率图像
plt.imshow(B,cmap='gray')
图像B经过阈值处理后的图像
ret,thresh=cv.threshold(B,2,255,0)
plt.imshow(thresh,cmap='gray')
反向投影,将thresh矩阵与原图像进行按位和,保留thresh=1的像素点
tmp_target=cv.cvtColor(target,cv.COLOR_BGR2RGB)
res=cv.bitwise_and(tmp_target,tmp_target,mask=thresh)
plt.imshow(res,cmap='gray')
图片的RGB像素分布和HSV像素分布图
绘制分布图的函数
def show_img(path):img = cv.imread(path)b, g, r = img[:,:,0], img[:,:,1], img[:,:,2]hist_b = cv.calcHist([b],[0],None,[256],[0,256])hist_g = cv.calcHist([g],[0],None,[256],[0,256])hist_r = cv.calcHist([r],[0],None,[256],[0,256])plt.plot(hist_r, color='r', label="r")plt.plot(hist_g, color='g', label="g")plt.plot(hist_b, color='b', label="b")plt.legend()plt.show()img2 = cv.cvtColor(img, cv.COLOR_BGR2HSV)h, s, v = img2[:,:,0], img2[:,:,1], img2[:,:,2]hist_h = cv.calcHist([h],[0],None,[256],[0,256])hist_s = cv.calcHist([s],[0],None,[256],[0,256])hist_v = cv.calcHist([v],[0],None,[256],[0,256])plt.plot(hist_h, color='r', label="h")plt.plot(hist_s, color='g', label="s")plt.plot(hist_v, color='b', label="v")plt.legend()plt.show()return hist_r,hist_g, hist_b, hist_h, hist_s, hist_v
使用的图片
img_tmp=cv.imread('anime4.PNG')
plt.imshow(cv.cvtColor(img_tmp,cv.COLOR_BGR2RGB))
绘制分布图
r,g,b,h,s,v = show_img("anime4.PNG")
RGB像素分布图
HSV像素分布图
末尾
个人感觉Gabor和直方图反向投影的部分讲的不太透彻,若有不懂的地方可以在评论区留下问题
智能识别系统设计---图像特征提取相关推荐
- 【设计方案分享】基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-基于单片机乒乓球游戏机控制系统设计-基于单片机温度监测监控报警系统设计-基于单片机矩阵键盘的电子密码锁设计
820基于单片机温度监测监控报警系统设计-设计资料 温度监测器功能描述: 1.主控芯片用的是51单片机(STC89C51). 2.使用温度传感器DS18b20采集温度. 3.用1602液晶显示显示温度 ...
- 基于单片机乒乓球游戏机控制系统设计-基于单片机矩阵键盘的电子密码锁设计-基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-设计资料【转发分享】
819基于单片机乒乓球游戏机控制系统设计-设计资料下载 乒乓球游戏机设计任务为: (1)使用乒乓游戏机的甲乙双方各在不同的位置发球或击球. (2)乒乓球的位置和移动方向由灯亮及依次点燃的方向决定,球移 ...
- 【电路方案】基于单片机智能市电温度控制系统设计-基于单片机RGB颜色智能识别系统设计-基于单片机四路红外遥控开关电路设计-基于单片机自行车自动防盗报警系统设计-基于单片机智能无线病床呼叫系统设计
822基于单片机智能无线病床呼叫系统设计-设计资料下载 硬件构成:单片机+最小系统+LCD1602液晶显示模块+无线收发模块+蜂鸣器模块+LED指示灯模块+按键模块 本设计基于STC89C51/52( ...
- 基于java植物大全智能识别系统设计与实现
用户注册:填写手机账号和密码,注册新用户 登录功能:注册普通账号登录:登录后可以修改用户的基本信息,也可以退出. 关于我们:关于我们.联系我们.加入我们.法律声明 轮播广告:后台设置首页轮播广告图,可 ...
- 基于InceptionV3深度学习实现岩石图像智能识别与分类
基于InceptionV3深度学习实现岩石图像智能识别与分类 文章目录 基于InceptionV3深度学习实现岩石图像智能识别与分类 总体流程 数据预处理 构建InceptionV3模型 训练.保存模 ...
- 使用亚博智能K210实现人脸特征提取和识别
使用亚博智能K210实现人脸特征提取和识别 亚博智能K210开发板自带有使用C语言编程实现的人脸检测代码,即可以检测到摄像头范围内的人脸并将人脸框定出来,不能实现人脸的特征提取和人脸的识别.因此,我们 ...
- 医疗大数据模型-眼底图像的眼疾智能识别
模型交易平台是在历史大数据与人工智能项目的沉淀基础上,以大数据挖掘建模平台为支撑,提供成熟的大数据与人工智能模型应用与项目.一方面,能够为广大企业提供成熟模型应用,解决人工模型开发周期长,难度高,人才 ...
- 人脸图像特征提取的各种方法、笑脸识别及口罩识别
人脸图像特征提取的各种方法.笑脸识别及口罩识别 一.人脸图像特征提取的各种方法 (一)HOG 1.HOG定义 2.HOG提取的图像信息 3.HOG算法的基本流程 (二)Dlib (三)卷积神经网络特征 ...
- 数字图像处理与Python实现笔记之图像特征提取
数字图像处理与Python实现笔记 摘要 绪论 1 数字图像处理基础知识 2 彩色图像处理初步 3 空间滤波 4 频域滤波 5 图像特征提取 5.1 图像颜色特征提取 5.1.1 颜色直方图 1 一般 ...
- 【项目实战-MATLAB】:基于机器学习的虹膜识别系统设计
基于机器学习的虹膜识别系统设计 设计的虹膜识别系统流程图如图 1 所示,在图像的预处理过程中主要包括虹膜定位.虹膜区域提取.虹膜区域极坐标变换和归一化处理.最后采用SVM识别方法实现虹膜识别. 图1 ...
最新文章
- BAT七年经验,却抵不过外企面试的两道算法题?
- [精华][推荐]CAS SSO单点登录服务端客户端学习
- 计算机导论的学科知识体,依托学科课程体系的《计算机导论》课程改革
- ABP 基础设施层——集成 Entity Framework
- 用nodejs搭建最简单、轻量化的http server
- 【Python 爬虫】 2、HTTP基本原理
- oracle 查看表被谁删了_【分享】Oracle 常用运维命令大全
- 为什么Go中有的自定义error会导致内存溢出
- 高性能Web服务器Nginx使用指南
- C# 字典键值对排序 属性的key和value排序
- [Database] 不知道表名和字段查找值=1234的数据.
- 居中 html css
- Docker 之 概念介绍
- Creator性能优化
- 计算机桌面 文字大小,敬业签电脑桌面便签软件怎么设置字体字号大小?
- 基于php+mysql的网上购物商城系统
- 【接口篇 / Wan】(5.2) ❀ 04. 多条宽带冗余 ❀ FortiGate 防火墙
- 手游逆向专题<英雄联盟手游>: Unity内还原亚索渲染效果
- 超牛逼的性能调优神器 — 火焰图
- 决策树算法分析与应用