coarseness.m
%graypic为待处理的灰度图片,2^kmax为最大窗口 function Fcrs=coarseness(graypic,kmax) %获取图片大小 [h,w]=size(graypic); %平均灰度值矩阵A A=zeros(h,w,2^kmax); %计算有效可计算范围内每个点的2^k邻域内的平均灰度值 for i=2^(kmax-1)+1:h-2^(kmax-1) for j=2^(kmax-1)+1:w-2^(kmax-1) for k=1:kmax A(i,j,k)=mean2(graypic(i-2^(k-1):i+2^(k-1)-1,j-2^(k-1):j+2^(k-1)-1)); end end end %对每个像素点,计算在水平和垂直方向上不重叠窗口之间的Ak差 for i=1+2^(kmax-1):h-2^(kmax-1) for j=1+2^(kmax-1):w-2^(kmax-1) for k=1:kmax Eh(i,j,k)=abs(A(i+2^(k-1),j,k)-A(i-2^(k-1),j)); Ev(i,j,k)=abs(A(i,j+2^(k-1),k)-A(i,j-2^(k-1))); end end end
%对每个像素点计算使E达到最大值的k for i=2^(kmax-1)+1:h-2^(kmax-1) for j=2^(kmax-1)+1:w-2^(kmax-1) [maxEh,p]=max(Eh(i,j,:)); [maxEv,q]=max(Ev(i,j,:)); if maxEh>maxEv maxkk=p; else maxkk=q; end Sbest(i,j)=2^maxkk; %每个像素点的最优窗口大小为2^maxkk end end
%所有Sbest的均值作为整幅图片的粗糙度 Fcrs=mean2(Sbest);
调用:
image=rgb2gray(imread('example.jpg')); f=coarseness(image,5)
Tamura纹理特征的matlab实现(二)---对比度 (2010-01-13 21:40:27) TE
Tamura纹理特征之对比度(contrast),公式如下:
n一般取1/4。
contrast.m
%graypic为待处理的灰度图片 function Fcon=contrast(graypic) %二维向量一维化 x=graypic(:); %四阶矩 M4=mean((x-mean(x))^4); %方差 delta2=var(x,1); %峰度 alfa4=M4/(delta2^2); %标准差 delta=std(x,1); %对比度 Fcon=delta/(alfa4^(1/4));
调用:
image=rgb2gray(imread('example.jpg')); f=contrast(image)
Tamura纹理特征的matlab实现(三)---方向度 (2010-01-14 20:52:56) TE
directionality.m
function [Fdir,sita]=directionality(graypic) %sita为各像素点的角度矩阵,在线性度中会用到,所以这里作为结果返回 [h w]=size(graypic); %两个方向的卷积矩阵 GradientH=[-1 0 1 -1 0 1 -1 0 1]; GradientV=[ 1 1 1 0 0 0 -1 -1 -1]; %卷积,取有效结果矩阵 MHconv=conv2(graypic,GradientH); MH=MHconv(3:h,3:w); MVconv=conv2(graypic,GradientV); MV=MVconv(3:h,3:w) %向量模 MG=(abs(MH)+abs(MV))./2; %有效矩阵大小 validH=h-2; validW=w-2 %各像素点的方向 for i=1:validH for j=1:validW sita(i,j)=atan(MV(i,j)/MH(i,j))+(pi/2); end end
n=16; t=12; Nsita=zeros(1,n); %构造方向的统计直方图 for i=1:validH for j=1:validW for k=1:n if sita(i,j)>=(2*(k-1)*pi/2/n) && sita(i,j)=t Nsita(k)=Nsita(k)+1; end end end end for k=1:n HD(k)=Nsita(k)/sum(Nsita(:)); end %假设每幅图片只有一个方向峰值,为计算方便简化了原著 [maxvalue,FIp]=max(HD); Fdir=0; for k=1:n Fdir=Fdir+(k-FIp)^2*HD(k);%公式与原著有改动 end
调用:
image=rgb2gray(imread('example.jpg'));
[Fdir,sita]=directionality(image)
Tamura纹理特征的matlab实现(四)---线性度 (2010-01-14 21:01:04) TE
linelikeness.m
function Flin=linelikeness(graypic,sita,d) %d为共生矩阵计算时的像素间隔距离 n=16; [h,w]=size(graypic); %构造方向共生矩阵 PDd1=zeros(n,n); PDd2=zeros(n,n); PDd3=zeros(n,n); PDd4=zeros(n,n); PDd5=zeros(n,n); PDd6=zeros(n,n); PDd7=zeros(n,n); PDd8=zeros(n,n); for i=d+1:h-d-2 for j=d+1:w-d-2 for m1=1:n for m2=1:n %下方向 if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i+d,j)=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i-d,j)=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i,j+d)=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i,j-d)=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i+d,j+d)=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i-d,j+d)=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i+d,j-d)=(2*(m1-1)*pi/2/n) && sita(i,j)=(2*(m2-1)*pi/2/n) && sita(i-d,j-d)
调用:
image=rgb2gray(imread('example.jpg'));
Flin=linelikeness(image,sita,4) %sita为directionality.m返回的结果
Tamura纹理特征的matlab实现(五)---规则度 (2010-01-14 21:04:09) TE
regularity.m
function Freg=regularity(graypic,windowsize) %windowsize为计算规则度的子窗口大小 [h,w]=size(graypic); k=0; for i=1:windowsize:h-windowsize for j=1:windowsize:w-windowsize k=k+1; crs(k)=coarseness(graypic(i:i+windowsize-1,j:j+windowsize-1),5); %粗糙度 con(k)=contrast(graypic(i:i+windowsize-1,j:j+windowsize-1)); %对比度 [dire(k),sita]=directionality(graypic(i:i+windowsize-1,j:j+windowsize-1));%方向度 lin=linelikeness(graypic(i:i+windowsize-1,j:j+windowsize-1),sita,4)*10; %线性度,*10与crs、con、dire同量级化 end end %求上述各参数的标准差 Dcrs=std(crs,1); Dcon=std(con,1); Ddir=std(dire,1); Dlin=std(lin,1); %规则度 Freg=1-(Dcrs+Dcon+Ddir+Dlin)/4/100;
调用:
image=rgb2gray(imread('example.jpg'));
Freg=regularity(image,64)
Tamura纹理特征的matlab实现(六)---粗略度 (2010-01-14 21:11:07) TE
粗略度计算比较简单,是粗糙度和对比度两个属性的合成:
Frgh=Fcrs+Fcon
至此Tamura纹理特征的六个属性终于实现了,工作了一天半,好辛苦。属于经典算法,并没有创新性,所以还要在此基础上做进一步的研究和应用。