使用LBP特征进行图像分类

使用图像的 LBP 纹理特征对图像分类

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子,具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和 D. Harwood 在1994年提出,用于纹理特征提取,且提取的特征是图像的局部的纹理特征。

代码放在了最下面,也可访问Github

LBP的应用中,一般都不将LBP图谱作为特征向量用于分类识别,而是采用LBP特征谱的统计直方图作为特征向量用于分类识别。本示例便是使用统计直方图作为分类依据。

对LBP特征向量进行提取的步骤:
(1)首先将检测窗口划分为16×16的小区域(cell);

(2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;

(3)其次计算每个cell的直方图,即每个数字出现的频率;然后对该直方图进行归一化处理;

(4)最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也即整幅图的LBP纹理特征向量。

# 下图为该条件下得到的LBP纹理图像
radius = 3
n_point = radius * 16

在这里插入图片描述

from skimage import feature
from PIL import Image
import numpy as np
import time
import os
import pandas as pd
from sklearn.metrics import accuracy_score, f1_score, recall_score, confusion_matrix, classification_report, precision_score
from PIL import Image

def read_image(img_name):
    im = Image.open(img_name).convert('L')
    data = np.array(im)
    return data

images = []
for fn in os.listdir('D:/data'):
    if fn.endswith('.jpg'):
        fd = os.path.join('D:/data',fn)
        images.append(read_image(fd))
print('load data success!')

X = np.array(images)
print (X.shape)
y = np.loadtxt('label.txt')
print (y.shape)
# the data, split between train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.5, random_state= 3)
print (X_train.shape)
print (X_test.shape)
print (y_train.shape)
print (y_test.shape)

radius = 2
n_point = radius * 8
def lbp_texture(train_data, test_data):
    train_hist = np.zeros((len(X_train), 256))
    test_hist = np.zeros(((len(X_train), 256))
    for i in np.arange((len(X_train)):
        # 使用skimage LBP方法提取图像的纹理特征
        lbp = feature.local_binary_pattern(train_data[i],n_point,radius,'default')
        # 统计图像直方图256维
        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((len(X_train)):
        lbp = feature.local_binary_pattern(test_data[i],n_point,radius,'default')
        max_bins = int(lbp.max() + 1)
        test_hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins))
    return train_hist, test_hist

from sklearn import svm
X_train, X_test = lbp_texture(X_train, X_test)

clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
clf.fit(X_train, y_train)
p_test = clf.predict(X_test)

from sklearn.metrics import f1_score, accuracy_score, precision_score, recall_score
print(clf.score(X_train, y_train))  # 训练精度
print(clf.score(X_test, y_test))  # 测试精度
print('decision_function:\n', clf.decision_function(x_train))
print(precision_score(y_test, p_test, average='macro'))
print(recall_score(y_test, p_test, average='macro'))
print(f1_score(y_test, p_test, average='macro'))
print(accuracy_score(y_test, p_test))

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yddcs

你的鼓励--创作的动力!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值