纹理——灰度共生矩阵公式及代码
灰度共生矩陣(Grey-Level Co-occurence Matrix,GLCM)被定義為從灰度為i的像素點出發,離開某個固定位置(相隔距離為d,方位為)的點上灰度值為的概率,即,所有估計的值可以表示成一個矩陣的形式,以此被稱為灰度共生矩陣。
? 在圖像中任意取一點(x, y)以及偏離它的另一點(x+a, y+b),形成一個點對,設該點對的 灰度值為(i, j),即點
(x, y)的灰度為i , 點(x+a, y+b)的灰度為j。
? 固定a 與b,令點(x, y)在整幅圖像上移動,會得到各種(i, j)值。設灰度值的級數為L,則i 與j 的組合共有L2種。
? 在整幅圖像中,統計出每一種(i, j)值出現的次數,再將它們歸一化為出現的概率Pij ,則稱方陣[Pij ]L× L 為灰度聯合概率矩陣,也稱為灰度共生矩陣。
? 灰度聯合概率矩陣實際上就是兩像素點的聯合直方圖距離差分值(a, b)取不同的數值組合,可以得到沿一定方向如 (0o,45o,90o,135o) 相隔一定距離d 的像元之間灰度聯合概率矩陣。
? a 和b 的取值要根據紋理周期分布的特征來選擇,對于較細的紋理,選取(1,0),(0,1),(1,1),(-1,1)等小的差分值。
? 當a 與b 取值較小時,對應于變化較慢的紋理圖像(粗紋理),其灰度聯合概率矩陣對角線上的數值較大,傾向于作對角線分布;若紋理的變化越快(細紋理),則對角線上的數值越小,而對角線兩側上的元素值增大,傾向于均勻分布。
統計量:Haralick曾提出14種統計量:即:能量、熵、對比度、均勻性、相關性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相關信息測度以及最大相關系數。(由于灰度共生矩陣的數據量較大,一般不直接作為區分紋理的特征,而是基于它構建的一些統計量作為紋理分類特征。)
C 語言代碼塊(原文鏈接:https://blog.csdn.net/guanyuqiu/article/details/53117507)
#define GLCM_DIS 3 //灰度共生矩陣的統計距離 #define GLCM_CLASS 16 //計算灰度共生矩陣的圖像灰度值等級化 typedef enum GLCM_ANGLE {GLCM_ANGLE_HORIZATION,GLCM_ANGLE_VERTICAL,GLCM_ANGLE_DIGONAL_45,GLCM_ANGLE_DIGONAL_135 }GLCM_ANGLE; int CalGlCM(unsigned char* pImage,GLCM_ANGLE angleDirection,double* featureVector) { int i,j; if(NULL == pImage) return 1; int * glcm = new int[GLCM_CLASS * GLCM_CLASS]; int * histImage = new int[width * height]; if(NULL == glcm || NULL == histImage) return 2; //灰度等級化---分GLCM_CLASS個等級 for(i = 0;i < height;i++){ for(j = 0;j < width; j++){ histImage[i * width + j] = (int)(data[width*i+j] * GLCM_CLASS/256); } } //初始化共生矩陣 for (i = 0;i < GLCM_CLASS;i++) for (j = 0;j < GLCM_CLASS;j++) glcm[i * GLCM_CLASS + j] = 0; //計算灰度共生矩陣 int w,k,l; //水平方向 if(angleDirection == GLCM_ANGLE_HORIZATION) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width) { k = histImage[i * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width) { k = histImage[i * width + j - GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } } } } //垂直方向 else if(angleDirection == GLCM_ANGLE_VERTICAL) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(i + GLCM_DIS >= 0 && i + GLCM_DIS < height) { k = histImage[(i + GLCM_DIS) * width + j]; glcm[l * GLCM_CLASS + k]++; } if(i - GLCM_DIS >= 0 && i - GLCM_DIS < height) { k = histImage[(i - GLCM_DIS) * width + j]; glcm[l * GLCM_CLASS + k]++; } } } } //對角方向 else if(angleDirection == GLCM_ANGLE_DIGONAL) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width && i + GLCM_DIS >= 0 && i + GLCM_DIS < height) { k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width && i - GLCM_DIS >= 0 && i - GLCM_DIS < height) { k = histImage[(i - GLCM_DIS) * width + j - GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } } } } //計算特征值 double entropy = 0,energy = 0,contrast = 0,homogenity = 0; for (i = 0;i < GLCM_CLASS;i++) { for (j = 0;j < GLCM_CLASS;j++) { //熵 if(glcm[i * GLCM_CLASS + j] > 0) entropy -= glcm[i * GLCM_CLASS + j] * log10(double(glcm[i * GLCM_CLASS + j])); //能量 energy += glcm[i * GLCM_CLASS + j] * glcm[i * GLCM_CLASS + j]; //對比度 contrast += (i - j) * (i - j) * glcm[i * GLCM_CLASS + j]; //一致性 homogenity += 1.0 / (1 + (i - j) * (i - j)) * glcm[i * GLCM_CLASS + j]; } } //返回特征值 i = 0; featureVector[i++] = entropy; featureVector[i++] = energy; featureVector[i++] = contrast; featureVector[i++] = homogenity; delete[] glcm; delete[] histImage; return 0; }python代碼 來源:https://blog.csdn.net/kmsj0x00/article/details/79463376
#!/usr/bin/python # -*- coding: UTF-8 -*- import cv2 import math#定義最大灰度級數 gray_level = 16def maxGrayLevel(img):max_gray_level=0(height,width)=img.shapeprint height,widthfor y in range(height):for x in range(width):if img[y][x] > max_gray_level:max_gray_level = img[y][x]return max_gray_level+1def getGlcm(input,d_x,d_y):srcdata=input.copy()ret=[[0.0 for i in range(gray_level)] for j in range(gray_level)](height,width) = input.shapemax_gray_level=maxGrayLevel(input)#若灰度級數大于gray_level,則將圖像的灰度級縮小至gray_level,減小灰度共生矩陣的大小if max_gray_level > gray_level:for j in range(height):for i in range(width):srcdata[j][i] = srcdata[j][i]*gray_level / max_gray_levelfor j in range(height-d_y):for i in range(width-d_x):rows = srcdata[j][i]cols = srcdata[j + d_y][i+d_x]ret[rows][cols]+=1.0for i in range(gray_level):for j in range(gray_level):ret[i][j]/=float(height*width)return retdef feature_computer(p):Con=0.0Eng=0.0Asm=0.0Idm=0.0for i in range(gray_level):for j in range(gray_level):Con+=(i-j)*(i-j)*p[i][j]Asm+=p[i][j]*p[i][j]Idm+=p[i][j]/(1+(i-j)*(i-j))if p[i][j]>0.0:Eng+=p[i][j]*math.log(p[i][j])return Asm,Con,-Eng,Idmdef test(image_name):img = cv2.imread(image_name)try:img_shape=img.shapeexcept:print 'imread error'returnimg=cv2.resize(img,(img_shape[1]/2,img_shape[0]/2),interpolation=cv2.INTER_CUBIC)img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)glcm_0=getGlcm(img_gray, 1,0)#glcm_1=getGlcm(src_gray, 0,1)#glcm_2=getGlcm(src_gray, 1,1)#glcm_3=getGlcm(src_gray, -1,1)asm,con,eng,idm=feature_computer(glcm_0)return [asm,con,eng,idm]if __name__=='__main__':result = test("test.bmp")print(result)總結
以上是生活随笔為你收集整理的纹理——灰度共生矩阵公式及代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyqt控件显示重叠_Python编程:
- 下一篇: 安装centos7失败认不到硬盘_Cen