LBP機能記述演算子| Datawhale Juneチーム学習(タスク2)

1.原則

進捗 元のLBPオペレーター 循環LBP演算子 回転不変LBP演算子 LBP同等モデル
定義 3 * 3ウィンドウで、ウィンドウの中央のピクセルをしきい値として、隣接する8ピクセルのグレー値をそれと比較します。周囲のピクセル値が中央のピクセル値より大きい場合、の位置ピクセルは1としてマークされます。それ以外の場合は0 3×3近傍を任意の近傍に拡張し、正方形の近傍を円形の近傍に置き換えます。改良されたLBP演算子を使用すると、半径Rの円形の近傍に任意​​の数のピクセルを含めることができます。 最初に定義された一連のLBP値は、円形の近傍を連続的に回転させることによって取得され、最小値は近傍のLBP値として取得されます 特定のLBPに対応する循環2進数に、0から1または1から0への遷移が最大で2つある場合、LBPに対応する2進数は等価パターンクラスと呼ばれます。
アイコン ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入
利点 グレーレベルの不変性あり さまざまなサイズと頻度のテクスチャのニーズを満たす 回転不変性 過剰なバイナリモードの問題を解決しました

2.LBPは特徴学習を実現します

2.1ステップ

  1. まず、検出ウィンドウが16×16の小さな領域(セル)に分割されます。
  2. 各セルのピクセルについて、隣接する8ピクセルのグレー値が比較されます。周囲のピクセル値が中央のピクセル値よりも大きい場合、ピクセルの位置は1としてマークされ、それ以外の場合は0になります。このようにして、3 * 3近傍の8ポイントを比較して、8ビットの2進数を生成できます。つまり、ウィンドウの中央のピクセルのLBP値を取得できます。
  3. 次に、各セルのヒストグラム、つまり各数値の頻度(10進数のLBP値と想定)を計算してから、ヒストグラムを正規化します。
  4. 最後に、取得された各セルの統計ヒストグラムは、画像全体のLBPテクスチャ特徴ベクトルである特徴ベクトルに接続されます。
  5. 最後に、SVMまたは他の機械学習アルゴリズムを分類に使用できます。

2.2コード

データセットのアドレス:https//pan.baidu.com/s/1bpjC7Vp
リファレンス:https//blog.csdn.net/selous/article/details/69486823

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

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('D:/python_opencv/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')
        cv2.imshow("lbp",lbp)
        #统计图像的直方图
        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)
a = OneVsRestClassifier(svr_rbf,-1).fit(train_hist, 
                       train_label).score(test_hist,test_label)
print(a)
#cv2.imshow("train_hist",test_hist)

2.3特徴学習の結果

生データ:
ここに画像の説明を挿入
トレーニング結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_42326479/article/details/107000355