使用scikit-image feature计算图像特征与常见特征示例

目录

canny

corner_harris

greycomatrix

greycoprops

hog

local_binary_pattern


scikit-image feature是一个强大的python可以调用的计算特征库。对于常见的图像特征可以直接调用scikit-image feature中封装好的函数来计算,速度也比自己编写的函数快(别问我怎么知道的,心塞了)。

具体来说有以下特征:

skimage.feature.blob_dog(image,min_sigma,...)

在给定的灰度图像中查找斑点。

skimage.feature.blob_doh(image,min_sigma,...)

在给定的灰度图像中查找斑点。

skimage.feature.blob_log(image,min_sigma,...)

在给定的灰度图像中查找斑点。

skimage.feature.canny(图片,西格玛,...)

使用Canny算法边缘过滤图像。

skimage.feature.corner_fast(image,n,...)

提取给定图像的FAST角点。

skimage.feature.corner_foerstner(image,sigma)

计算Foerstner角落测量响应图像。

skimage.feature.corner_harris(image,...)

计算哈里斯角度测量响应图像。

skimage.feature.corner_kitchen_rosenfeld(图像)

Compute Kitchen和Rosenfeld角落测量响应图像。

skimage.feature.corner_moravec(图片,...)

计算Moravec角落测量响应图像。

skimage.feature.corner_orientations(图片,...)

计算拐角的方向。

skimage.feature.corner_peaks(image,...)

在角落测量响应图像中找到角点。

skimage.feature.corner_shi_tomasi(image,sigma)

计算Shi-Tomasi(Kanade-Tomasi)角落测量响应图像。

skimage.feature.corner_subpix(图像,角落)

确定拐角的亚像素位置。

skimage.feature.daisy(img,step,radius,...)

为给定图像密集提取DAISY特征描述符。

skimage.feature.draw_multiblock_lbp(img,r,...)

多块本地二进制模式可视化。

skimage.feature.greycomatrix(image,...,...)

计算灰度共生矩阵。

skimage.feature.greycoprops(P,道具)

计算GLCM的纹理属性。

skimage.feature.hessian_matrix(图片,...)

计算Hessian矩阵。

skimage.feature.hessian_matrix_det(image,...)

计算图像上的近似Hessian行列式。

skimage.feature.hessian_matrix_eigvals(Hxx,...)

计算Hessian矩阵的特征值。

skimage.feature.hog(图像,方向,...)

提取给定图像的定向梯度直方图(HOG)。

skimage.feature.local_binary_pattern(image,P,R)

灰度和旋转不变LBP(局部二元模式)。

skimage.feature.match_descriptors(...,...)

描述符的蛮力匹配。

skimage.feature.match_template(图片,模板)

使用归一化相关将模板匹配到2-D或3-D图像。

skimage.feature.multiblock_lbp(int_image,r,...)

多块本地二进制模式(MB-LBP)。

skimage.feature.peak_local_max(图片,...)

在图像中查找峰值作为坐标列表或布尔掩模。

skimage.feature.plot_matches(ax,image1,...)

绘制匹配的功能。

skimage.feature.register_translation(...,...)

通过互相关高效的子像素图像平移配准。

skimage.feature.shape_index(image,sigma,...)

计算形状索引。

skimage.feature.structure_tensor(image,...)

使用平方差和计算结构张量。

skimage.feature.structure_tensor_eigvals(...)

计算结构张量的特征值。

skimage.feature.BRIEF(descriptor_size,...)

简单二进制描述符提取器。

skimage.feature.CENSURE(min_scale,...)

CENSURE关键点检测器。

skimage.feature.ORB(缩放,n_scales,...)

面向快速和旋转的简要特征检测器和二进制描述符提取器。

skimage.feature.blob

skimage.feature.brief

skimage.feature.brief_cy

skimage.feature.censure

skimage.feature.censure_cy

skimage.feature.corner

skimage.feature.corner_cy

skimage.feature.match

skimage.feature.orb

skimage.feature.orb_cy

skimage.feature.peak

skimage.feature.template

skimage.feature.texture

表征图像纹理的方法。

skimage.feature.util

对于经常使用的一些特征,举例如下:

canny

skimage.feature.canny(image, sigma=1.0, low_threshold=None, high_threshold=None, mask=None, use_quantiles=False)[source]

使用Canny算法边缘过滤图像。

参数:

图像:二维数组灰度输入图像检测边缘; 可以是任何dtype。sigma:float高斯滤波器的标准偏差。low_threshold:float滞后阈值的下限(链接边)。如果没有,low_threshold被设置为dtype的最大值的10%。high_threshold:float滞后阈值上限(链接边缘)。如果没有,high_threshold被设置为dtype最大值的20%。mask:array,dtype = bool,可选Mask用于限制Canny对某个区域的应用。use_quantiles:bool,可选如果为True,则将low_threshold和high_threshold视为边缘幅度图像的分位数,而不是绝对边缘幅度值。如果为True,那么阈值必须在0,1范围内。

返回:

输出:2D数组(图像)二进制边缘图。

另请参阅:skimage.sobel

注意

该算法的步骤如下:

  • 使用sigma宽度高斯平滑图像。
  • 应用水平和垂直Sobel算子来获取图像中的渐变。边缘强度是渐变的常态。
  • 薄到1像素宽曲线的潜在边缘。首先,找到每个点的边缘法线。这是通过查看X-Sobel和Y-Sobel的符号和相对大小来将点分为4类:水平,垂直,对角线和反对角线。然后查看正常方向和反向方向,以查看这两个方向中的任何一个的值是否大于所讨论的点。使用插值来获得混合点,而不是选择最接近正常点的点。
  • 执行滞后阈值:首先将高于阈值的所有点标记为边缘。然后递归地标记8个连接到带标记点的低阈值以上的点作为边。

示例

from skimage import feature
# Generate noisy image of a square
im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im += 0.2 * np.random.rand(*im.shape)
 # First trial with the Canny filter, with the default smoothing
edges1 = feature.canny(im)
 # Increase the smoothing for better results
edges2 = feature.canny(im, sigma=3)

corner_harris

skimage.feature.corner_harris(image, method='k', k=0.05, eps=1e-06, sigma=1)[source]

计算哈里斯角度测量响应图像。

该角点检测器使用来自自相关矩阵A的信息:

A = [(imx**2)   (imx*imy)] = [Axx Axy]
    [(imx*imy)   (imy**2)]   [Axy Ayy]

其中imx和imy是一阶导数,用高斯滤波器进行平均。角落测量然后被定义为:

det(A) - k * trace(A)**2

要么:

2 * det(A) / (trace(A) + eps)

参数:

图像:ndarray输入图像。方法:{'k','eps'},可选用于从自相关矩阵计算响应图像的方法。k:float,可选灵敏度因子,用于分离边缘的角点,通常范围为0,0.2。较小的k值会导致检测到尖角。eps:float,可选归一化因子(Noble的角点测量)。sigma:float,可选用于高斯核的标准偏差,用作自相关矩阵的加权函数。

返回:

回应:ndarray Harris反应形象。

示例:

>>> from skimage.feature import corner_harris, corner_peaks
>>> square = np.zeros([10, 10])
>>> square[2:8, 2:8] = 1
>>> square.astype(int)
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
>>> corner_peaks(corner_harris(square), min_distance=1)
array([[2, 2],
       [2, 7],
       [7, 2],
       [7, 7]

greycomatrix

skimage.feature.greycomatrix(image, distances, angles, levels=None, symmetric=False, normed=False)

计算灰度共生矩阵。

灰度级共生矩阵是图像上给定偏移处的共生灰度值的直方图。

参数:

image:array_like整型输入图像。只支持正值图像。如果type不是uint8,则需要设置参数级别。距离:array_like像素对距离偏移列表。angles:array_like以弧度表示的像素对角度列表。levels:int,可选输入图像应该包含0和level-1的整数,其中level指示计数的灰度数(对于8位图像通常为256)。该参数对于16位或更高的图像是必需的,通常是图像的最大值。由于输出矩阵至少为x水平,因此可能最好使用输入图像的分档而不是较大的水平值。symmetric:bool,可选如果为True,则输出矩阵P:,:,d,theta是对称的。这是通过忽略值对的顺序来实现的,所以(i,j)和(j,i)在给定偏移量时遇到(i,j)时被累加。默认值是False。normed:bool,可选如果为True,则将每个矩阵P:,:,d,theta除以给定偏移量的累计同现事件总数。结果矩阵的元素总和为1.默认值为False。

返回:

P:4-D ndarray灰度共生直方图。值Pi,j,d,theta是灰度级j在距离d和与灰度级i成角度θ时出现的次数。如果normed为False,则输出为uint32类型,否则为float64。尺寸是:水平x水平x距离数量x角度数量。

示例

计算2个GLCM:一个用于向右偏移1像素,另一个向上偏移1像素。

>>> image = np.array([[0, 0, 1, 1],
...                   [0, 0, 1, 1],
...                   [0, 2, 2, 2],
...                   [2, 2, 3, 3]], dtype=np.uint8)
>>> result = greycomatrix(image, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4],
...                       levels=4)
>>> result[:, :, 0, 0]
array([[2, 2, 1, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 1],
       [0, 0, 0, 1]], dtype=uint32)
>>> result[:, :, 0, 1]
array([[1, 1, 3, 0],
       [0, 1, 1, 0],
       [0, 0, 0, 2],
       [0, 0, 0, 0]], dtype=uint32)
>>> result[:, :, 0, 2]
array([[3, 0, 2, 0],
       [0, 2, 2, 0],
       [0, 0, 1, 2],
       [0, 0, 0, 0]], dtype=uint32)
>>> result[:, :, 0, 3]
array([[2, 0, 0, 0],
       [1, 1, 2, 0],
       [0, 0, 2, 1],
       [0, 0, 0, 0]], dtype=uint32

greycoprops

skimage.feature.greycoprops(P, prop='contrast')[source]

计算GLCM的纹理属性。

计算灰度共生矩阵的特征以作为矩阵的紧凑总结。属性计算如下:

  • ‘contrast’: (\sum_{i,j=0}^{levels-1} P_{i,j}(i-j)^2) 
  • ‘dissimilarity’: (\sum_{i,j=0}^{levels-1}P_{i,j}|i-j|) 
  • ‘homogeneity’: (\sum_{i,j=0}^{levels-1}\frac{P_{i,j}}{1+(i-j)^2}) 
  • ‘ASM’: (\sum_{i,j=0}^{levels-1} P_{i,j}^2) 
  • ‘energy’: (\sqrt{ASM}) 
  • ‘correlation’: [\sum_{i,j=0}^{levels-1} P_{i,j}\left\frac{(i-\mu_i) \ (j-\mu_j)}{\sqrt{(\sigma_i^2)(\sigma_j^2)}}\right]

参数:

P:ndarray输入数组。P是计算指定属性的灰度共生直方图。值Pi,j,d,theta是灰度级j在距离d和与灰度级i成角度θ时出现的次数。prop:{'contrast','dissimilarity','homogeneity','energy','correlation','ASM'},可选GLCM的特性来计算。默认值是'对比'。

返回:

结果:2-D ndarray 2维阵列。resultd,a是第d个距离和第a个角度的属性'prop'。

例子:

计算距离为1,2和角度为0度,90度的GLCM的对比度

>>> image = np.array([[0, 0, 1, 1],
...                   [0, 0, 1, 1],
...                   [0, 2, 2, 2],
...                   [2, 2, 3, 3]], dtype=np.uint8)
>>> g = greycomatrix(image, [1, 2], [0, np.pi/2], levels=4,
...                  normed=True, symmetric=True)
>>> contrast = greycoprops(g, 'contrast')
>>> contrast
array([[ 0.58333333,  1.        ],
       [ 1.25      ,  2.75      ]]

hog

skimage.feature.hog(image, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(3, 3), block_norm='L1', visualise=False, transform_sqrt=False, feature_vector=True, normalise=None)[source]

提取给定图像的定向梯度直方图(HOG)。

计算面向梯度的直方图(HOG)

  1. (可选)全局图像标准化

2. 在x和y中计算渐变图像

3. 计算梯度直方图

4. 正常化块

5. 展平成一个特征向量

参数:

图像:(M,N)ndarray输入图像(灰度)。方向:int,可选方向箱的数量。pixels_per_cell:2元组(int,int),可选的单元格大小(以像素为单位)。cells_per_block:2元组(int,int),可选每个块中的单元格数。block_norm:str {'L1','L1-sqrt','L2','L2-Hys'},可选块归一化方法:L1使用L1范数进行归一化。(默认)L1-sqrt使用L1-norm进行归一化,然后是平方根。L2规范化使用L2范数。使用L2范数进行L2-Hys归一化,然后将最大值限制为0.2(Hys代表滞后)并使用L2范数重新归一化。有关详细信息,请参阅R196,R197。可视化:布尔,可选还返回HOG的图像。transform_sqrt:bool,可选应用幂法压缩以在处理前对图像进行归一化。如果图像包含负值,请不要使用它。另请参阅下面的注释部分。feature_vector:bool,可选通过在返回前对结果调用.ravel()来返回数据作为特征向量。normalize:bool,不赞成参数已弃用。使用transform_sqrt进行幂法压缩。规范化已被弃用。

返回:

newarr:ndarray HOG将图像视为一维(展平)阵列。hog_image:ndarray(if visualize = True)HOG图像的可视化。

注意

所提出的代码实现了从[R195]的HOG提取方法,其具有以下变化:(I)使用(3,3)单元的块((2,2));(II)单元内没有平滑(高斯空间窗口sigma = 8pix在论文中);(III)使用L1块标准化(本文中的L2-Hys)。

幂律压缩也称为伽玛校正,用于减少阴影和光照变化的影响。压缩使黑暗区域变得更轻。当kwarg transform_sqrt设置为True,该函数计算每个颜色通道的平方根,然后将宏算法应用于图像。

local_binary_pattern

skimage.feature.local_binary_pattern(image, P, R, method='default')[source]

灰度和旋转不变LBP(局部二元模式)。

LBP是一种可用于纹理分类的不变描述符。

参数:

图像:(N,M)阵列Graylevel图像。P:int圆对称邻居设置点的数量(角度空间的量化)。R:float圆的半径(操作员的空间分辨率)。方法:{'default','ror','uniform','var'}确定模式的方法。'default':原始的局部二值模式,它是灰度但不是旋转不变的。'ror':扩展灰度和旋转不变的默认实现。'uniform':改进的旋转不变性和均匀的模式以及角度空间的更精细的量化,灰度和旋转不变。'nri_uniform':非旋转不变的均匀图案变体,它只是灰度不变的R199。'VAR':

返回:

输出:(N,M)阵列LBP图像。

  • 'default':原始的局部二值模式,它是灰度但不是旋转不变的。 
  • 'ror':扩展灰度和旋转不变的默认实现。 
  • 'uniform':改进的旋转不变性和均匀的模式以及角度空间的更精细的量化,灰度和旋转不变。 
  • 'nri_uniform':非旋转不变统一模式变体,它只是灰度不变的[R199]。 
  • 'var':旋转不变方差测量局部图像纹理的对比度,其是旋转但不是灰度不变的。 
Returns:  **output** : (N, M)
发布了150 篇原创文章 · 获赞 334 · 访问量 74万+

猜你喜欢

转载自blog.csdn.net/lyxleft/article/details/102904909
今日推荐