灰度共生矩阵GLCM及纹理特征影像生成

灰度共生矩阵GLCM及纹理特征影像生成

  实现类似于滤波过程中的5*5窗体移动,形成子图像的过程,这里的方法边界的象元,滑动窗口元素补0:

复制代码
IDL代码
 1 Pro Texture
 2 ;针对灰度影像
 3 file=Dialog_Pickfile(Filter='*.bmp',/Must_exist)
 4 image=Read_Bmp(file)
 5 sz=size(image)
 6 m=sz[1]
 7 n=sz[2]
 8 ;影像压缩成16个灰度级
 9 dimage=uintarr(m,n)
10 for i=0,m-1 do begin
11   for j=0,n-1 do begin
12   dimage[i,j]=image[i,j] * 16 / 256
13   endfor
14 endfor
15 ;构造子影像,窗口大小5X5
16 subimage=uintarr(5,5)
17 e=0
18 for i=0,m-1 do begin
19   for j=0,n-1 do begin
20     ;填充窗口内的值
21     for k=-2,2,1 do begin
22       t=i+k
23       if t Lt 0 then begin
24           Continue
25       endif
26       if t ge m then begin
27           Break
28       Endif
29       for l=-2,2,1 do begin
30         if(j+l) lt 0 then begin
31           continue;
32         endif
33         if(j+l) lt n then begin
34           ;给子影像赋值
35           subimage[k+2,l+2]=dimage[i+k,j+l];
36         endif
37       endfor
38     endfor
39 ;   test=uintarr(5,5);
40 ;   for r=0,4 do begin
41 ;   for s=0,4 do begin
42 ;      test[r,s]=subimage[r,s]
43 ;   Endfor
44 ;   endfor
45 ;应用子影像进行计算
46 
47   endfor
48 endfor
49 TV,image,True =1
50 end
复制代码

  下面是glcm计算的第一个版本,直接用IDL编程有两个问题需要注意,一个是逻辑运算符,IDL中的>和<符号不表示比较,而是表示取大和取消,逻辑运算采用字母表示,如ge,gt等;二是两个整数相除,得到的结果仍是整数,需要将被除数类型转换。

复制代码
GLCM IDL代码
  1 Function Glcm,subImage,d
  2 sz=size(subImage)
  3 m=sz[1]
  4 n=sz[2]
  5 glcmH=lonarr(16,16)
  6 glcmEN=lonarr(16,16)
  7 glcmV=lonarr(16,16)
  8 glcmWN=lonarr(16,16)
  9 
 10 ;0度
 11 for i= 0,m-1 do begin
 12   for j=0,n-d-1 do begin
 13      glcmH[subImage[i,j],subImage[i,j+d]]=glcmH[subImage[i,j],subImage[i,j+d]]+1;%是共生矩阵0度的计算式
 14      glcmH[subImage[i,j+d],subImage[i,j]]=glcmH[subImage[i,j+d],subImage[i,j]]+1
 15   endFor
 16 endFor
 17 ;45度
 18 for ii= 0,m-d-1 do begin
 19   for jj=0,n-d-1 do begin
 20      glcmEN[subImage[ii,jj],subImage[ii+d,jj+d]]=glcmEN[subImage[ii,jj],subImage[ii+d,jj+d]]+1;%是共生矩阵45度的计算式
 21      glcmEN[subImage[ii+d,jj+d],subImage[ii,jj]]=glcmEN[subImage[ii+d,jj+d],subImage[ii,jj]]+1
 22   endFor
 23 endFor
 24 ;90度
 25 for iii= 0,m-d-1 do begin
 26   for jjj=0,n-1 do begin
 27      glcmV[subImage[iii,jjj],subImage[iii+d,jjj]]=glcmV[subImage[iii,jjj],subImage[iii+d,jjj]]+1;%是共生矩阵90度的计算式
 28      glcmV[subImage[iii+d,jjj],subImage[iii,jjj]]=glcmV[subImage[iii+d,jjj],subImage[iii,jjj]]+1
 29   endFor
 30 endFor
 31 ;135度
 32 for iiii= d,m-1 do begin
 33   for jjjj=0,n-d-1 do begin
 34      glcmWN[subImage[iiii,jjjj],subImage[iiii-d,jjjj+d]]=glcmWN[subImage[iiii,jjjj],subImage[iiii-d,jjjj+d]]+1;%是共生矩阵135度的计算式
 35      glcmWN[subImage[iiii-d,jjjj+d],subImage[iiii,jjjj]]=glcmWN[subImage[iiii-d,jjjj+d],subImage[iiii,jjjj]]+1
 36   endFor
 37 endFor
 38 ;归一化
 39 ;sumH=0L
 40 ;sumEN=0L
 41 ;sumV=0L
 42 ;sumWN=0L
 43 ;for k=0,15 do begin
 44 ;  for l=0,15 do begin
 45 ;  sumH=sumH+glcmH[k,l]
 46 ;  sumEN=sumEN+glcmEN[k,l]
 47 ;  sumV=sumV+glcmV[k,l]
 48 ;  sumWN=sumWN+glcmWN[k,l]
 49 ;  endfor
 50 ;endfor
 51 glcmHU=dblarr(16,16)
 52 glcmENU=dblarr(16,16)
 53 glcmVU=dblarr(16,16)
 54 glcmWNU=dblarr(16,16)
 55 for kk=0,15 do begin
 56   for ll=0,15 do begin
 57   glcmHU[kk,ll]=double(glcmH[kk,ll])/(2*m*(n-d))
 58   glcmENU[kk,ll]=double(glcmEN[kk,ll])/(2*(m-d)*(n-d))
 59   glcmVU[kk,ll]=double(glcmV[kk,ll])/(2*(m-d)*n)
 60   glcmWNU[kk,ll]=double(glcmWN[kk,ll])/(2*(m-d)*(n-d))
 61   endfor
 62 endfor
 63 ;求取特征值
 64 e=dblarr(4)
 65 H=dblarr(4)
 66 In=dblarr(4)
 67   Ux=dblarr(4)
 68   Uy=dblarr(4)
 69   deltaX=dblarr(4)
 70   deltaY=dblarr(4)
 71 C=dblarr(4)
 72 for i1=0,15 do begin
 73   for j1=0,15 do begin
 74   e[0]=e[0]+glcmHU[i1,j1]*glcmHU[i1,j1]
 75   e[1]=e[1]+glcmENU[i1,j1]*glcmENU[i1,j1]
 76   e[2]=e[2]+glcmVU[i1,j1]*glcmVU[i1,j1]
 77   e[3]=e[3]+glcmWNU[i1,j1]*glcmWNU[i1,j1]
 78   
 79    if glcmHU[i1,j1] ne 0 then begin
 80       H[0] = -glcmHU[i1,j1]*Alog10(glcmHU[i1,j1])+H[0]; %% 81    endif
 82    if glcmENU[i1,j1] ne 0 then begin
 83       H[1] = -glcmENU[i1,j1]*Alog10(glcmENU[i1,j1])+H[1]; %% 84    endif
 85    if glcmVU[i1,j1] ne 0 then begin
 86       H[2] = -glcmVU[i1,j1]*Alog10(glcmVU[i1,j1])+H[2]; %% 87    endif
 88    if glcmWNU[i1,j1] ne 0 then begin
 89       H[3] = -glcmWNU[i1,j1]*Alog10(glcmWNU[i1,j1])+H[3]; %% 90    endif
 91    In[0] = (i1-j1)^2*glcmHU[i1,j1]+In[0];  %%惯性矩
 92    In[1] = (i1-j1)^2*glcmENU[i1,j1]+In[1];
 93    In[2] = (i1-j1)^2*glcmVU[i1,j1]+In[2];
 94    In[3] = (i1-j1)^2*glcmWNU[i1,j1]+In[3];
 95    
 96    Ux[0] = i1*glcmHU[i1,j1]+Ux[0]; %相关性中μx
 97    Uy[0] = j1*glcmHU[i1,j1]+Uy[0]; %相关性中μy
 98    Ux[1] = i1*glcmENU[i1,j1]+Ux[1]; %相关性中μx
 99    Uy[1] = j1*glcmENU[i1,j1]+Uy[1]; %相关性中μy
100    Ux[2] = i1*glcmVU[i1,j1]+Ux[2]; %相关性中μx
101    Uy[2] = j1*glcmVU[i1,j1]+Uy[2]; %相关性中μy
102    Ux[3] = i1*glcmWNU[i1,j1]+Ux[3]; %相关性中μx
103    Uy[3] = j1*glcmWNU[i1,j1]+Uy[3]; %相关性中μy
104   endfor
105 endfor
106 for i2=0,15 do begin
107   for j2=0,15 do begin
108   deltaX[0] = (i2-Ux[0])^2*glcmHU[i2,j2]+deltaX[0]; %相关性中σx
109   deltaY[0] = (j2-Uy[0])^2*glcmHU[i2,j2]+deltaY[0]; %相关性中σy
110   C[0] = i2*j2*glcmHU[i2,j2]+C[0]; 
111   
112   deltaX[1] = (i2-Ux[1])^2*glcmENU[i2,j2]+deltaX[1]; %相关性中σx
113   deltaY[1] = (j2-Uy[1])^2*glcmENU[i2,j2]+deltaY[1]; %相关性中σy
114   C[1] = i2*j2*glcmENU[i2,j2]+C[1]; 
115   
116   deltaX[2] = (i2-Ux[2])^2*glcmVU[i2,j2]+deltaX[2]; %相关性中σx
117   deltaY[2] = (j2-Uy[2])^2*glcmVU[i2,j2]+deltaY[2]; %相关性中σy
118   C[2] = i2*j2*glcmVU[i2,j2]+C[2]; 
119   
120   deltaX[3] = (i2-Ux[3])^2*glcmWNU[i2,j2]+deltaX[3]; %相关性中σx
121   deltaY[3] = (j2-Uy[3])^2*glcmWNU[i2,j2]+deltaY[3]; %相关性中σy
122   C[3] = i2*j2*glcmWNU[i2,j2]+C[3]; 
123   endfor
124 endfor
125 C[0] = (C[0]-Ux[0]*Uy[0])/deltaX[0]/deltaY[0]; %相关性
126 C[1] = (C[1]-Ux[1]*Uy[1])/deltaX[1]/deltaY[1];
127 C[2] = (C[2]-Ux[2]*Uy[2])/deltaX[2]/deltaY[2];
128 C[3] = (C[3]-Ux[3]*Uy[3])/deltaX[3]/deltaY[3];
129 ;特征值求平均
130 feature=dblarr(4)
131 for i3=0,3 do begin
132   feature[0]=feature[0]+e[i3]
133   feature[1]=feature[1]+H[i3]
134   feature[2]=feature[2]+In[i3]
135   feature[3]=feature[3]+C[i3]
136 endfor
137 for i4=0,3 do begin
138   feature[i4]=feature[i4]/4
139 endfor
140 return,feature;返回特征值
141 end
复制代码

  该函数传入灰度图像subImage和步长参数d,调用GLCM函数的测试代码:

复制代码
 1 pro test_glcm
 2 file=Dialog_Pickfile(Filter='*.bmp',/Must_exist)
 3 image=Read_Bmp(file)
 4 sz=size(image)
 5 m=sz[1]
 6 n=sz[2]
 7 ;影像压缩成16个灰度级
 8 dimage=uintarr(m,n)
 9 textImage=uintarr(m,n)
10 for i=0,m-1 do begin
11   for j=0,n-1 do begin
12   dimage[i,j]=image[i,j] * 16 / 256
13   endfor
14 endfor
15 feature=glcm(dimage,1)
16 print,feature
17 end
复制代码

这里贴出代码,希望熟悉的朋友也帮忙验证一下,看看能否对其中的某些部分优化一下!

参考文献:

1.贾永红《数字图像处理》武汉大学出版社 P182~P184

2.http://www.cnblogs.com/skyseraph/archive/2011/08/27/2155776.html

3.http://blog.sina.com.cn/s/blog_4b700c4c0102e038.html

posted @   太一吾鱼水  阅读(2007)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示