【图像处理】——纹理特征提取方法(LBP局部二值模式和GLCM灰度共生矩阵)

纹理特征提取方法

局部二值模式(LBP)

(结构法)
Local binary patterns

原理

  • 将像素点的邻域八个像素点与中心像素点值进行比较,大于设为1,小于设为0,这样就会得到一个邻域值为1和0的格子,将这八个值按照一定的规则排列成一个二进制的数字,并且转换为十进制作为中心像素的灰度值,对每一个像素点进行该操作,这样就得到了图像的LBP特征

几种形式

  • 方形邻域

    • 中心像素点方形邻域八个像素格的值进行比较,大于为1,小于为0,以左上角为起始,顺时针得到一个8位二进制,化为十进制作为中心像素点的灰度值
  • 圆形邻域

    • 中心像素点圆形半径邻域八个像素格的值进行比较,大于为1,小于为0,以顶部为起始,顺时针得到一个8位二进制,化为十进制作为中心像素点的灰度值
    • 注意:这里有时候八个点可能会落在像素格的边界。这时候需要进行的双线性插值来求得像素值
  • 等价模式

    • 根据8位二进制分为两类

      • 第一类:等价模式类(占大部分)

        • LBP二进制1和0的转换只有2次及以下(01111110、10111111)
      • 第二类:混合模式类

        • LBP二进制1和0的转换超过两次(11010101、11110100)

纹理的种类

  • 256类

    • 邻域8个格子,每个格子两种选择,因此会有256种组合
  • 58类

    • 因为等价模式的存在,使得只有58类

求解步骤

  • 1、将图像分割成16*16个小块区域(这样就将图像分成了256个小图像)
  • 2、对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;对于边缘的像素点用补零操作来1进行求解
  • 注:对于每一个小区域,得到的LBP值种类是256种,但是因为等价模式,所以只有58种,即直方图的横坐标是0-58,因此得到的全图像的LBP特征向量也是58种
  • 3、对每一个区域出现的LBP值进行直方图统计(范围为0——256)hist[i],这里一般需要对直方图进行归一化,即除以灰度的总次数
  • 4、这样就得到了256个小区域的直方图hist[i]
  • 5、将256个hist[i]转换成一个特征向量,即封装在一个向量中,这样就得到了整幅图像LBP纹理特征向量
  • 注:通过这个纹理向量可以对图像进行描述
  • 6、使用分类器对其进行分类

优点

  • 1、对光照的鲁棒性好,即光照影响不大
  • 2、能够有效地区分

应用

  • 1、人脸识别

  • 2、图片相似度

    • 一幅100100像素大小的图片,划分为1010=100个子区域(可以通过多种方式来划分区域),每个子区域的大小为1010像素;在每个子区域内的每个像素点,提取其LBP特征,然后,建立统计直方图;这样,这幅图片就有1010个子区域,也就有了1010个统计直方图,利用这1010个统计直方图,就可以描述这幅图片了。之后,我们利用各种相似性度量函数,就可以判断两幅图像之间的相似性了

Python实现

  • 模块&包

    • from skimage import feature as skft
  • 函数

    • local_binary_pattern(image, P, R, method=‘default’)
  • 参数解析:

    • image-进行LBP特征提取的灰度图像

    • P-邻域点的个数,通常为8

    • R-圆形邻域的半径通常为1

    • method-决定LBP向量的性质,默认的具有灰度尺度不变的特性

      • 灰度尺度不变: ‘default’: original local binary pattern which is gray scale but not rotation invariant.
      •   灰度尺度不变和旋转不变:  * 'ror': extension of default implementation which is gray scale and    rotation invariant.
        
      •     * 'uniform': improved rotation invariance with uniform patterns and finer quantization of the angular space which is gray scale and   rotation invariant.
        
      •     * 'nri_uniform': non rotation-invariant uniform patterns variant    which is only gray scale invariant [2]_.
        
      •     * 'var': rotation invariant variance measures of the contrast of local image texture which is rotation but not gray scale invariant.
        
  • 返回值

    • 返回依旧是一副图像,只是像素值变成了LBP十进制值

举例

数据集的地址:https://pan.baidu.com/s/1bpjC7Vp
【图像处理】——纹理特征提取方法(LBP局部二值模式和GLCM灰度共生矩阵)_第1张图片
这篇博文是数字图像处理的大作业.
题目描述:给定40张不同风格的纹理图片,大小为512*512,要求将每张图片分为大小相同的9块,利用其中的5块作为训练集,剩余的4块作为测试集,构建适当的模型实现图片的分类.
图片如下图所示:

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVR
from skimage import feature as skft

def loadPicture():
    train_index = 0
    test_index = 0
    train_data = np.zeros( (200,171,171) )
    test_data = np.zeros( (160,171,171) )
    train_label = np.zeros( (200) )
    test_label = np.zeros( (160) )
    for i in np.arange(40):
        image = mpimg.imread('picture/'+str(i)+'.tiff')
        data = np.zeros( (513,513) )
        data[0:image.shape[0],0:image.shape[1]] = image
        #切割后的图像位于数据的位置
        index = 0
        #将图片分割成九块
        for row in np.arange(3):
            for col in np.arange(3):
                if index<5:
                    train_data[train_index,:,:] = data[171*row:171*(row+1),171*col:171*(col+1)]
                    train_label[train_index] = i
                    train_index+=1
                else:
                    test_data[test_index,:,:] = data[171*row:171*(row+1),171*col:171*(col+1)]
                    test_label[test_index] = i
                    test_index+=1
                index+=1
    return train_data,test_data,train_label,test_label

radius = 1
n_point = radius * 8

def texture_detect():
    train_hist = np.zeros( (200,256) )
    test_hist = np.zeros( (160,256) )
    for i in np.arange(200):
        #使用LBP方法提取图像的纹理特征.
        lbp=skft.local_binary_pattern(train_data[i],n_point,radius,'default')
        #统计图像的直方图
        max_bins = int(lbp.max() + 1)
        #hist size:256
        train_hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins))

    for i in np.arange(160):
        lbp = skft.local_binary_pattern(test_data[i],n_point,radius,'default')
        #统计图像的直方图
        max_bins = int(lbp.max() + 1)
        #hist size:256
        test_hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins))


    return train_hist,test_hist

train_data,test_data,train_label,test_label= loadPicture()
train_hist,test_hist = texture_detect()
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
score = OneVsRestClassifier(svr_rbf,-1).fit(train_hist, train_label).score(test_hist,test_label)
print(score)

灰度共生矩阵法(GLCM)

(统计法)
Gray-level co-occurrence matrix

定义

  • 描述相距d的两个像素值同时出现的联合概率

几个概念

  • 步长n

    • 离中心像素点(x,y)的距离(像素格数)
  • 方向α

    • 四个方向

      • 0°(0,d) (x,y+d)
      • 45°(d,-d) (x+d,y-d)
      • 90°(d,0) (x+d,y)
      • 135°(-d,-d) (x-d,y-d)
  • 矩阵阶数

    • 图像的灰度级的最大值,如8位灰度图,灰度最大级数为256,则共生矩阵的shape为256*256

求解步骤

  • 1、确定图像的灰度级数n*n
  • 2、确定矩阵阶数n
  • 3、确定方向和步长
  • 4、按照给定方法统计邻近像素点对的像素对的频数
  • 5、将频数转换为频度即概率

纹理特征提取

  • 角二阶矩(能量)ASM

    • 衡量灰度分布均匀与否、纹理粗细与否,均匀&细,值大
  • 相关性COR

    • 行列灰度线性关系大,值大
  • 对比度CON

    • 边缘锐利、色差大,值大
  • 差异性DISL

    • 局部对比度大,值大
  • 熵ENT

    • 图像复杂程度,复杂值大
  • 反差分矩阵HOMO

    • 图像纹理清晰与规则度,越清晰越规则值大

意义

  • 相邻像素相关性的表现

  • 共生矩阵对角线元素反应灰度变化程度

    • 对角线偏向0,指定方向的灰度重复的少,变化大
    • 对角线元素值偏离0,变化小

优缺点

  • 优点:

    • -方法简单
      • 易于实现
      • GLCM方法是公认的有效方法
      • 具有较强的适应能力和鲁棒性。
  • 缺点:

      • 与人类视觉模型脱节,缺少全局信息的利用,难以研究纹理尺度间像素的遗传或依赖关系
      • 缺乏理论支撑
      • 计算复杂度很高,制约了其实际应用

Python实现

  • 步骤

    • 1、将图像灰度化
    • 2、图像转为8位无符号整型
    • 3、将图像进行特征压缩,将256级灰度压缩成16级
    • 4、求解共生矩阵
    • 5、获取各个纹理特征
  • 代码skimage和skimage.feature包

    • 1、color.rgb2gray
    • 2、image_as_ubyte
    • 3、np.digitize(x,bins)
    • 4、greycomatrix(图像,[步长],[方向列表],共生矩阵的级数),返回4维矩阵P[i,j,d,theta]
    • 5、得到特征:greycoprops(共生矩阵, ‘特征名称’)
import numpy as np
from skimage.feature import greycomatrix, greycoprops
from skimage import io, color, img_as_ubyte

img = io.imread('colorful_lena.jpg')

gray = color.rgb2gray(img)
image = img_as_ubyte(gray)#变成8位无符号整型

#这一步类似于数据压缩,因为8位图像含有256个灰度级,这样会导致计算灰度共生矩阵是的计算量过大,因此将其进行压缩成16级,将灰度进行分区
bins = np.array([0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 255]) #16-bit
inds = np.digitize(image, bins)#返回的是一个和image大小一样的矩阵,只是矩阵元素表示的是image中元素在bins中的区间位置,小于0为0,0-16为1,以此类推

max_value = inds.max()+1
matrix_coocurrence = greycomatrix(inds, #需要进行共生矩阵计算的numpy矩阵
                                  [1],#步长
                                  [0, np.pi/4, np.pi/2, 3*np.pi/4],#方向角度
                                  levels=max_value, #共生矩阵阶数
                                  normed=False, symmetric=False)
#P[i,j,d,theta]返回的是一个四维矩阵,各维代表不同的意义


# GLCM properties
def contrast_feature(matrix_coocurrence):
   contrast = greycoprops(matrix_coocurrence, 'contrast')
   return "Contrast = ", contrast

def dissimilarity_feature(matrix_coocurrence):
   dissimilarity = greycoprops(matrix_coocurrence, 'dissimilarity')
   return "Dissimilarity = ", dissimilarity

def homogeneity_feature(matrix_coocurrence):
   homogeneity = greycoprops(matrix_coocurrence, 'homogeneity')
   return "Homogeneity = ", homogeneity

def energy_feature(matrix_coocurrence):
   energy = greycoprops(matrix_coocurrence, 'energy')
   return "Energy = ", energy

def correlation_feature(matrix_coocurrence):
   correlation = greycoprops(matrix_coocurrence, 'correlation')
   return "Correlation = ", correlation

def asm_feature(matrix_coocurrence):
   asm = greycoprops(matrix_coocurrence, 'ASM')
   return "ASM = ", asm

print(contrast_feature(matrix_coocurrence))
print(dissimilarity_feature(matrix_coocurrence))
print(homogeneity_feature(matrix_coocurrence))
print(energy_feature(matrix_coocurrence))
print(correlation_feature(matrix_coocurrence))
print(asm_feature(matrix_coocurrence))

【图像处理】——纹理特征提取方法(LBP局部二值模式和GLCM灰度共生矩阵)_第2张图片

参考文献:

https://www.cnblogs.com/dwdxdy/archive/2012/05/31/2528906.html
纹理特征提取方法:LBP, 灰度共生矩阵
LBP原理介绍以及算法实现
图像特征提取(纹理特征)
https://www.cnblogs.com/8335IT/p/5648445.html
python实现LBP方法提取图像纹理特征实现分类
纹理特征提取方法——灰度共生矩阵(GLCM )

你可能感兴趣的:(图像处理,python,图像处理,纹理提取,LBP,灰度共生矩阵GLCM)