灰度共生矩陣-python
阿新 • • 發佈:2018-12-24
灰度共生矩陣(Gray Level Co-occurrence Matrix,GLCM)統計了灰度圖中畫素間的灰度值分佈規律以區分不同的紋理。灰度共生矩陣中每個元素的值可以定義為(x, y)點與(x + dx, y + dy)點的值對為(i, j)的概率。統計整幅影象中每一種灰度值組合出現的概率矩陣 P 即為灰度共生矩陣。
一張影象的灰度值範圍一般為0-255,為減少計算量,在計算矩陣前,需要對灰度值進行縮放,一般為0-15.由於灰度共生矩陣的維度較大,一般不直接作為區分紋理的特徵,而是基於它構建的一些統計量作為紋理分類特徵。例如Haralick曾提出了14種基於灰度共生矩陣計算出來的統計量:能量、熵、對比度、均勻性、相關性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相關資訊測度以及最大相關係數。
import cv2
import numpy as np
np.set_printoptions(suppress=True)
def glcm(arr, d_x, d_y, gray_level=16):
'''計算並返回歸一化後的灰度共生矩陣'''
max_gray = arr.max() + 1
#若灰度級數大於gray_level,則將影象的灰度級縮小至gray_level,減小灰度共生矩陣的大小
arr = arr * gray_level // max_gray
ret = np.zeros([gray_level, gray_level])
for j in range(height - d_y):
for i in range(width - d_x):
rows = arr[j][i]
cols = arr[j + d_y][i + d_x]
ret[rows][cols] += 1.0
return ret / float(arr.shape[0] * arr.shape[1]) # 歸一化
if __name__=='__main__':
fp = '/home/mamq//images/3.jpg'
img = cv2.imread(fp)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
glcm_0 = glcm(img_gray, 1,0) # 水平方向
#glcm_1 = glcm(img_gray, 0,1) # 45度方向
#glcm_2 = glcm(img_gray, 1,1) # 垂直方向
#glcm_3 = glcm(img_gray, -1,1) # 135度方向