当前位置:首页 > 代码 > 正文

灰度共生矩阵提取纹理matlab代码(matlab灰度共生矩阵纹理特征提取)

admin 发布:2022-12-19 16:55 261


今天给各位分享灰度共生矩阵提取纹理matlab代码的知识,其中也会对matlab灰度共生矩阵纹理特征提取进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何在MATLAB下利用灰度共生矩阵提取分析遥感影像的纹理特征

1.图像分块(纹理不可能存在于一个点里),用graycomatrix得到每块的共生矩阵

2.用graycoprops得到该共生矩阵的相应特征,为Contrast Correlation Energy Homogeneity

如:

g=graycoprops(graycomatrix(C{i,j},'offset',[0 D; -D D; -D 0; -D -D]));

pg=[g.Contrast g.Correlation g.Energy g.Homogeneity];

怎样用matlab提取图像的纹理特征?

其实学数字图像处理,关键的不是源代码(和一般编程还是有区别的,这个是经验之谈,其实一般博导未必会编程,但是你和他说说你的方法,他一般都能切中要害),而是你能理解基于概念及适用场所。\x0d\x0a基于颜色、纹理、形状都属于低层特征,这些你理解就够了,关键是对你的课题适合哪种方法来映射到高层语义上面,例如:识别物体轮廓,那可能形状就比较适合等。\x0d\x0a我之所以写上面那段话,主要是我感觉你索取代码也不说明具体要求,也就是方向不明确。\x0d\x0a如今颜色特征提取算法有很多,诸如颜色直方图、颜色矩、颜色集、颜色聚合向量、颜色相关图等,既然你没说,我就给个IEEECSVT2001的一篇关于颜色直方图法的论文(源码版权归作者所有):\x0d\x0afunctioncolorhist=colorhist(rgb)\x0d\x0a%CBIR_colorhist()---colorhistogramcalculation\x0d\x0a%input:MxNx3imagedata,inRGB\x0d\x0a%output:1x256colorhistogram==(HxSxV=16x4x4)\x0d\x0a%astheMPEG-7genericcolorhistogramdescriptor\x0d\x0a%[Ref]Manjunath,B.S.;Ohm,J.-R.;Vasudevan,V.V.;Yamada,A.,"Colorandtexturedescriptors"\x0d\x0a%IEEETrans.CSVT,Volume:11Issue:6,Page(s):703-715,June2001(sectionIII.B)\x0d\x0a%checkinput\x0d\x0aifsize(rgb,3)~=3\x0d\x0aerror('3componentsisneededforhistogram');\x0d\x0aend\x0d\x0a%globals\x0d\x0aH_BITS=4;S_BITS=2;V_BITS=2;\x0d\x0a%rgb2hsv可用rgb2hsi代替,见你以前的提问。\x0d\x0ahsv=uint8(255*rgb2hsv(rgb));\x0d\x0a\x0d\x0aimgsize=size(hsv);\x0d\x0a%getridofirrelevantboundaries\x0d\x0ai0=round(0.05*imgsize(1));i1=round(0.95*imgsize(1));\x0d\x0aj0=round(0.05*imgsize(2));j1=round(0.95*imgsize(2));\x0d\x0ahsv=hsv(i0:i1,j0:j1,:);\x0d\x0a\x0d\x0a%histogram\x0d\x0afori=1:2^H_BITS\x0d\x0aforj=1:2^S_BITS\x0d\x0afork=1:2^V_BITS\x0d\x0acolorhist(i,j,k)=sum(sum(...\x0d\x0abitshift(hsv(:,:,1),-(8-H_BITS))==i-1...\x0d\x0abitshift(hsv(:,:,2),-(8-S_BITS))==j-1...\x0d\x0abitshift(hsv(:,:,3),-(8-V_BITS))==k-1));\x0d\x0aend\x0d\x0aend\x0d\x0aend\x0d\x0acolorhist=reshape(colorhist,1,2^(H_BITS+S_BITS+V_BITS));\x0d\x0a%normalize\x0d\x0acolorhist=colorhist/sum(colorhist);\x0d\x0a\x0d\x0a%基于纹理特征提取灰度共生矩阵用于纹理判断\x0d\x0a%Calculatescooccurrencematrix\x0d\x0a%foragivendirectionanddistance\x0d\x0a%\x0d\x0a%out=cooccurrence(input,dir,dist,symmetric);\x0d\x0a%\x0d\x0a%INPUT:\x0d\x0a%input:inputmatrixofanysize\x0d\x0a%\x0d\x0a%dir:directionofevaluation\x0d\x0a%"dir"valueAngle\x0d\x0a%00\x0d\x0a%1-45\x0d\x0a%2-90\x0d\x0a%3-135\x0d\x0a%4-180\x0d\x0a%5+135\x0d\x0a%6+90\x0d\x0a%7+45\x0d\x0a%\x0d\x0a%dist:distancebetweenpixels\x0d\x0a%\x0d\x0a%symmetric:1forsymmetricversion\x0d\x0a%0fornon-symmetricversion\x0d\x0a%\x0d\x0a%eg:out=cooccurrence(input,0,1,1);\x0d\x0a%Author:BaranAydogan(15.07.2006)\x0d\x0a%RGI,TampereUniversityofTechnology\x0d\x0a%baran.aydogan@tut.fi\x0d\x0a\x0d\x0afunctionout=cooccurrence(input,dir,dist,symmetric);\x0d\x0a\x0d\x0ainput=round(input);\x0d\x0a[rc]=size(input);\x0d\x0a\x0d\x0amin_intensity=min(min(input));\x0d\x0amax_intensity=max(max(input));\x0d\x0a\x0d\x0aout=zeros(max_intensity-min_intensity+1);\x0d\x0aif(dir==0)\x0d\x0adir_x=0;dir_y=1;\x0d\x0aend\x0d\x0a\x0d\x0aif(dir==1)\x0d\x0adir_x=1;dir_y=1;\x0d\x0aend\x0d\x0a\x0d\x0aif(dir==2)\x0d\x0adir_x=1;dir_y=0;\x0d\x0aend\x0d\x0a\x0d\x0aif(dir==3)\x0d\x0adir_x=1;dir_y=-1;\x0d\x0aend\x0d\x0a\x0d\x0aif(dir==4)\x0d\x0adir_x=0;dir_y=-1;\x0d\x0aend\x0d\x0a\x0d\x0aif(dir==5)\x0d\x0adir_x=-1;dir_y=-1;\x0d\x0aend\x0d\x0a\x0d\x0aif(dir==6)\x0d\x0adir_x=-1;dir_y=0;\x0d\x0aend\x0d\x0a\x0d\x0aif(dir==7)\x0d\x0adir_x=-1;dir_y=1;\x0d\x0aend\x0d\x0a\x0d\x0adir_x=dir_x*dist;\x0d\x0adir_y=dir_y*dist;\x0d\x0a\x0d\x0aout_ind_x=0;\x0d\x0aout_ind_y=0;\x0d\x0a\x0d\x0aforintensity1=min_intensity:max_intensity\x0d\x0aout_ind_x=out_ind_x+1;\x0d\x0aout_ind_y=0;\x0d\x0a\x0d\x0a[ind_x1ind_y1]=find(input==intensity1);\x0d\x0aind_x1=ind_x1+dir_x;\x0d\x0aind_y1=ind_y1+dir_y;\x0d\x0a\x0d\x0aforintensity2=min_intensity:max_intensity\x0d\x0aout_ind_y=out_ind_y+1;\x0d\x0a\x0d\x0a[ind_x2ind_y2]=find(input==intensity2);\x0d\x0a\x0d\x0acount=0;\x0d\x0a\x0d\x0afori=1:size(ind_x1,1)\x0d\x0aforj=1:size(ind_x2,1)\x0d\x0aif((ind_x1(i)==ind_x2(j))(ind_y1(i)==ind_y2(j)))\x0d\x0acount=count+1;\x0d\x0aend\x0d\x0aend\x0d\x0aend\x0d\x0a\x0d\x0aout(out_ind_x,out_ind_y)=count;\x0d\x0a\x0d\x0aend\x0d\x0aend\x0d\x0a\x0d\x0aif(symmetric)\x0d\x0a\x0d\x0aif(dir

回答于 2022-11-14

向TA提问

官方服务

官方网站

官方网站

在matlab中如何实现图像灰度共生矩阵?

closeall\x0d\x0aclearall\x0d\x0aclc;\x0d\x0aI=imread('F:\图像变化检测\image\Textureimage(3.27)\texture5.tif');\x0d\x0a%I=rgb2gray(I);%%iftheinputimageisRGBform.\x0d\x0a%I=I(1:128,1:128);%%deriveasmallonejustfordemo\x0d\x0aI=im2double(I);\x0d\x0aw=15;\x0d\x0aI1=wextend('2D','sym',I,(w-1)/2);%I=wextend('2D','sys',I,[w/2-1/2,w/2-1/2]);thisisusedforoddsizewindow%扫描窗口的大小15*15,为之后程序方便找中心点可以将窗口设置成4*4-32*32之间的任何奇数窗口\x0d\x0a%\x0d\x0a%s=4;%thisvariableisusedforsettingtherangeofthedistancebetweeniandj,rememberdon'tsetsatoobignum.\x0d\x0a%A=zeros(s,1);\x0d\x0a%B=(1:s)';\x0d\x0a%offsets1=[AB;-BB;-BA;-B-B];%%setsthedirectionsanddistancewithinthepexiliandj\x0d\x0a%\x0d\x0aoffsets1=[01];%水平单步\x0d\x0a%\x0d\x0a[m,n]=size(I1);\x0d\x0aI11=zeros(m,n);%定义5个矩阵用于存放由graycomatrix产生的5个参数\x0d\x0aI12=zeros(m,n);%这样就能够再执行完一次操作后,利用得到的各种特征参数矩阵分别去聚类分割\x0d\x0aI13=zeros(m,n);%这样总的耗时短,不用每次都重新执行扫描窗口和共生矩阵来产生特征参数(这个最耗费时间)\x0d\x0aI14=zeros(m,n);\x0d\x0aI15=zeros(m,n);\x0d\x0afori=(w+1)/2:m-(w-1)/2\x0d\x0aforj=(w+1)/2:n-(w-1)/2\x0d\x0aW=zeros();\x0d\x0aW=I1(i-(w-1)/2:i+(w-1)/2,j-(w-1)/2:j+(w-1)/2);\x0d\x0a[glcms,SI]=graycomatrix(W,'NumLevels',8,'G',[],'offset',offsets1);\x0d\x0astats=graycoprops(glcms,'all');\x0d\x0aCon=[stats.Contrast];\x0d\x0aH=[stats.Homogeneity];\x0d\x0aCor=[stats.Correlation];\x0d\x0aEe=[stats.Energy];\x0d\x0a\x0d\x0aeigenvalue=mean(Con);\x0d\x0aI11(i,j)=eigenvalue;\x0d\x0aI12(i,j)=mean(H);\x0d\x0aI13(i,j)=mean(Cor);\x0d\x0aI14(i,j)=mean(Ee);\x0d\x0aI15(i,j)=mean(En);\x0d\x0aend\x0d\x0aend\x0d\x0a%\x0d\x0aI2=I15((w+1)/2:m-(w-1)/2,(w+1)/2:n-(w-1)/2);%%得到原始图像\x0d\x0ama=max(I2(:));\x0d\x0ami=min(I2(:));\x0d\x0aI3=(I2-mi)/(ma-mi);%%归一化\x0d\x0aI3=im2double(I3);

图像 灰度共生矩阵怎么在matlab中实现,要具体源程序

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。

matlab里用灰度共生矩阵求纹理特征的问题!!

给你个程序吧

%灰度共生矩阵纹理特征提取

%提取了三个特征参数。f1为角二阶矩,f2为相关度,f3为熵

clc

clear all

tu=imread('稻.bmp');

IN=rgb2gray(tu); %灰度化

g=256;

[R,C]=size(IN);

p1=zeros(g); %计算共生矩阵

for M=1:R

for N=1:(C-1)

p1(IN(M,N)+1,IN(M,N+1)+1)= p1(IN(M,N)+1,IN(M,N+1)+1)+1;

p1(IN(M,N+1)+1,IN(M,N)+1)= p1(IN(M,N+1)+1,IN(M,N)+1)+1;

end

end

p2=double(p1)/(M*N); %归一化

%计算角二阶矩 f1

f1=p2.^2;

f1=sum(f1(:))

% 计算相关度 f2

colour=0:(g-1);

m1=sum(p2)*colour(:);

m2=m1;

pp=sum(p2);

v1=((colour-m1).^2)*pp(:);

v2=v1;

[m,n]=meshgrid(colour,colour);

pp=m.*n.*p2;

f2=(sum(pp(:))-m1*m2)/(v1+eps)*(v2+eps)

%计算墒 f3

pp=(p2.*log2(p2+eps));

f3=-sum(pp(:))

纹理特征提取方法:LBP, 灰度共生矩阵

搬运自本人 CSDN 博客: 《纹理特征提取方法:LBP, 灰度共生矩阵》

注:本文中大量行内 Latex 公式在中不支持,如果想要仔细参阅,请移步上面的 CSDN 博客链接。

在前面的博文 《图像纹理特征总体简述》 中,笔者总结了图像纹理特征及其分类。在这里笔者对其中两种算法介绍并总结。

参考网址:

《纹理特征提取》

《【纹理特征】LBP 》

《灰度共生矩阵(GLCM)理解》

《灰度共生矩阵的理解》

《图像的纹理特征之灰度共生矩阵 》

参考论文:

《基于灰度共生矩阵提取纹理特征图像的研究》——冯建辉

《灰度共生矩阵纹理特征提取的Matlab实现》——焦蓬蓬

LBP方法(Local binary patterns, 局部二值模式)是一种用来描述图像局部纹理特征的算子;它的作用是进行特征提取,提取图像的局部纹理特征。

LBP是一个计算机视觉中用于图像特征分类的一个方法,用于纹理特征提取。后来LBP方法与HOG特征分类器与其他机器学习算法联合使用。

LBP算法的核心思想,是以某个像素点为中心,与其邻域像素点共同计算。关于邻域像素点的选择方法,其实并不唯一:

这里选择环形邻域的方法进行说明:

窗口中心的像素点作为中心,该像素点的像素值作为阈值。然后将周围8个像素点的灰度值与该阈值进行比较,若周围某像素值大于中心像素值,则该像素点位置被标记为1;反之,该像素点标记为0。

如此这样,该窗口的8个点可以产生8位的无符号数,这样就得到了该窗口的LBP值,该值反应了该窗口的纹理信息。如下图所示:

图中,中心像素点的像素值作为阈值,其值v = 3;周围邻域8个像素值中,有3个比阈值小的像素点置0,5个比阈值大的像素点置1。

LBP算法的计算公式如下:

$$ LBP_{P, R}(x_{c},y_{c}) = \sum_{p=0}^{P-1}s(g_{p} - g_{c})2^p, s(x)=\left{\begin{matrix}1 : x \geq 0 \ 0 : x \leq 0 \end{matrix}\right. $$

LBP纹理特征向量,一般以图像分块LBP直方图表示。具体步骤如下:

得到了整幅图像的LBP纹理特征后,便可以利用SVM或者其他机器学习算法进行分类了。

这两天笔者将会对源码进行测试封装,以后会上传到我的GitHub网站上。

灰度共生矩阵法(GLCM, Gray-level co-occurrence matrix),就是通过计算灰度图像得到它的共生矩阵,然后透过计算该共生矩阵得到矩阵的部分特征值,来分别代表图像的某些纹理特征(纹理的定义仍是难点)。灰度共生矩阵能反映图像灰度关于font color = red 方向、相邻间隔、变化幅度等 /font综合信息,它是分析图像的局部模式和它们排列规则的基础。

对于灰度共生矩阵的理解,需要明确几个概念:方向,偏移量和灰度共生矩阵的阶数。

计算纹理特征第一步,就是将多通道的图像(一般指RGB图像)转换为灰度图像,分别提取出多个通道的灰度图像。

纹理特征是一种结构特征,使用不同通道图像得到的纹理特征都是一样的,所以可以任意选择其一。

一般在一幅图像中的灰度级有256级,从0--255。但在计算灰度共生矩阵时我们并不需要256个灰度级,且计算量实在太大,所以一般分为8个灰度级或16个灰度级。

而且当分成8个灰度级时,如果直接将像素点的灰度值除以32取整,会引起影像清晰度降低,所以进行灰度级压缩时,首先我们会将图片进行直方图均衡化处理,增加灰度值的动态范围,这样就增加了影像的整体对比效果。

注:笔者后文中的例子中,为了简要说明,所以灰度等级简单设置为4。

计算特征值前,先选择计算过程中的一些参数:

下面分部且适当的使用一些例子说明计算过程:

为了达到简单说明计算纹理特征值的目的,笔者此处做简要的假设:灰度被分为4阶,灰度阶从0--3;窗口大小为6 × 6;

窗口A的灰度矩阵A如下:

窗口B的灰度矩阵B如下:

此处以左上角元素为坐标原点,原点记为(1, 1);以此为基础举例,第四行第二列的点记为(4, 2);

情景1:d = 1,求0°方向矩阵A的共生矩阵:

则按照0°方向(即水平方向 从左向右,从右向左两个方向 ),统计矩阵值(1, 2),则如下图所示:

$$

P_{A}(d=1, \theta =0^o)=\begin{vmatrix}

0 8 0 7 \

8 0 8 0 \

0 8 0 7 \

7 0 7 0

\end{vmatrix}

$$

情景2:d = 1,求45°方向矩阵A的共生矩阵:

按照情景1,同理可得此时的统计矩阵结果如下:

$$

P_{A}(d=1, \theta =45^o)=\begin{vmatrix}

12 0 0 0 \

0 14 0 0 \

0 0 12 0 \

0 0 0 12

\end{vmatrix}

$$

情景3:d = 1,求0°与45°方向矩阵B的共生矩阵:

与前面同理,可以得到矩阵B的统计及矩阵结果如下:

$$

P_{B}(d=1, \theta =0^o)=\begin{vmatrix}

24 4 0 0 \

4 8 0 0 \

0 0 12 2 \

0 0 2 4

\end{vmatrix}

$$

$$

P_{B}(d=1, \theta =45^o)=\begin{vmatrix}

18 3 3 0 \

3 6 1 1 \

3 1 6 1 \

0 1 1 2

\end{vmatrix}

$$

矩阵A, B的其余90°、135°矩阵与上面同理,所以笔者偷懒略去。

这样,我们就已经计算得到了单个窗口的灰度共生矩阵的各个方向的矩阵,下面就要用刚才算出的矩阵计算灰度共生矩阵特征值。

用P表示灰度共生矩阵的归一化频率矩阵,其中i, j表示按照某方向同时出现于两个像素的某两个级别的灰度值,所以P(i, j)表示满足这种情况的两个像素出现的概率。

以上述情景2中的矩阵为例:

原矩阵为:

$$

P(d=1, \theta =45^o)=\begin{vmatrix}

12 0 0 0 \

0 14 0 0 \

0 0 12 0 \

0 0 0 12

\end{vmatrix}

$$

归一化后,矩阵形式变为:

$$

P(d=1, \theta =45^o)=\begin{vmatrix}

12/50 0 0 0 \

0 14/50 0 0 \

0 0 12/50 0 \

0 0 0 12/50

\end{vmatrix}

$$

灰度共生矩阵理论的前辈Haralick等人用灰度共生矩阵提出了14中特征值,但由于灰度共生矩阵的计算量很大,所以为了简便,我们一般采用四个最常用的特征来提取图像的纹理特征:font color=red 能量、对比度、相关度、熵 /font。

$ ASM = \sum_{i} \sum_{j}P(i, j)^2 $

能量是灰度共生矩阵各元素的平方和,又被称角二阶距。它是图像纹理灰度变化均一的度量,反映了图像灰度分布均匀程度和纹理粗细程度。

$ CON = \sum_{i} \sum_{j} (i-j)^2 P(i,j) $

对比度是灰度共生矩阵主对角线附近的惯性矩,它体现矩阵的值如何分布,反映了图像的清晰度和纹理沟纹的深浅。

$ CORRLN = [\sum_{i} \sum_{j}((ij)P(i,j)) - \mu_{x} \mu_{y}]/ \sigma_{x} \sigma_{y} $

相关度体现了空间灰度共生矩阵元素在行或列方向上的相似程度,反映了图像局部灰度相关性。

$ ENT = - \sum_{i} \sum_{j} P(i,j) \log P(i,j) $

熵体现了图像纹理的随机性。若共生矩阵中所有值都相等,取得最大值;若共生矩阵中的值不均匀,则其值会变得很小。

求出该灰度共生矩阵各个方向的特征值后,再对这些特征值进行均值和方差的计算,这样处理就消除了方向分量对纹理特征的影响。

一个滑动窗口计算结束后,该窗口就可以移动一个像素点,形成另一个小窗口图像,重复进行上一步的计算,生成新窗口图像的共生矩阵和纹理特征值;

以此类推,滑动窗口遍历完所有的图像像素点后,整个图像就形成了一个由纹理特征值构成的一个纹理特征值矩阵。

之后,就可以将这个纹理特征值矩阵转换成纹理特征图像。

笔者已经对源码进行测试了封装,并上传到了笔者的GitHub网站上。

GitHub:

灰度共生矩阵提取纹理matlab代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于matlab灰度共生矩阵纹理特征提取、灰度共生矩阵提取纹理matlab代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/14311.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载