MATLAB特征提取代码

for i=1:26
    f=strcat('D:\bishe\',num2str(i));
    image=strcat(f,'.jpg');
    PS=imread(image);

    PS=imresize(PS,[300,300],'bilinear');%归一化大小
    PS=rgb2gray(PS);
    [m,n]=size(PS);                       %测量图像尺寸参数
    GP=zeros(1,256);                     %预创建存放灰度出现概率的向量
    for k=0:255
        GP(k+1)=length(find(PS==k))/(m*n);  %计算每级灰度出现的概率,将其存入GP中相应位置
    end
%直方图均衡化
    S1=zeros(1,256);
   for i=1:256
       for j=1:i
           S1(i)=GP(j)+S1(i);              %计算Sk
       end
   end
   S2=round((S1*256)+0.5);               %将Sk归到相近级的灰度
%图像均衡化
   f=PS;
   for i=0:255
       f(find(PS==i))=S2(i+1);         %将各个像素归一化后的灰度值赋给这个像素
   end
   figure,imshow(f);
%边缘检测
   f=edge(f,'canny',0.25);
   imshow(f);
%二值法锐化图像
   f=double(f);
   [x,y]=gradient(f);
   g=sqrt(x.*x+y.*y);
   i=find(g>=0.5);
   g(i)=256;
   j=find(g<0.5);
   g(j)=0;
   imshow(g);
   title('二值法锐化图像');
%中值滤波
g=medfilt2(g);
g=dither(g);
imshow(g);
%提取面积,矩形度,圆形度,拉伸度特征
   %g=im2bw(g);
   [x,y]=size(g);
   BW = bwperim(g,8); % 检测边缘跟踪,用于计算周长
%检测垂直方向连读的周长像素点%
   P1=0;
   P2=0;
   Ny=0; % 记录垂直方向连续周长像素点的个数
   for i=1:x
      for j=1:y
          if (BW(i,j)>0)
              P2=j;
              if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点
                  Ny=Ny+1;
              end
             P1=P2;
          end
      end
   end
%检测水平方向连读的周长像素点
   P1=0;
   P2=0;
   Nx=0; % 记录水平方向连续周长像素点的个数
   for j=1:y
       for i=1:x
           if (BW(i,j)>0)
               P2=i;
              if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点
                   Nx=Nx+1;
              end
              P1=P2;
           end
       end
   end
   SN=sum(sum(BW)); % 计算周长像素点的总数
   Nd=SN-Nx-Ny; % 计算奇数码的链码数目
   H=max(sum(g)); % 计算目标的高度
   W=max(sum(g')); % 图象g经矩阵转置后,计算宽度
   L=sqrt(2)*Nd+Nx+Ny; % 计算周长
%====形态特征值计算===%
   A=bwarea(g); % 计算目标的面积
   R=A/(H*W); % 计算矩形度
   E=min(H,W)/max(H,W); % 计算伸长度
   temp1=[A,R,E];
%提取不变矩特征
   [M,N]=size(g);
   [x,y]=meshgrid(1:N,1:M);
   x=x(:);
   y=y(:);
   g=g(:);
   m.m00=sum(g);
   if(m.m00==0)
      m.m00=eps;
   end
   m.m10=sum(x.*g);
   m.m01=sum(y.*g);
   m.m11=sum(x.*y.*g);
   m.m20=sum(x.^2.*g);
   m.m02=sum(y.^2.*g);
   m.m30=sum(x.^3.*g);
   m.m03=sum(y.^3.*g);
   m.m12=sum(x.*y.^2.*g);
   m.m21=sum(x.^2.*y.*g);
   xbar=m.m10/m.m00;
   ybar=m.m01/m.m00;
   e.eta11=(m.m11-ybar*m.m10)/m.m00^2;
   e.eta20=(m.m20-xbar*m.m10)/m.m00^2;
   e.eta02=(m.m02-ybar*m.m01)/m.m00^2;
   e.eta30=(m.m30-3*xbar*m.m20+2*xbar^2*m.m10)/m.m00^2.5;
   e.eta03=(m.m03-3*ybar*m.m02+2*ybar^2*m.m01)/m.m00^2.5;
   e.eta21=(m.m21-2*xbar*m.m11-ybar*m.m20+2*xbar^2*m.m01)/m.m00^2.5;
   e.eta12=(m.m12-2*ybar*m.m11-xbar*m.m02+2*ybar^2*m.m10)/m.m00^2.5;
   phi(1)=e.eta20+e.eta02;
   phi(2)=(e.eta20-e.eta02)^2+4*e.eta11^2;
   phi(3)=(e.eta30-3*e.eta12)^2+(3*e.eta21-e.eta03)^2;
   phi(4)=(e.eta30+e.eta12)^2+(e.eta21+e.eta03)^2;
   phi(5)=(e.eta30-3*e.eta12)*(e.eta30+e.eta12)*((e.eta30+e.eta12)^2-3*(e.eta21+e.eta03)^2+(3*e.eta21-e.eta03)*          (e.eta21+e.eta03)*(3*(e.eta30+e.eta12)^2-(e.eta21+e.eta03)^2));
   phi(6)=(e.eta20-e.eta02)*((e.eta30+e.eta12)^2-(e.eta21+e.eta03)^2)+4*e.eta11*(e.eta30+e.eta12)*(e.eta21+e.eta03);
   phi(7)=(3*e.eta21-e.eta03)*(e.eta30+e.eta12)*((e.eta30+e.eta12)^2-3*(e.eta21+e.eta03)^2)+(3*e.eta12-e.eta30)*          (e.eta21+e.eta03)*(3*(e.eta30+e.eta12)^2-(e.eta21+e.eta03)^2);
   temp2 = abs(log(phi));%包含七个特征值
   temp=[temp1,temp2]
end

本文引用地址: http://blog.sciencenet.cn/blog-343070-271858.html
  • 9
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab提供了许多特征提取函数和工具箱。这里提供一些常用的特征提取代码示例: 1. 基于时域的特征提取 ```matlab % 读取音频文件 [x, fs] = audioread('audio.wav'); % 计算短时能量 winLen = round(0.02 * fs); % 窗口长度为20ms energy = buffer(x.^2, winLen, 0, 'nodelay'); energy = sum(energy); % 计算短时过零率 zcr = buffer(x, winLen, 0, 'nodelay'); zcr = sign(zcr) .* [zeros(1, size(zcr,2)); diff(sign(zcr))]; zcr = sum(abs(zcr)) / (2*winLen); % 计算短时平均幅度 amp = buffer(abs(x), winLen, 0, 'nodelay'); amp = mean(amp); % 将特征拼接成向量 featVec = [energy, zcr, amp]; ``` 2. 基于频域的特征提取 ```matlab % 读取音频文件 [x, fs] = audioread('audio.wav'); % 计算短时傅里叶变换 winLen = round(0.02 * fs); % 窗口长度为20ms nfft = 2^nextpow2(winLen); stft = spectrogram(x, winLen, 0, nfft, fs); % 计算能量谱密度 psd = abs(stft).^2 / winLen; % 计算频带能量比 freqRange = [0, 2000]; % 感兴趣的频率范围 freqBins = round(freqRange / fs * nfft) + 1; energy = sum(psd(freqBins(1):freqBins(2), :), 1); energyRatio = energy / sum(energy); % 计算梅尔频率倒谱系数 numCoeffs = 12; % 系数个数 melFilterBank = melFilterBank(fs, nfft, numCoeffs); melSpectrum = log10(melFilterBank * psd); mfcc = dct(melSpectrum); % 取出特征向量 featVec = [energyRatio, mfcc]; ``` 3. 基于图像的特征提取 ```matlab % 读取图像文件 img = imread('image.jpg'); % 提取颜色直方图特征 histR = imhist(img(:,:,1)); histG = imhist(img(:,:,2)); histB = imhist(img(:,:,3)); featVec = [histR; histG; histB]; % 提取纹理特征 grayImg = rgb2gray(img); glcm = graycomatrix(grayImg, 'NumLevels', 256, 'GrayLimits', []); stats = graycoprops(glcm, 'Contrast', 'Energy', 'Homogeneity'); featVec = [stats.Contrast, stats.Energy, stats.Homogeneity]; ``` 这些代码只是一些示例,特征提取的方法和参数设置应该根据具体任务进行选择和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值