影象灰度共生矩陣怎麼在matlab中實現,要具體源程式

時間 2021-09-10 17:49:12

1樓:楊好巨蟹座

matlab提供了現成的函式

graycomatrix生成共生矩陣

graycoprops計算其特徵值

具體用法:

glcm = graycomatrix(i)

從影象i建立灰度共生矩陣glcm。通過計算具有灰度級i和灰度級j的畫素對在水平方向相鄰出現的頻繁程度。glcm中的每個元素說明了水平方向相鄰畫素對出現的次數。

如果灰度級為l則glcm的維數為l*l。

2.glcms = graycomatrix(i,param1,val1,param2,val2,...)

根據引數對的設定,返回一個或多個灰度共生矩陣。

引數說明:

'graylimits':灰度界限,為二元向量[low high]。灰度值小於等於low 時對應1,大於等於high時對應於灰度級。

如果引數設為,則共生矩陣使用影象的最小和最大灰度值作為界限,即[min(i(:)) max(i(:))]。

'numlevels':整數,說明i中進行灰度縮放的灰度級數目。例如,如果numlevel設為8,則共生矩陣縮放i中的灰度值使它們為1到8之間的整數。

灰度級的數目決定了共生矩陣glcm的尺寸。預設情況:數字影象:

8;二進位制影象:2。

'offset':p行2列整型矩陣,說明感興趣畫素與其相鄰畫素之間的距離。每行是一個說明畫素對之間偏移關係的二元向量[row_offset, col_offset]。

行偏移row_offset是感興趣畫素和其相鄰畫素之間的間隔行數。列偏移同理。偏移常表達為一個角度,常用的角度如下:

(其中d為畫素距離)

角度 0 45 90 135

offset [0,d] [-d d] [-d 0] [-d -d]

3.[glcms,si] = graycomatrix(...)

返回縮放影象si,si是用來計算灰度共生矩陣的。si中的元素值介於1和灰度級數目之間。

graycoprops:得到灰度共生矩陣得到各種屬性

stats = graycoprops(glcm, properties):從灰度共生矩陣glcm計算靜態屬性。glcm是m*n*p的有效灰度共生矩陣。

如果glcm是一個灰度共生矩陣的矩陣,則stats是包括每個灰度共生矩陣靜態屬性的矩陣。

graycoprops正規化了灰度共生矩陣,因此元素之和為1。正規化的glcm中的元素(r,c)是具有灰度級r和c的定義的空間關係的畫素對的聯合概率。graycoprops使用正規化的glcm來計算屬性。

屬性引數如下:

1. 'contrast' : 對比度。返回整幅影象中畫素和它相鄰畫素之間的亮度反差。取值範圍:[0,(glcm行數-1)^2]。灰度一致的影象,對比度為0。

2. 'correlation' : 相關。返回整幅影象中畫素與其相鄰畫素是如何相關的度量值。取值範圍:[-1,1]。灰度一致的影象,相關性為nan。

3. 'energy' : 能量。返回glcm中元素的平方和。取值範圍:[0 1]。灰度一致的影象能量為1。

4. 'homogemeity' : 同質性。返回度量glcm中元素的分佈到對角線緊密程度。取值範圍:[0 1]。對角矩陣的同質性為1。

2樓:匿名使用者

% 影象檢索——紋理特徵

%基於共生矩陣紋理特徵提取,d=1,θ=0°,45°,90°,135°共四個矩陣

%所用影象灰度級均為256

%參考《基於顏色空間和紋理特徵的影象檢索》

%function : t=texture(image)

%image : 輸入影象資料

%t : 返回八維紋理特徵行向量

% function t = texture(image)

gray = imread('d:\result5.bmp');

[m,n,o] = size(gray);

m = 128;

n = 128;

%1.將各顏色分量轉化為灰度

% gray = double(0.3*image(:,:,1)+0.59*image(:,:,2)+0.11*image(:,:,3));

%2.為了減少計算量,對原始影象灰度級壓縮,將gray量化成16級

for i = 1:m

for j = 1:n

for n = 1:256/16

if (n-1)*16<=gray(i,j)&gray(i,j)<=(n-1)*16+15

gray(i,j) = n-1;

endend

endend

%3.計算四個共生矩陣p,取距離為1,角度分別為0,45,90,135

p = zeros(16,16,4);

for m = 1:16

for n = 1:16

for i = 1:m

for j = 1:n

if j1&j<

p(m,n,2) = p(m,n,2)+1;

p(n,m,2) = p(m,n,2);

endif i<

p(m,n,3) = p(m,n,3)+1;

p(n,m,3) = p(m,n,3);

endif i

p(m,n,4) = p(m,n,4)+1;

p(n,m,4) = p(m,n,4);

endend

endif m==n

p(m,n,:) = p(m,n,:)*2;

endend

% 對共生矩陣歸一化

for n = 1:4

p(:,:,n) = p(:,:,n)/sum(sum(p(:,:,n)));

%4.對共生矩陣計算能量、熵、慣性矩、相關4個紋理引數

h = zeros(1,4);

i = h;

ux = h; uy = h;

deltax= h; deltay = h;

c =h;

for n = 1:4

e(n) = sum(sum(p(:,:,n).^2)); %%能量

for i = 1:16

for j = 1:16

if p(i,j,n)~=0

h(n) = -p(i,j,n)*log(p(i,j,n))+h(n); %%熵

endi(n) = (i-j)^2*p(i,j,n)+i(n); %%慣性矩

ux(n) = i*p(i,j,n)+ux(n); %相關性中μx

uy(n) = j*p(i,j,n)+uy(n); %相關性中μy

endend

endfor n = 1:4

for i = 1:16

for j = 1:16

deltax(n) = (i-ux(n))^2*p(i,j,n)+deltax(n); %相關性中σx

deltay(n) = (j-uy(n))^2*p(i,j,n)+deltay(n); %相關性中σy

c(n) = i*j*p(i,j,n)+c(n);

endend

c(n) = (c(n)-ux(n)*uy(n))/deltax(n)/deltay(n); %相關性

%求能量、熵、慣性矩、相關的均值和標準差作為最終8維紋理特徵

a1 = mean(e)

b1 = sqrt(cov(e))

a2 = mean(h)

b2 = sqrt(cov(h))

a3 = mean(i)

b3 = sqrt(cov(i))

a4 = mean(c)

b4 = sqrt(cov(c))

sprintf('0,45,90,135方向上的能量依次為: %f, %f, %f, %f',e(1),e(2),e(3),e(4)) % 輸出資料;

sprintf('0,45,90,135方向上的熵依次為: %f, %f, %f, %f',h(1),h(2),h(3),h(4)) % 輸出資料;

sprintf('0,45,90,135方向上的慣性矩依次為: %f, %f, %f, %f',i(1),i(2),i(3),i(4)) % 輸出資料;

sprintf('0,45,90,135方向上的相關性依次為: %f, %f, %f, %f',c(1),c(2),c(3),c(4)) % 輸出資料;

這是我最近用過的求灰度共生矩陣及其四個引數的程式,你可以參考一下。

一幅灰度影象,矩陣為512 512,灰度級別為256,在計算

2的8次方 256,8個bit位可表示一個畫素,8bit 1位元組理論上是512 512 262144 byte 256 kb 不同格式的影象壓縮演算法不一樣,所以實際大小也不同bmp是無失真壓縮,512 512灰度圖實際大小就是256kb其它格式大小比bmp格式要小,但是會犧牲一些定的影象質量影象...

matlab灰度影象矩陣的大小問題(入門級)

灰度的數字影象中,每個畫素用一個數表示,整個影象用矩陣表示,矩陣的行數就是影象的高,矩陣的列數就是影象的寬。對於彩色影象需要三通道表示,matlab裡表示為三維矩陣,其中第三維的長度是3。imresize函式可以改變影象矩陣的尺寸,可以直觀理解為不保持寬高比的任意縮放。當然可以用擷取的方法縮小影象尺...

matlab怎麼將灰度影象轉為rgb影象

檰寶寶 按一下操作 a double m g mat2gray a figure 1 imshow g imwrite g,kkk.bmp 注意 m是灰度值矩陣.matlab 如何將彩圖轉成灰度圖 要當技術宅 需要準備的工具 電腦,matlab軟體。1 首先在matlab祝主介面輸入一下指令清屏 c...