灰度共生矩陣
灰度共生矩陣(Gray Level CO-Occurrence Matrix-GLCM)是圖像特征分析與提取的重要方法之一,在紋理分析、特征分類、圖像質量評價燈方面都有很重要的應用,其基本原理圖示如下:
左側是一個圖像,可以看出最小的灰度級別是1,最大的灰度級別是8,共有8個灰度級別。右側對應的灰度共生矩陣,左上角第一行與第一列的坐標(1, 1)包含值1,原因在于水平方向上,相距一個像素值,當前像素跟水平右側相鄰像素只有一個是1、1相鄰的像素值(灰度級別)對;右側共生矩陣的原始(1, 2) = 2 說明在像素矩陣中有兩個像素值1,2相鄰的像素點對、以此類推得到完整的右側灰度共生矩陣。根據當前像素跟相鄰像素位置不同,可以計算得到不同的共生矩陣,同時根據像素之間的距離不同會輸出不同灰度共生矩陣。總結來說,有如下四種不同角度的灰度共生矩陣:
0度水平方向GLCM
45度方向GLCM
90度垂直方向GLCM
135度方向GLCM
根據相鄰像素點之間距離參數D不同可以得到不同距離的GLCM。此外對正常的灰度圖像來說,最小灰度值為0,最大的灰度值為255,共計256個灰度級別,所以GLCM的大小為256x256,但是我們可以對灰度級別進行降維操作,比如可以每8個灰度值表示一個level這樣,這樣原來256x256大小的共生矩陣就可以改成256/8 * 256 /8 = 32x32的共生矩陣。所以最終影響灰度共生矩陣生成有三個關鍵參數:
角度 (支持0、45、90、135)
距離(大于等于1個像素單位)
灰度級別(最大GLCM=256 x 56)
GLCM實現紋理特征計算
灰度共生矩陣支持如下紋理特征計算,它們是:
能量
熵值
對比度
相關性
逆分差
這些紋理特征計算公式如下:
上述5個是常見的GLCM的紋理特征,GLCM總計由14個特征值輸出,這里就不再贅述了!感興趣的可以自己搜索關鍵字GLCM。
OpenCV計算灰度共生矩陣
OpenCV本身沒有灰度共生矩陣的算法實現,所以需要對照自己編碼實現,計算圖像灰度共生矩陣,代碼實現步驟如下:
加載圖像,灰度轉
創建灰度共生矩陣Mat對象
計算灰度共生矩陣
顯示灰度共生矩陣
這里我采用的角度為0、45、90、135、像素距離d=1、灰度級別為256,代碼實現如下:
//0°,45°,90°,135° Matglcm_0=Mat::zeros(Size(step,step),CV_32FC1); for(introw=0;row(row,col); intj=gray.at(row,col+1); glcm_0.at (i,j)++; } } Matglcm_45=Mat::zeros(Size(step,step),CV_32FC1); for(introw=1;row(row,col); intj=gray.at (row-1,col+1); glcm_45.at (i,j)++; } } Matglcm_90=Mat::zeros(Size(step,step),CV_32FC1); for(introw=1;row(row,col); intj=gray.at (row-1,col); glcm_90.at (i,j)++; } } Matglcm_135=Mat::zeros(Size(step,step),CV_32FC1); for(introw=1;row(row,col); intj=gray.at (row-1,col-1); glcm_135.at (i,j)++; } } normalize(glcm_0,glcm_0,0,1.0,NORM_MINMAX); normalize(glcm_45,glcm_45,0,1.0,NORM_MINMAX); normalize(glcm_90,glcm_90,0,1.0,NORM_MINMAX); normalize(glcm_135,glcm_135,0,1.0,NORM_MINMAX);
運行效果如下:圖一
斑馬線的灰度共生矩陣
提取圖像對比度特征
基于共生矩陣實現紋理特征計算,這里我用了比較簡單的對比度計算來實現局部紋理特征提取、代碼實現如下(局部窗口大小8x8、灰度級別256/32 =8個級別)
intstep=256; Matimage=imread("D:/images/ftexture.jpg"); //Matimage=imread("D:/images/ban_texture.jpg"); Matgray; cvtColor(image,gray,COLOR_BGR2GRAY); imshow("gray",gray); intheight=gray.rows; intwidth=gray.cols; Matglcm_0=Mat::zeros(Size(width,height),CV_32FC1); Rectroi; roi.x=0; roi.y=0; roi.width=8; roi.height=8; for(introw=4;row(row,col)=pv; } } normalize(glcm_0,glcm_0,0,1.0,NORM_MINMAX); imshow("glcm",glcm_0); waitKey(0);
方法計算灰度矩陣的代碼如下:
Matm=Mat::zeros(Size(8,8),CV_32FC1); for(introw=0;row(row,col)/32; intj=im.at(row+1,col+1)/32; m.at (i,j)++; } } floatcontrast=0; for(inti=0;i8;?i++)?{ ????for?(int?j?=?0;?j?8;?j++)?{ ????????contrast?+=?m.at (i,j)*(i-j)*(i-j); } } returncontrast;
計算135°的灰度共生矩陣,基于計算局部對比度提取紋理運行結果如下:
測試一(左側是輸入圖像、右側135的對比度)
-
編碼
+關注
關注
6文章
942瀏覽量
54829 -
圖像特征
+關注
關注
0文章
13瀏覽量
7044 -
灰度共生矩陣
+關注
關注
0文章
2瀏覽量
841
原文標題:基于灰度共生矩陣(GLCM)的圖像紋理分析與提取
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論