基于人类对纹理的视觉感知的心理学的研究,Tamura等人提出了纹理特征的表达[14]。Tamura纹理特征的六个分量对应于心理学角度上纹理特征的六种属性,分别是粗糙度(coarseness)、对比度(contrast)、方向度(directionality)、 线像度(linelikeness)、规整度(regularity)和粗略度(roughness)。其中,前三个分量对于图像检索尤其重要[e.g,15]。
搜了好久也没找到Tamura纹理特征的实现代码,于是自己动手丰衣足食,找出了最原始的Tamura的论文《Textural Features Corresponding to Visual Perception》来研读。今天下午实现了粗糙度(coarseness)部分,与大家共享,有错误的地方,还望大家指正。后续的对比度(contrast)、方向度(directionality)、线性度(linelikeness)、规则度(regularity)、粗略度(roughness)会陆续实现并共享。
Tamura纹理特征要比灰度共生矩阵得到的纹理特征更直观,在视觉效果上更有优势,由于比较懒,一直避重就轻,到今天终于要直面问题了,代码如下:
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)