寶塔 wordpress 404蘭州seo公司
目錄
一、LBPH算法
1、概念
2、實(shí)現(xiàn)步驟
3、方法
1)步驟1
? 縮放
? 旋轉(zhuǎn)和平移
2)步驟2
二、案例實(shí)現(xiàn)
1、完整代碼
1)圖像內(nèi)容:
2)運(yùn)行結(jié)果:
一、LBPH算法
1、概念
????????在OpenCV中,LBPH(Local Binary Patterns Histogram,局部二值模式直方圖)算法主要用于人臉識別任務(wù)。
? ? ? ? LBPH是一種用于圖像特征提取的算法。它首先將圖像劃分為小的局部區(qū)域,然后在每個(gè)區(qū)域中提取局部二值模式(Local Binary Patterns)。
????????局部二值模式是一種在像素鄰域中將像素與其鄰居像素進(jìn)行比較的方法,根據(jù)比較結(jié)果將像素轉(zhuǎn)換為二進(jìn)制編碼。在LBPH算法中,將每個(gè)局部區(qū)域中的二值模式編碼組合起來形成一個(gè)直方圖,用于表示該區(qū)域的特征。最后,將所有局部區(qū)域的直方圖組合在一起,形成整個(gè)圖像的特征向量。
2、實(shí)現(xiàn)步驟
? ? ? ? 1)以每個(gè)像素為中心,判斷與周圍像素灰度值大小關(guān)系,對其進(jìn)行二進(jìn)制編碼,從而獲得整幅圖像的LBP編碼圖像
? ? ? ? 2)再將LBP圖像分為多個(gè)區(qū)域,獲取每個(gè)區(qū)域的LBP編碼直方圖,繼而得到整幅圖像的LBP編碼直方圖。 通過比較不同人臉圖像LBP編碼直方圖達(dá)到人臉識別的目的,其優(yōu)點(diǎn)是不會受到光照、縮放、旋轉(zhuǎn)和平移的影響。
3、方法
????????1)步驟1
????????? 縮放
????????????????為了得到不同尺度下的紋理結(jié)構(gòu),可以使用圓形鄰域,將計(jì)算擴(kuò)大到任意大小的鄰域內(nèi)。圓形鄰域可以用(P,R)表示,其中,P表示圓形鄰域內(nèi)參與運(yùn)算的像素點(diǎn)個(gè)數(shù),R 表示圓形鄰域的半徑。
????????? 旋轉(zhuǎn)和平移
? ? ? ? ? ? ? ? 1、將中心點(diǎn)像素作為圓心,將周圍的像素點(diǎn)按照順時(shí)針方向依次移動一個(gè)位置。
???????????????? 2、再計(jì)算所有圖像的LBP值,取其中最小值作為最終的值
? ? ? ? 2)步驟2
????????????????將LBP圖像分為多個(gè)區(qū)域,獲取每個(gè)區(qū)域的LBP編碼直方圖,繼而得到整幅圖像的LBP編碼直方圖。
????????????????LBP特征與Haar特征很相似,都是圖像的灰度變化特征。
二、案例實(shí)現(xiàn)
1、完整代碼
import cv2
import numpy as np
# 提前訓(xùn)練的人臉照片
images = []
images.append(cv2.imread('pyy1.png', cv2.IMREAD_GRAYSCALE)) # 將圖片導(dǎo)入列表
images.append(cv2.imread('pyy2.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('zly1.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('zly2.png', cv2.IMREAD_GRAYSCALE))
labels = [0,0,1,1] # 設(shè)置四張圖片的標(biāo)簽
dic = {0:'ppy',1:'zly',-1:'無法識別'} # 設(shè)置一個(gè)字典用于打印結(jié)果名稱
predict_image = cv2.imread('pyy3.png', cv2.IMREAD_GRAYSCALE) # 讀取待識別人臉,灰度圖"""創(chuàng)建一個(gè)LBPH的人臉特征識別器"""
# cv2.face.LBPHFaceRecognizer_create(radius=None, neighbors=None, grid_x=None, grid_y=None, threshold=None)
# radius:可選參數(shù),圓形局部二進(jìn)制模式的半徑,增加鄰居數(shù)可以提高識別精度,但同樣也會增加計(jì)算量,建議使用默認(rèn)值
# neighbors:可選參數(shù),圓形局部二進(jìn)制模式的鄰居數(shù),建議使用默認(rèn)值
# grid_x:可選參數(shù) 水平方向上的的單元格數(shù),默認(rèn)值為8,即將LBP特征圖在水平方向上劃分為8個(gè)單元,每個(gè)網(wǎng)格區(qū)域?qū)ⅹ?dú)立計(jì)算其局部二值模式直方圖
# grid_y:可逃參數(shù) 垂直方向上的的單元格數(shù),默認(rèn)值為8,建議使用默認(rèn)值,若grid_x和grid_y都為默認(rèn)值,則表示特征圖劃分為8*8人小,統(tǒng)計(jì)8*8大小的直方圖。
# threshold:閾值,可選參數(shù),用于設(shè)置識別器在判斷兩個(gè)人臉是否屬于同一人時(shí)的置信度閾值,通常是在調(diào)用識別器的predict()方法時(shí)作為可選參數(shù)傳入
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)"""訓(xùn)練"""
# 函數(shù)train用給定的數(shù)和相關(guān)標(biāo)簽訓(xùn)練生成的實(shí)例模型。
# 各參數(shù)的含義如下:
# src:訓(xùn)練的圖像,用來學(xué)習(xí)的人臉圖像
# labels:標(biāo)簽,人臉圖像對應(yīng)的標(biāo)簽。
recognizer.train(images,np.array(labels))"""預(yù)測"""
# 函數(shù)predict()對一個(gè)待識別人臉圖像進(jìn)行判斷,尋找與當(dāng)前圖像距離最近的人臉圖像。
# 與哪輻人貽圖像距離最近,就將當(dāng)前待測圖像標(biāo)注為該人臉圖像對應(yīng)的標(biāo)答。
# 若待識別人臉圖像與所有人臉圖像的距離都大于特定的距離值(閾值),則認(rèn)為沒有找到對應(yīng)的結(jié)果,
# 參數(shù)與返問值:
# src:需要識別的人臉圖像
# label:返回的識別結(jié)果標(biāo)簽,返回-1示無法識別當(dāng)前人。
# confidence:返回的置信度評分,用來衡量識別結(jié)果與原有模型之間的距離
# 評分越小表示匹配越高,但是若高于80,則認(rèn)為識別結(jié)果與原有模型差距大
label,confidence = recognizer.predict(predict_image)
print('這人是:',dic[label])
print('置信度:',confidence)