Tamura纹理特征的matlab实现

本文介绍了一种基于六个指标(粗糙度、对比度、方向度、线性度、规则度、粗略度)的图像纹理特征分析方法,并提供了MATLAB代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事实上这篇文章并非原创,代码都是别人写的,可是在我的机子上有些地方不能run,我做了一丁点的修改,所以就把文章设置为原创了。另外,最初的参照博客已经看不到了,我看到的已经是别人转的,所以我有必要贴一下别人的链接以示尊重。

第一个链接: http://blog.sina.com.cn/s/blog_59ead5d90100gx1d.html 该文章已被加密,打不开了大笑幸亏有别人已经转载博主的文章,我的这篇文章就是从第二篇文章那里复制加修改得到的,代码整理放在CSDN博客上看起来更加美观,且亲测可直接运行。

第二个链接:http://blog.sina.com.cn/s/blog_5ae7a1de01012r03.html

对应原文为: Textural Features Corresponding to Visual Perception

下面分模块贴代码,代码是我在第二个链接的基础上稍作修改得到的,亲测可直接运行,没有任何问题。

第一个指标 Coarseness,粗糙度

%调用举例:
%image=rgb2gray(imread('example.jpg'));
%f=coarseness(image,5)
function Fcrs = coarseness( graypic,kmax )%graphic为待处理的灰度图像,2^kmax为最大窗口
[h,w]=size(graypic); %获取图片大小
A=zeros(h,w,2^kmax); %平均灰度值矩阵A
%计算有效可计算范围内每个点的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);
end
第二个指标 Contrast,对比度
%调用举例:
%注意这个函数因为涉及到方差,要求输入类型为double,因此我这里在源代码上做了适当的修改
%image=rgb2gray(imread('example.jpg'));
%f=contrast(image)
function Fcon=contrast(graypic) %graypic为待处理的灰度图片
graypic=double(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)); %对比度
end
第三个指标 Directionality,方向度
%调用举例:
%image=rgb2gray(imread('example.jpg'));
%[Fdir,sita]=directionality(image)

%sita为各像素点的角度矩阵,在线性度中会用到,所以这里作为结果返回
function [Fdir,sita]=directionality(graypic)
[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)<((2*(k-1)+1)*pi/2/n) && MG(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
end
第四个指标 Linelikeness,线性度
%调用举例:
%image=rgb2gray(imread('example.jpg'));
%Flin=linelikeness(image,sita,4) %sita为directionality.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*(m1-1)+1)*pi/2/n)) && (sita(i+d,j)>=(2*(m2-1)*pi/2/n) && sita(i+d,j)<((2*(m2-1)+1)*pi/2/n))
                    PDd1(m1,m2)=PDd1(m1,m2)+1;
                end
                %上方向
                if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)<((2*(m1-1)+1)*pi/2/n)) && (sita(i-d,j)>=(2*(m2-1)*pi/2/n) && sita(i-d,j)<((2*(m2-1)+1)*pi/2/n))
                    PDd2(m1,m2)=PDd2(m1,m2)+1;
                end
                %右方向
                if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)<((2*(m1-1)+1)*pi/2/n)) && (sita(i,j+d)>=(2*(m2-1)*pi/2/n) && sita(i,j+d)<((2*(m2-1)+1)*pi/2/n))
                    PDd3(m1,m2)=PDd3(m1,m2)+1;
                end
                %左方向
                if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)<((2*(m1-1)+1)*pi/2/n)) && (sita(i,j-d)>=(2*(m2-1)*pi/2/n) && sita(i,j-d)<((2*(m2-1)+1)*pi/2/n))
                    PDd4(m1,m2)=PDd4(m1,m2)+1;
                end
                %右下方向
                if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)<((2*(m1-1)+1)*pi/2/n)) && (sita(i+d,j+d)>=(2*(m2-1)*pi/2/n) && sita(i+d,j+d)<((2*(m2-1)+1)*pi/2/n))
                    PDd5(m1,m2)=PDd5(m1,m2)+1;
                end
                %右上方向
                if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)<((2*(m1-1)+1)*pi/2/n)) && (sita(i-d,j+d)>=(2*(m2-1)*pi/2/n) && sita(i-d,j+d)<((2*(m2-1)+1)*pi/2/n))
                    PDd6(m1,m2)=PDd6(m1,m2)+1;
                end
                %左下方向
                if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)<((2*(m1-1)+1)*pi/2/n)) && (sita(i+d,j-d)>=(2*(m2-1)*pi/2/n) && sita(i+d,j-d)<((2*(m2-1)+1)*pi/2/n))
                    PDd7(m1,m2)=PDd7(m1,m2)+1;
                end
                %左上方向
                if (sita(i,j)>=(2*(m1-1)*pi/2/n) && sita(i,j)<((2*(m1-1)+1)*pi/2/n)) && (sita(i-d,j-d)>=(2*(m2-1)*pi/2/n) && sita(i-d,j-d)<((2*(m2-1)+1)*pi/2/n))
                    PDd8(m1,m2)=PDd8(m1,m2)+1;
                end
            end
        end
    end
end
f=zeros(1,8);
g=zeros(1,8);
for i=1:n
    for j=1:n
        f(1)=f(1)+PDd1(i,j)*cos((i-j)*2*pi/n);
        g(1)=g(1)+PDd1(i,j);
        f(2)=f(2)+PDd2(i,j)*cos((i-j)*2*pi/n);
        g(2)=g(2)+PDd2(i,j);
        f(3)=f(3)+PDd3(i,j)*cos((i-j)*2*pi/n);
        g(3)=g(3)+PDd3(i,j);
        f(4)=f(4)+PDd4(i,j)*cos((i-j)*2*pi/n);
        g(4)=g(4)+PDd4(i,j);
        f(5)=f(5)+PDd5(i,j)*cos((i-j)*2*pi/n);
        g(5)=g(5)+PDd5(i,j);
        f(6)=f(6)+PDd6(i,j)*cos((i-j)*2*pi/n);
        g(6)=g(6)+PDd6(i,j);
        f(7)=f(7)+PDd7(i,j)*cos((i-j)*2*pi/n);
        g(7)=g(7)+PDd7(i,j);
        f(8)=f(8)+PDd8(i,j)*cos((i-j)*2*pi/n);
        g(8)=g(4)+PDd8(i,j);
    end
end
tempM=f./g;
Flin=max(tempM);%取8个方向的线性度最大值作为图片的线性度
end
第五个指标 Regularity,规则度
%调用举例:
%image=rgb2gray(imread('example.jpg'));
%Freg=regularity(image,64)
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;
end

第六个指标 Roughness,粗略度

%粗略度
Frgh=Fcrs+Fcon;
这篇文章我读的很费劲,感觉很多地方其实并没有多么明白,只是希望拿这几个指标作为图像纹理“好坏”的衡标准,为调参过程提供依据,仅此而已。

有问题可发邮件至 jzwangATbjtuDOTeduDOTcn 讨论交流。注:代码非我所写,我只做丁点修改使之可在我的机器上顺利运行。向原作致谢,如有侵权马上删掉!






### Tamura纹理特征 MATLAB 实现代码示例 Tamura纹理特征是一种经典的纹理描述方法,主要通过计算图像的六种特性来表征其纹理属性。这些特性包括粗糙度、对比度、方向性、线性相似性、规则性和粗略度[^1]。以下是基于MATLAB实现Tamura纹理特征提取的一个简单示例: #### MATLAB代码实现 ```matlab function tamuraFeatures = extractTamuraFeatures(imagePath) % 加载灰度图像 img = imread(imagePath); if size(img, 3) == 3 img = rgb2gray(img); % 如果是彩色图像则转换为灰度图像 end % 计算梯度幅值和角度 [gradMag, gradDir] = imgradient(double(img)); % 归一化梯度幅值到0-1范围 gradMag = double(gradMag) / max(max(gradMag)); % 定义窗口大小(通常取较大的窗口以平滑噪声) windowSize = 9; % 初始化特征矩阵 roughnessMap = zeros(size(img)); contrastMap = zeros(size(img)); directionalityMap = zeros(size(img)); lineLikenessMap = zeros(size(img)); regularityMap = zeros(size(img)); coarsenessMap = zeros(size(img)); % 遍历图像并计算局部区域内的Tamura特征 for i = floor(windowSize/2)+1:size(img,1)-floor(windowSize/2) for j = floor(windowSize/2)+1:size(img,2)-floor(windowSize/2) % 提取当前窗口内的像素 winGradMag = gradMag(i-floor(windowSize/2):i+floor(windowSize/2), ... j-floor(windowSize/2):j+floor(windowSize/2)); winGradDir = gradDir(i-floor(windowSize/2):i+floor(windowSize/2), ... j-floor(windowSize/2):j+floor(windowSize/2)); % 粗糙度 (Roughness) meanVal = mean(winGradMag(:)); stdDev = std(winGradMag(:)); roughnessMap(i,j) = meanVal + stdDev; % 对比度 (Contrast) contrastMap(i,j) = sum(abs(diff(sort(winGradMag(:))))); % 方向性 (Directionality) histCounts = histogram(winGradDir(:), 0:pi/8:pi, 'Normalization', 'probability'); directionalityMap(i,j) = -sum(histCounts.Values .* log(histCounts.Values + eps)); % 线性相似性 (Line Likeness) lineLikenessMap(i,j) = exp(-stdDev^2); % 规则性 (Regularity) regularityMap(i,j) = var(winGradMag(:)) / meanVal; % 粗略度 (Coarseness) coarsenessMap(i,j) = min(sum(winGradMag(:))); end end % 将所有特征组合成一个特征向量 tamuraFeatures.Roughness = mean(roughnessMap(:)); tamuraFeatures.Contrast = mean(contrastMap(:)); tamuraFeatures.Directionality = mean(directionalityMap(:)); tamuraFeatures.LineLikeness = mean(lineLikenessMap(:)); tamuraFeatures.Regularity = mean(regularityMap(:)); tamuraFeatures.Coarseness = mean(coarsenessMap(:)); end ``` 此函数`extractTamuraFeatures`接受一张图像路径作为输入,并返回包含六个Tamara特征的结构体。 --- ### 关键点说明 1. **粗糙度(Roughness)** 粗糙度定义为梯度幅度均值与标准差之和,反映了图像表面的不平整程度^。 2. **对比度(Contrast)** 对比度衡量了图像中不同亮度级别的变化情况,可以通过排序后的梯度幅度绝对差值总和来近似估计[^1]^。 3. **方向性(Directionality)** 方向性表示纹理的方向分布特性,这里使用直方图概率密度函数的负熵进行量化[^1]^。 4. **线性相似性(Line Likeness)** 线性相似性反映了一组平行线条的存在可能性,可通过指数衰减的标准差平方项建模^。 5. **规则性(Regularity)** 规则性评估了纹理单元之间的均匀性,具体表现为梯度幅度的变化率相对于平均值的比例关系[^1]^。 6. **粗略度(Coarseness)** 粗略度刻画了纹理的空间尺度信息,一般对应于最小梯度响应强度的位置^。 --- ###
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值