最近在github上找一些关于可见光图像参数提取的模型,发现了一个好东西:pyfeats。
github地址:https://github.com/giakou4/pyfeats
一、仓库
二、介绍
1、概述
现在pyfeats可以在PyPi访问,地址:https://pypi.org/project/pyfeats/
pyfeats是一组用于特征提取的Python函数集合。这些函数在感兴趣区域(ROI) 内计算特征,而不是针对整个图像进行计算。
2、什么是ROI?
ROI代表感兴趣区域(Region of Interest)。在图像处理和计算机视觉中,ROI是指在图像中选择或定义的一个特定区域,该区域包含我们感兴趣的目标或感兴趣的特征。
ROI的选择通常是根据具体的应用需求进行的。例如,在人脸识别任务中,ROI可以是人脸区域;在物体检测任务中,ROI可以是物体的边界框;在医学影像分析中,ROI可以是特定器官或病变区域。
通过选择ROI,我们可以限定分析的范围,从而减少计算量和提高处理效率。在ROI内进行特征提取、目标检测、图像分类等任务时,我们可以更加关注和利用ROI内的信息,从而提高算法的准确性和效果。
我们将一张完整的图像简化到一个固定的区域,对这个区域进行一系列特征抽取。因此,在特征抽取之前,需要进行必要的目标识别,确定这个区域。
三、DEMO介绍
比起先介绍功能,我感觉先介绍github里的demo,更能了解pyfeats到底是怎么运作的。
1、pyfeats包
只需要在代码中加上from pyfeats import *
即可使用。
2、代码
(1)加载图像
使用os.getcwd()
获取当前工作目录的路径,然后将其与’/data/'拼接成完整的路径字符串,赋值给变量path。这意味着该代码预期在当前工作目录下的"data"文件夹中存在要加载的图像文件。
接下来,定义变量image_name为要加载的图像文件的文件名,这里假设图像文件名为"1.jpeg"(开发者代码是bmp格式的图像,事实证明不管是jpg/png/jpeg等等类型的图像均可加载)。
然后,使用OpenCV的cv2.imread()
函数读取图像文件。cv2.IMREAD_GRAYSCALE
参数表示以灰度图像的形式读取图像,即将图像转换为单通道的灰度图像。读取的图像数据存储在变量image中。
最后,使用plt.imshow()
函数显示图像,使用cmap='gray'
参数将图像以灰度的颜色映射方式显示。然后使用plt.title()
函数设置图像的标题为"Initial Image"。最后使用plt.show()
函数显示图像窗口,展示加载的图像。
# Load image
path = os.getcwd() + '/data/'
image_name ='1.jpeg'
image = cv2.imread(path + image_name, cv2.IMREAD_GRAYSCALE)
plt.imshow(image, cmap='gray')
plt.title('Initial Image')
plt.show()
加载图像的效果即为将一张正常的可见光图像进行灰度处理并输出。
(2)加载掩膜mask
首先,导入"points.out"文件,这个文件非常非常非常重要!! 因为里面存放了ROI区域的各点坐标,如果没有它,机器完全不知道你想要提取哪个区域的参数。
point.out文件里面长这样:
【注】这里面是我手动瞎写的坐标,实际应用中必须配合目标识别!!
将识别出来的区域坐标填在这个文档里面。
然后,使用NumPy的np.loadtxt()
函数从指定路径加载掩膜文件。delimiter=','
参数指定了文件中数据的分隔符为逗号。加载的数据存储在变量points中。
接下来,将变量points转换为NumPy数组,并指定数据类型为np.int32,以确保数据类型为整数。
然后,使用OpenCV的cv2.fillPoly()
函数生成掩膜。首先,创建一个与原始图像形状相同的全零数组,作为掩膜的初始值。然后,使用points.reshape((-1,1,2))
将多边形点坐标的形状调整为适合fillPoly()函数的形状。最后,使用color=1参数指定掩膜中多边形区域的像素值为1,即将多边形区域(ROI区域)填充为白色。
接着,使用OpenCV的cv2.polylines()
函数在一个全零图像上绘制多边形的边界线。同样地,使用points.reshape((-1,1,2))
将多边形点坐标的形状调整为适合polylines()函数的形状。使用isClosed=True
参数指定多边形边界线为闭合的,即首尾相连。使用color=1参数将边界线的像素值设为1,即绘制白色边界线。使用thickness=1参数指定边界线的宽度为1。生成的边界线数据存储在变量perimeter中,并将数据类型转换为整型。
# Load mask
points_name = 'points.out'
points = np.loadtxt(path + points_name, delimiter=',')
#print(image.shape[0])
#print(image.shape[1])
points = np.array(points, np.int32)
mask = cv2.fillPoly(np.zeros(image.shape,np.double), [points.reshape((-1,1,2))], color=1).astype('i')
perimeter = cv2.polylines(np.zeros(image.shape), [points.reshape((-1,1,2))],isClosed=True,color=1,thickness=1).astype('i')
plt.imshow(mask, cmap='gray')
plt.title('Initial Mask')
plt.show()
这部分的效果就是画出我们要识别的目标区域,生成掩膜mask和边界线,并输出显示生成的mask。
(3)将图像中非ROI部分填充为零,并对图像、掩膜和边界线进行裁剪和填充操作
通过将原始图像与掩膜相乘,即使用np.multiply()
函数实现对图像的像素值与掩膜进行逐元素相乘。这将导致ROI以外的像素值为零,从而实现将图像中ROI以外的部分填充为零的效果。然后,通过数据类型转换,使用astype()
函数将图像数据类型转换为np.uint8,以确保像素值为整数类型。
接下来,计算多边形的边界框的四个边界值(最大点的x坐标、最大点的y坐标、最小点的x坐标、最小点的y坐标)。这些值用于裁剪图像、掩膜和边界线,使其只包含ROI区域的部分。
然后,通过切片操作,使用计算得到的边界框值裁剪图像、掩膜和边界线,将其限制在ROI区域内。
接着,调用padImage()
函数对裁剪后的图像、掩膜和边界线进行填充操作,使用2个像素单位进行填充,填充值为0。填充操作的目的是确保图像的形状参数能够正确工作。
# Fill image with zeros outside ROI
image = np.multiply(image.astype(np.double), mask).astype(np.uint8)
max_point_x = max(points[:,0])
max_point_y = max(points[:,1])
min_point_x = min(points[:,0])
min_point_y = min(points[:,1])
a,b,c,d = min_point_y, (max_point_y+1), min_point_x, (max_point_x+1)
image, mask, perimeter = image[a:b,c:d], mask[a:b,c:d], perimeter[a:b,c:d]
image, mask, perimeter = padImage(image, 2, 0), padImage(mask, 2, 0), padImage(perimeter, 2, 0) # ALWAYS PAD IMAGE SO AS SHAPE PARAMETERS WORK
plt.imshow(image, cmap='gray')
plt.title('Image cropped to ROI')
plt.show()
plt.imshow(mask, cmap='gray')
plt.title('Mask of image cropped to ROI')
plt.show()
plt.imshow(perimeter, cmap='gray')
plt.title('Perimeter of image cropped to ROI')
plt.show()
这部分的效果就是对图像、掩膜以及边界线进行裁剪和填充,并输出显示裁剪后的图像、掩膜和边界线。
(4)特征抽取
这部分只展示demo.py的特征抽取部分,具体抽取出什么特征将在功能部分进行详细阐释。
★纹理特征
#%% A1. Texture features
features = {}
features['A_FOS'] = fos(image, mask)
features['A_GLCM'] = glcm_features(image, ignore_zeros=True)
features['A_GLDS'] = glds_features(image, mask, Dx=[0,1,1,1], Dy=[1,1,0,-1])
features['A_NGTDM'] = ngtdm_features(image, mask, d=1)
features['A_SFM'] = sfm_features(image, mask, Lr=4, Lc=4)
features['A_LTE'] = lte_measures(image, mask, l=7)
features['A_FDTA'] = fdta(image, mask, s=3)
features['A_GLRLM'] = glrlm_features(image, mask, Ng=256)
features['A_FPS'] = fps(image, mask)
features['A_Shape_Parameters'] = shape_parameters(image, mask, perimeter, pixels_per_mm2=1)
features['A_HOS'] = hos_features(image, th=[135,140])
features['A_LBP'] = lbp_features(image, image, P=[8,16,24], R=[1,2,3])
features['A_GLSZM'] = glszm_features(image, mask)
plot_sinogram(image, image_name)
★形状特征
#%% B. Morphological features
features['B_Morphological_Grayscale_pdf'], features['B_Morphological_Grayscale_cdf'] = grayscale_morphology_features(image, N=30)
features['B_Morphological_Binary_L_pdf'], features['B_Morphological_Binary_M_pdf'], features['B_Morphological_Binary_H_pdf'], features['B_Morphological_Binary_L_cdf'], \
features['B_Morphological_Binary_M_cdf'], features['B_Morphological_Binary_H_cdf'] = multilevel_binary_morphology_features(image, mask, N=30, thresholds=[25,50])
plot_pdf_cdf(features['B_Morphological_Grayscale_pdf'], features['B_Morphological_Grayscale_cdf'], image_name)
plot_pdfs_cdfs(features['B_Morphological_Binary_L_pdf'], features['B_Morphological_Binary_M_pdf'], features['B_Morphological_Binary_H_pdf'], features['B_Morphological_Binary_L_cdf'], features['B_Morphological_Binary_M_cdf'], features['B_Morphological_Binary_H_cdf'])
★基于直方图特征
#%% C. Histogram Based features
features['C_Histogram'] = histogram(image, mask, bins=32)
features['C_MultiregionHistogram'] = multiregion_histogram(image, mask, bins=32, num_eros=3, square_size=3)
features['C_Correlogram'] = correlogram(image, mask, bins_digitize=32, bins_hist=32, flatten=True)
plot_histogram(image, mask, bins=32, name=image_name)
plot_correlogram(image, mask, bins_digitize=32, bins_hist=32, name=image_name)
★多尺度特征
#%% D. Multi-Scale features
features['D_DWT'] = dwt_features(image, mask, wavelet='bior3.3', levels=3)
features['D_SWT'] = swt_features(image, mask, wavelet='bior3.3', levels=3)
features['D_WP'] = wp_features(image, mask, wavelet='coif1', maxlevel=3)
features['D_GT'] = gt_features(image, mask)
features['D_AMFM'] = amfm_features(image)
★其他特征
#%% E. Other
features['E_HOG'] = hog_features(image, ppc=8, cpb=3)
features['E_HuMoments'] = hu_moments(image)
features['E_TAS'] = tas_features(image)
features['E_ZernikesMoments'] = zernikes_moments(image, radius=9)
(5)输出
除了上述几张图像作为输出,还包括:
1)sinogram正弦图
Sinogram是指在计算机断层扫描成像(CT扫描)中所生成的投影数据。CT扫描通过旋转X射线探测器围绕被扫描对象进行多个角度的投影,然后记录X射线通过对象的衰减程度。这些投影数据被称为sinogram,它是一个二维矩阵,其中每个元素表示X射线通过对象的某个位置和角度的衰减程度。
Sinogram提供了关于物体内部结构的信息,它是重建CT图像的基础。通过对sinogram进行逆投影和滤波等数学运算,可以恢复出物体的断层图像,从而实现对物体内部结构的非侵入式成像。Sinogram在医学诊断、工业检测等领域有重要的应用。
2)斑块灰度形态学特征
斑块灰度形态学特征中的PDF(Probability Density Function,概率密度函数)和CDF(Cumulative Distribution Function,累积分布函数)表示了斑块内灰度级别的统计特性。
★PDF的斑块灰度形态学特征:PDF描述了斑块中每个灰度级别的出现概率密度。通过计算斑块中每个灰度级别的出现频率或概率,可以得到一个表示灰度级别分布的函数。PDF的斑块灰度形态学特征可以提供关于斑块内灰度级别分布的统计信息,例如均值、方差、偏度等。这些特征可以反映斑块内灰度级别的集中程度、分布形状等特性。
★CDF的斑块灰度形态学特征:CDF是PDF的累积函数,表示了灰度级别小于等于某个特定值的像素在斑块中的累积概率。CDF的斑块灰度形态学特征可以提供关于斑块内灰度级别累积分布的统计信息,如最小灰度级别、最大灰度级别、中位数等。CDF可以帮助了解斑块内灰度级别的分布范围和分布形状。
通过分析斑块的PDF和CDF特征,可以揭示图像中不同区域的灰度分布特性。这些特征在图像处理和分析中具有广泛的应用,如图像分类、纹理分析、边缘检测等。它们可以帮助提取图像的局部特征,并为图像理解和处理提供有价值的信息。
3)斑块多级二值形态学特征
斑块多级二值形态学特征用于表示图像中的斑块的形态学属性和特征。斑块是图像中的局部区域,可以是具有特定属性或特征的目标物体、纹理区域、病变区域等。通过提取斑块的多级二值形态学特征,可以描述和表达斑块的形状、大小、纹理和空间分布等信息。
具体而言,斑块多级二值形态学特征可以表示以下内容:
形状特征:斑块的形状信息,如斑块的边界形状、轮廓曲线等。这些特征可以用于识别不同形状的斑块,如圆形、矩形、椭圆形等。
大小特征:斑块的大小信息,如斑块的面积、周长、直径等。这些特征可以用于衡量斑块的尺寸和相对重要性。
纹理特征:斑块的纹理信息,如纹理的粗糙度、方向、频率等。这些特征可以用于描述斑块的纹理特征,如光滑、粗糙、水平纹理、垂直纹理等。
空间分布特征:斑块在图像中的空间位置和分布信息,如斑块之间的相对位置、密度等。这些特征可以用于分析斑块的空间关系和布局。
3)相关图:灰度级值与图像中心的距离分布
4)相关图:灰度级值与图像中心的角度分布
四、功能
pyfeats既然作为一个集合,肯定能够实现一系列功能。在官方文档中开发者已经详细地枚举了能够实现的特征抽取。
1、纹理特征
(1)一阶统计特征(First Order Statistics/Statistical Features (FOS/SF))
一阶统计特征(FOS)是从图像的直方图中计算得出的,直方图是单个像素的经验概率密度函数。FOS特征包括以下内容:
1)均值
2)标准差
3)中位数
4)众数
5)偏度
6)峰度
7)能量
8)熵
9)最小灰度级
10)最大灰度级
11)变异系数
12、13、14、15)分位数(10、25、50、75、90)
16)直方图宽度
features, labels = pyfeats.fos(f, mask)
(2)灰度共生矩阵/灰度共生度量(GLCM/SGLDM)
Haralick提出的灰度共生矩阵(GLCM)基于对二阶联合条件概率密度函数的估计。GLCM特征包括以下内容:
1)角二阶矩
2)对比度
3)相关性
4)平方和:方差
5)逆差异矩
6)和平均
7)和方差
8)和熵
9)熵
10)差异方差
11)差异熵
12,13)相关性的信息度量。
对于每个特征,计算其均值和值范围,并将其用作两个不同的特征集。
features_mean, features_range, labels_mean, labels_range = pyfeats.glcm_features(f, ignore_zeros=True)
(3)灰度差异统计量(GLDS)
灰度差异统计量(GLDS)算法利用局部属性值之间的灰度差异或平均灰度级之间的绝对差异的一阶统计量来提取纹理特征。GLDS特征包括:
1)均匀性
2)对比度
3)能量
4)熵
5)均值
features, labels = pyfeats.glds_features(f, mask, Dx=[0,1,1,1], Dy=[1,1,0,-1])
(4)邻域灰度差异矩阵(NGTDM)
邻域灰度差异矩阵(NDTDM)对应于纹理的视觉特性。NGTDM特征包括:
1)粗糙度
2)对比度
3)繁忙度
4)复杂度
5)强度
features, labels = pyfeats.ngtdm_features(f, mask, d=1)
(5)统计特征矩阵(SFM)
统计特征矩阵(SFM)测量图像中多个距离上的像素对的统计性质,用于统计分析。SFM特征包括:
1)粗糙度
2)对比度
3)周期性
4)粗糙度
features, labels = pyfeats.sfm_features(f, mask, Lr=4, Lc=4)
(6)Law纹理能量测量(LTE/TEM)
Law纹理能量测量(LTE/TEM)是从三个长度为3的简单向量中派生出来的。如果这些向量与自身卷积,将得到长度为5的新向量。通过进一步的自卷积,可以得到长度为7的新向量。如果长度为l的列向量与相同长度的行向量相乘,则得到Law的l×l掩模。为了从图像中提取纹理特征,这些掩模与图像进行卷积,然后使用结果图像的统计数据(例如能量)来描述纹理特征:
- LL掩模的纹理能量
- EE掩模的纹理能量
- SS掩模的纹理能量
- LE和EL掩模的平均纹理能量
- ES和SE掩模的平均纹理能量
- LS和SL掩模的平均纹理能量
features, labels = pyfeats.lte_measures(f, mask, l=7)
(7)分形维度纹理分析(FDTA)
分形维度纹理分析(FDTA)基于分数布朗运动(FBM)模型。FBM模型用于描述自然表面的粗糙度。它将自然界中的表面视为随机漫步的结果。这样的随机漫步是我们宇宙中基本的物理过程之一。表示分形表面的最重要参数之一是分形维度。一个更简单的方法是估计H参数(赫斯特系数)。如果在不同分辨率下观察图像,那么就可以获得多分辨率分形(MF)特征向量。
h, labels = pyfeats.fdta(f, mask, s=3)
(8)灰度级运行长度矩阵(GLRLM)
灰度级运行长度矩阵(GLRLM)中,灰度级运行是一组具有相同灰度级值的连续、共线的图像点集。运行的长度是运行中的图像点数目。GLRLM特征包括:
1)短运行强调度
2)长运行强调度
3)灰度级非均匀性
4)运行长度非均匀性
5)运行百分比
6)低灰度级运行强调度
7)高灰度级运行强调度
8)短低灰度级强调度
9)短运行高灰度级强调度
10)长运行低灰度级强调度
11)长运行高灰度级强调度
features, labels = pyfeats.glrlm_features(f, mask, Ng=256)
(9)傅里叶功率谱(Fourier Power Spectrum,FPS)
对于数字图像,我们使用离散变换而不是连续傅里叶变换。基于离散傅里叶功率谱的标准纹理特征采用环形样本的形式。类似地,基于楔形样本的特征采用的形式如下。FPS特征包括:
1)径向和
2)角度和
features, labels = pyfeats.fps(f, mask)
(10)形状参数
形状参数包括以下特征:
1)x坐标最大长度
2)y坐标最大长度
3)面积
4)周长
5)周长的平方除以面积
features, labels = pyfeats.shape_parameters(f, mask, perimeter, pixels_per_mm2=1)
(11)灰度级大小区域矩阵(GLSZM)
灰度级大小区域矩阵(GLSZM)用于量化图像中的灰度级区域。灰度级区域定义为具有相同灰度级强度的连接体素数量。如果根据无穷范数的距离为1(在3D中为26连接区域,在2D中为8连接区域),则认为体素是连接的。GLSZM的特征包括:
1)小区域强调
2)大区域强调
3)灰度级非均匀性
4)区域大小非均匀性
5)区域百分比
6)低灰度级区域强调
7)高灰度级区域强调
8)小区域低灰度级强调
9)小区域高灰度级强调
10)大区域低灰度级强调
11)大区域高灰度级强调
12)灰度级方差
13)区域大小方差
14)区域大小熵。
features, labels = pyfeats.glszm_features(f, mask, connectivity=1)
(12)灰度级大小区域矩阵(GLSZM)
Radon变换将二维图像中的线条转换为可能的线参数域,图像中的每条线将在相应的线参数位置上产生一个峰值。因此,图像中的线条被转换为Radon域中的点。高阶谱(Higher Order Spectra,HOS)是高阶矩的谱成分。信号的二阶谱是信号的三阶相关的傅里叶变换(FT)(也称为三阶累积函数)的结果。二阶谱是两个频率的复值函数。二阶谱是三个傅里叶系数的乘积,具有对称性,并在非冗余区域进行计算。提取的特征是熵1。
features, labels = pyfeats.hos_features(f, th=[135,140])
(13)局部二值模式(Local Binary Pattern,LBP)
局部二值模式(Local Binary Pattern,LBP)是一种强大且高效的纹理描述符,由Ojala首次提出。LBP特征向量的最简形式是通过以下方法确定的:围绕一个像素点考虑一个圆形邻域。选择P个点位于半径为R的圆的周长上,以使它们与中心像素点等距离。根据像素的灰度值是否小于或大于中心像素的灰度值,将这P个点转换为一个由0和1组成的循环比特流。Ojala等人(2002年)引入了纹理分析中的均匀性概念。具有均匀循环结构且包含非常少空间转换(即空间位0/1转换数量)的基本模式被视为均匀模式。在这项工作中,使用均匀性度量U计算了旋转不变的测量值。只有具有U小于2的模式被赋予LBP编码,即如果循环比特流中的位转换数小于或等于2,则将中心像素标记为均匀模式。在不同尺度上构建的LBP图像的能量和熵被用作特征描述符。
features, labels = pyfeats.lbp_features(f, mask, P=[8,16,24], R=[1,2,3])
2、形状特征
(1)灰度形态分析
在多级二值形态分析中,提取并研究不同组件的几何特性。通过阈值处理生成三个二值图像。在这里,二值图像输出被表示为满足阈值条件的图像坐标集合。总体上,这种多级分解与原始图像强度的三级量化密切相关。对于每个二值图像,计算其模式谱(pattern spectrum)。灰度形态学特征包括以下内容:
1)利用十字形结构元素对模式谱进行平均累积分布函数(CDF)计算
2) 利用十字形结构元素对模式谱进行平均概率密度函数(PDF)计算
pdf, cdf = pyfeats.grayscale_morphology_features(f, N)
(2)多级二值形态分析
与上述相同,但是使用灰度图像。区别在于计算图案谱(pattern spectrum)的方法。
pdf_L, pdf_M, pdf_H, cdf_L, cdf_M, cdf_H = pyfeats.multilevel_binary_morphology_features(img, mask, N=30, thresholds=[25, 50]):
3、基于直方图特征
(1)直方图
直方图:图像感兴趣区域(ROI)的灰度级直方图。
H, labels = pyfeats.histogram(f, mask, bins=32)
(2)多区域直方图
通过将图像轮廓根据图像大小进行侵蚀,确定一些等距的ROI(感兴趣区域)。对于每个区域,按照上述描述计算直方图。
features, labels = pyfeats.multiregion_histogram(f, mask, bins, num_eros=3, square_size=3)
(3)相关图
Correlogram(相关图)是一种直方图,用于测量图像特征的统计信息,并考虑这些特征的空间分布。在这项工作中,针对图像的ROI实现了两种相关图:
★一种基于像素的灰度级值与图像中心的距离分布
★一种基于像素的灰度级值与图像中心的角度分布
对于每个像素,计算其与图像中心的距离和角度,并为具有相同距离或角度的所有像素计算它们的直方图。为了使不同大小的图像之间能够进行比较,距离相关图进行了归一化处理。角度的相关图允许在可能的值范围内变化,从图像左中部开始顺时针方向移动。最终得到的相关图是矩阵形式的。
Hd, Ht, labels = pyfeats.correlogram(f, mask, bins_digitize=32, bins_hist=32, flatten=True)
4、多尺度特征
(1)分形维度纹理分析
具体看3.1.7
h, labels = pyfeats.fdta(f, mask, s=3)
(2)幅度调制-频率调制(AM-FM)
我们考虑了多尺度幅度调制-频率调制(AM-FM)表示方法,采用最小二乘逼近来对图像进行处理。对于每个图像,我们计算特定组件的瞬时幅度(IA)、瞬时相位(IP)和瞬时频率(IF)。给定输入的离散图像,我们首先对其应用Hilbert变换,以形成1D解析信号的2D扩展。然后,将结果通过一系列带通滤波器进行处理,以得到所需尺度的IA、IP和IF。每个处理块将产生IA、IP和IF。AM-FM特征包括以下内容:1)低频、2)中频、3)高频和4)直流重建图像的直方图。
features, labels = pyfeats.amfm_features(f, bins=32)
(3)离散小波变换(DWT)
离散小波变换(DWT)是指信号与一组函数族的内积。对于图像(即二维信号),可以使用二维DWT。这包括对图像的行进行DWT和对所得图像的列进行DWT。每个DWT的结果后跟对列和行的下采样。对图像的分解产生每个级别的四个子图像。每个近似子图像都分解为近似、水平细节、垂直细节和对角细节子图像。每个细节子图像是与两个半带滤波器进行卷积的结果。DWT的特征包括:1)DWT的细节子图像的绝对值的均值和2)标准差。
features, labels = pyfeats.dwt_features(f, mask, wavelet=‘bior3.3’, levels=3)
(4)静态小波变换(SWT)
二维静态小波变换(Stationary Wavelet Transform,SWT)与二维离散小波变换(Discrete Wavelet Transform,DWT)类似,但不进行下采样。相反,进行了低通和高通滤波器的上采样。SWT的特征如下所示:
1)细节子图的绝对值的均值
2)细节子图的绝对值的标准差
features, labels = pyfeats.swt_features(f, mask, wavelet=‘bior3.3’, levels=3)
(5)小波包变换(WP)
二维小波包变换(Wavelet Packets,WP)的分解是对二维离散小波变换(2-D DWT)的简单修改,提供了更丰富的时频表示。分析的第一级与二维离散小波变换(2-D DWT)的相同。第二级及所有后续级别的分析包括将每个子图像,而不仅仅是近似子图像,分解成四个新的子图像。小波包变换的特征包括:小波分解的细节子图像的绝对值的1)平均值
2)标准差
features, labels = pyfeats.wp_features(f, mask, wavelet=‘cof1’, maxlevel=3)
(6)Gabor变换(GT)
图像的Gabor变换(Gabor Transform,GT)是将该图像与Gabor函数进行卷积,即使用一定频率和方向的正弦平面波经高斯包络调制而成的函数。Gabor滤波器的频率和方向表示类似于人类视觉系统,因此适用于纹理分割和分类。Gabor变换的特征包括:
1)平均值
2)标准差
用于描述图像Gabor变换的细节子图像的绝对值。
features, labels = pyfeats.gt_features(f, mask, deg=4, freq=[0.05, 0.4])
5、其他特征
(1)泽尼克矩
在图像处理、计算机视觉和相关领域中,图像矩是图像像素强度的一种特定加权平均(矩),或者是这些矩的函数,通常选择具有某种有吸引力的属性或解释。泽尼克矩是一种正交复数矩,其核心是在极坐标空间中定义在单位圆内部的一组泽尼克完全正交多项式。泽尼克矩包括 1-25)种相对于平移具有正交不变性的矩。
features, labels = pyfeats.zernikes_moments(f, radius=9)
(2)胡氏矩
在图像处理、计算机视觉和相关领域中,图像矩是图像像素强度的一种特定加权平均(矩),或者是这些矩的函数,通常选择具有某些吸引人的属性或解释。胡氏矩是一种图像矩,由七个矩组成,分别称为胡氏矩。这些矩是对图像的几何矩进行归一化和缩放得到的。胡氏矩对于图像的平移、缩放和旋转具有不变性,因此在图像识别、形状分析和模式识别等任务中非常有用。
features, labels = pyfeats.hu_moments(f)
(3)阈值邻接矩阵(TAS)
features, labels = pyfeats.tas_features(f)
(4)方向梯度直方图
fd, labels = pyfeats.hog_features(f, ppc=8, cpb=3)