灰度共生矩陣
灰度共生矩陣(Gray Level CO-Occurrence Matrix-GLCM)是圖像特征分析與提取的重要方法之一,在紋理分析、特征分類、圖像質(zhì)量評價(jià)燈方面都有很重要的應(yīng)用,其基本原理圖示如下:
左側(cè)是一個(gè)圖像,可以看出最小的灰度級(jí)別是1,最大的灰度級(jí)別是8,共有8個(gè)灰度級(jí)別。右側(cè)對應(yīng)的灰度共生矩陣,左上角第一行與第一列的坐標(biāo)(1, 1)包含值1,原因在于水平方向上,相距一個(gè)像素值,當(dāng)前像素跟水平右側(cè)相鄰像素只有一個(gè)是1、1相鄰的像素值(灰度級(jí)別)對;右側(cè)共生矩陣的原始(1, 2) = 2 說明在像素矩陣中有兩個(gè)像素值1,2相鄰的像素點(diǎn)對、以此類推得到完整的右側(cè)灰度共生矩陣。根據(jù)當(dāng)前像素跟相鄰像素位置不同,可以計(jì)算得到不同的共生矩陣,同時(shí)根據(jù)像素之間的距離不同會(huì)輸出不同灰度共生矩陣??偨Y(jié)來說,有如下四種不同角度的灰度共生矩陣:
0度水平方向GLCM
45度方向GLCM
90度垂直方向GLCM
135度方向GLCM
根據(jù)相鄰像素點(diǎn)之間距離參數(shù)D不同可以得到不同距離的GLCM。此外對正常的灰度圖像來說,最小灰度值為0,最大的灰度值為255,共計(jì)256個(gè)灰度級(jí)別,所以GLCM的大小為256x256,但是我們可以對灰度級(jí)別進(jìn)行降維操作,比如可以每8個(gè)灰度值表示一個(gè)level這樣,這樣原來256x256大小的共生矩陣就可以改成256/8 * 256 /8 = 32x32的共生矩陣。所以最終影響灰度共生矩陣生成有三個(gè)關(guān)鍵參數(shù):
角度 (支持0、45、90、135)
距離(大于等于1個(gè)像素單位)
灰度級(jí)別(最大GLCM=256 x 56)
GLCM實(shí)現(xiàn)紋理特征計(jì)算
灰度共生矩陣支持如下紋理特征計(jì)算,它們是:
能量
熵值
對比度
相關(guān)性
逆分差
這些紋理特征計(jì)算公式如下:
上述5個(gè)是常見的GLCM的紋理特征,GLCM總計(jì)由14個(gè)特征值輸出,這里就不再贅述了!感興趣的可以自己搜索關(guān)鍵字GLCM。
OpenCV計(jì)算灰度共生矩陣
OpenCV本身沒有灰度共生矩陣的算法實(shí)現(xiàn),所以需要對照自己編碼實(shí)現(xiàn),計(jì)算圖像灰度共生矩陣,代碼實(shí)現(xiàn)步驟如下:
加載圖像,灰度轉(zhuǎn)
創(chuàng)建灰度共生矩陣Mat對象
計(jì)算灰度共生矩陣
顯示灰度共生矩陣
這里我采用的角度為0、45、90、135、像素距離d=1、灰度級(jí)別為256,代碼實(shí)現(xiàn)如下:
//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);
運(yùn)行效果如下:圖一
斑馬線的灰度共生矩陣
提取圖像對比度特征
基于共生矩陣實(shí)現(xiàn)紋理特征計(jì)算,這里我用了比較簡單的對比度計(jì)算來實(shí)現(xiàn)局部紋理特征提取、代碼實(shí)現(xiàn)如下(局部窗口大小8x8、灰度級(jí)別256/32 =8個(gè)級(jí)別)
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);
方法計(jì)算灰度矩陣的代碼如下:
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;
計(jì)算135°的灰度共生矩陣,基于計(jì)算局部對比度提取紋理運(yùn)行結(jié)果如下:
測試一(左側(cè)是輸入圖像、右側(cè)135的對比度)
-
編碼
+關(guān)注
關(guān)注
6文章
932瀏覽量
54731 -
圖像特征
+關(guān)注
關(guān)注
0文章
13瀏覽量
7034 -
灰度共生矩陣
+關(guān)注
關(guān)注
0文章
2瀏覽量
834
原文標(biāo)題:基于灰度共生矩陣(GLCM)的圖像紋理分析與提取
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論