LBP特征
LBP特征
?
1.?原始的LBP的算子
每個像素點以其周圍的8鄰域像素的灰度值與自身灰度值比較【大于等于賦值為1,小于賦值為0】之后按順時針/逆時針的方式平鋪得到一個二進制數,此二進制數轉十進制作為該像素點的LBP值(LBP描述符)
?
?
LBP算子具有灰度不變性:對整張圖做不同的光照變化,都不會改變中心像素與鄰域像素之間的相對像素的大小比較。
計算原圖上的每個像素點的LBP值,利用全圖所有像素點的LBP值的頻數直方圖歸一化作為原圖提取到的LBP特征,因為原始LBP算子的十進制值的范圍在【0,255】,所以提取到的特征為256維。
此處提取的LBP特征可以放入分類器進行分類
?
2.?改進的LBP算子
因為原始的LBP算子的鄰域為不可變的3*3的方型鄰域,所以Ojala等人提出改進版的LBP算子
- 原來的方型鄰域變為圓形鄰域,并且可以通過改變圓形的半徑R適應不同比例的圖像
- 新增參數P表示圓形對稱鄰域內采樣的點數
- 因為原始的LBP算子不具有旋轉不變性,所以改進的圓形對稱鄰域無論圖像怎樣旋轉,只取不同方向旋轉之后LBP最小的值
- 因為采樣的點數P可能大于原始LBP算子的8導致特征維數劇增[特征可能增加到2^P],所以提出等價模式(uniform)和混合模式(nonuniform)來減少維度數
等價模式:(對于圖像來說,特征提取時,我們更關注的是角點,邊緣),這些特征對于LBP算子來說,就是LBP算子的二進制形式進行0-1跳變最多兩次
0-1跳變的判斷函數【U(Gp)代表跳變次數)】
將求的LBP的和與其移動一位后的二進制模式按位相減的絕對值求和
混合模式:?跳變次數大于兩次(U(Gp)>2)的LBP算子統一歸為一種模式
旋轉不變的等價模式+混合模式
U(Gp)表示0-1跳變次數,當U(Gp)<=2利用旋轉不變性求LBP值(此方式此條件下相當于LBP算子中連續1的個數相同為同一個LBP值),當U(Gp)>2的時候,LBP值都等于P+1
特征維數:?P(等價模式的維數)+1(混合模式的維數)
如上圖,總共8+1種
?
3.?python 實現的LBP算子
# 原始LBP算子 import numpy as np import cv2 def cal_lbp(img,i,j):center = img[i,j]LBP_matrix = img[i-1:i+2,j-1:j+2]>=center# 取的方向為逆時針LBP_value = (LBP_matrix*(np.array([64,128,1,32,0,2,16,8,4]).reshape(3,3))).sum()return LBP_valuedef original_LBP(img):h,w = img.shapeLBP_result = np.zeros((h-2,w-2))for i in range(1,h-1):for j in range(1,w-1):LBP_result[i-1,j-1] = cal_lbp(img,i,j)return LBP_result# 圓形LBP算子 from math import floor,ceil def circle_LBP(img,radius,P):h,w = img.shape# 此處必須是int類型lbp_result = np.zeros((h-radius*2,w-radius*2),dtype=np.int32)for k in range(P):x = np.cos(2*np.pi*(k/P))y = np.sin(2*np.pi*(k/P))x1,x2,y1,y2 = (int)(floor(x)),(int)(ceil(x)),(int)(floor(y)),(int)(ceil(y))px,py = x-floor(x),y-floor(y)for i in range(radius,h-radius):# 取圓形LBP的周圍的像素點,找不到則進行雙線性插值for j in range(radius,w-radius):# 進行雙線性差值value = (1-px)*(1-py)*img[x1+i,y1+j]+px*(1-py)*img[x1+i,y2+j]+ \(1-px)*py*img[x2+i,y1+j]+px*py*img[x2+i,y2+j]lbp_result[i-radius,j-radius] = np.bitwise_or(lbp_result[i-radius,j-radius],np.right_shift(int(value>img[i,j]),P-k-1))return lbp_result
#####運行 from matplotlib import pyplot as plt img = cv2.imread("happy.jpeg") gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) Ori_LBP = original_LBP(gray) r_LBP = circle_LBP(gray,radius = 3,P=8) #plt.subplots_adjust(wspace =0, hspace =0) plt.subplot(131),plt.title("Original_img"),plt.imshow(img[:,:,::-1]) plt.subplot(132),plt.title("Original_LBP"),plt.imshow(Ori_LBP,'gray') plt.subplot(133),plt.title("Radius_LBP"),plt.imshow(r_LBP,'gray')
?
總結
- 上一篇: 临时邮箱获取验证信息
- 下一篇: 支付业务概述