• 灰度共生矩阵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

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    Ubuntu18.04可执行文件运行提示No such file or directory
    Linux gcc(ar命令)打包库到另一个库中的另外一种方法
    干干净净的grep
    C语言里面和时间有关的函数
    Ubuntu上安装tftp服务
    因为新冠,宅家2周,折腾了一下电视盒子。
    批量处理文件的Python程序
    Windows 10中使用VirtualBox
    重采样Resample 的一些研究记录。
    微信公众号接入第三方服务器,设置自动回复、关键回复、自定义菜单,配置及开发流程
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2639446.html
Copyright © 2020-2023  润新知