function out=Algorithmslib(img,type) %%% type: %%% pfft2 :图像fft变换的极坐标表示 %%% edgehist:灰度图像的边缘方向直方图 %%% basedcoMatrix:基于灰度共生矩阵的纹理特征 %%% tamura_feature: 粗糙度; 对比度;方向度 switch type case 'pfft2' [row,col]=size(img); maxW=double(uint16(sqrt(row*row+col*col))); W=0:maxW/(row-1):maxW; theta=2*pi*(0:90/(col-1):90)/360; fftimg=fft2(img,4*row,4*col); U=ceil(W'*cos(theta)); V=ceil(W'*sin(theta)); U=reshape(U,row*col,1); V=reshape(V,row*col,1); UV2=V*2*row+U+1; clear W clear theta clear W clear V % pfft2out=fftimg(UV2); %%% out: row*col out=reshape(fftimg(UV2),row,col); clear UV2 clear fftimg % case 'gabor1' % %% S:0,1,2,3,4 % %% R:0,1,2,3,4,5 % Ws=[3/4,3/8,3/16,3/32,3/64]; % dels=Ws/3/sqrt(2*log(2)); % % thetar=[0,pi/6,pi/3,pi/2,2*pi/3,5*pi/6]; % delr=pi*pi/36/8/log(2); % for i=1:5 % WO(i,:)=exp(-(W-Ws(i)).^2/2/dels(i)/dels(i)); % end % WTH=zeros(1,300*300); % for i=1:6 % ThetaO=exp(-(theta-thetar(1)).^2/2/delr(1)/delr(1)); % wwth=[(ThetaO')*WO(1,:);(ThetaO')*WO(2,:);(ThetaO')*WO(3,:);(ThetaO')*WO(4,:);(ThetaO')*WO(5,:)]; % % WTH=cat(1,WTH,[ThetaO(i,:).*WO(1,:);ThetaO(i,:).*WO(2,:);ThetaO(i,:).*WO(3,:);ThetaO(i,:).*WO(4,:);ThetaO(i,:).*WO(4,:)]); % end % % %%%% out :30*row (W量化数目) % % gabor1out=WTH(2:31,:); % out=WTH(2:31,:); % clear WO % clear ThetaO % clear WTH % case 'edgehist' [row,col]=size(img); mm=max(max(img)); mm=ones(row,col)*double(mm); gray_img=double(img); if((gray_img-mm)==0) out=zeros(1,8); else if(row>800) Gray = blkproc(gray_img,[4 4],@mean); Gray = blkproc(Gray',[4 4],@mean)'; else Gray=gray_img; end edge_canny = edge(Gray,'canny'); gray_img=Gray; [row,col]=size(edge_canny); edge_num=sum(sum(edge_canny));%边缘总点数 %计算梯度矢量Gx,Gy for cir1=2:row-1 for cir2=2:col-1 Gx(cir1,cir2)=sum(gray_img(cir1-1:cir1+1,cir2+1))... -sum(gray_img(cir1-1:cir1+1,cir2-1))... +gray_img(cir1,cir2+1)-gray_img(cir1,cir2-1); Gy(cir1,cir2)=sum(gray_img(cir1+1,cir2-1:cir2+1))... -sum(gray_img(cir1-1,cir2-1:cir2+1))... +gray_img(cir1+1,cir2)-gray_img(cir1-1,cir2); Gx(cir1,cir2)=Gx(cir1,cir2)+(Gx(cir1,cir2)==0)*1e-6; theta(cir1,cir2)=atan(Gy(cir1,cir2)/Gx(cir1,cir2)); %计算边缘方向 end end for cir1=1:row for cir2=1:col if edge_canny(cir1,cir2)==1 edge_theta(cir1,cir2)=theta(cir1,cir2); else edge_theta(cir1,cir2)=0; end end end TH=[tan(pi/16),tan(3*pi/16),tan(5*pi/16),tan(7*pi/16),tan(-1*pi/16),... tan(-3*pi/16),tan(-5*pi/16),Inf;tan(-pi/16),tan(1*pi/16),tan(3*pi/16),... tan(5*pi/16),tan(-3*pi/16),tan(-5*pi/16),tan(-7*pi/16),tan(7*pi/16)]; for i = 1:8 if i~=8 direct_img = (edge_theta=TH(2,i)); else direct_img = ((abs(edge_theta)=TH(2,i))); end edgehist(i) = sum(sum(direct_img & edge_canny)); end %归一化 out = edgehist/edge_num; clear Gray;clear Gx;clear Gy;clear c;clear ca; clear direct_img;clear edge_canny;clear edge_theta; clear theta;clear gray_img; end % %----------------------------------------------------------------------------------------%% % % %---------------------------- % %计算边缘方向直方图 % %输入:图片序号 % %输出:量化、归一化后的直方图(八个角度的概率统计) % %---------------------------- % function edgehist=edgedir_his(num) % % %num=1; % imgdir='C:\MATLAB7\work\'; % imgsuffix='.jpg'; % rgb_img=imread([imgdir,num2str(num),imgsuffix]); % gray_img=rgb2gray(rgb_img); % [row,col]=size(gray_img); % gray_img=double(gray_img); % % %提取canny边缘算子 % edge_canny=edge(gray_img,'canny'); % edge_num=sum(sum(edge_canny));%边缘总点数 % % %计算梯度矢量Gx,Gy % for cir1=2:row-1 % for cir2=2:col-1 % Gx(cir1,cir2)=sum(gray_img(cir1-1:cir1+1,cir2+1))... % -sum(gray_img(cir1-1:cir1+1,cir2-1))... % +gray_img(cir1,cir2+1)-gray_img(cir1,cir2-1); % Gy(cir1,cir2)=sum(gray_img(cir1+1,cir2-1:cir2+1))... % -sum(gray_img(cir1-1,cir2-1:cir2+1))... % +gray_img(cir1+1,cir2)-gray_img(cir1-1,cir2); % Gx(cir1,cir2)=Gx(cir1,cir2)+(Gx(cir1,cir2)==0)*1e-6; % theta(cir1,cir2)=atan(Gy(cir1,cir2)/Gx(cir1,cir2)); %计算边缘方向 % end % end % % %edge_theta=theta&edge_canny; % for cir1=1:row % for cir2=1:col % if edge_canny(cir1,cir2)==1 % edge_theta(cir1,cir2)=theta(cir1,cir2); % else % edge_theta(cir1,cir2)=0; % end % end % end % % TH=[tan(pi/16),tan(3*pi/16),tan(5*pi/16),tan(7*pi/16),tan(-1*pi/16),... % tan(-3*pi/16),tan(-5*pi/16),Inf;tan(-pi/16),tan(1*pi/16),tan(3*pi/16),... % tan(5*pi/16),tan(-3*pi/16),tan(-5*pi/16),tan(-7*pi/16),tan(7*pi/16)]; % % for i = 1:8 % if i~=8 % direct_img = (edge_theta=TH(2,i)); % else % direct_img = ((abs(edge_theta)=TH(2,i))); % end % edgehist(i) = sum(sum(direct_img & edge_canny)); % end % % %归一化 % edgehist = edgehist/edge_num; % % %平滑直方图 % %for i=2:7 % % edgehist1(i)=sum(edgehist(i-1:i+1))/3; % %end % %edgehist(2:7)=edgehist1(2:7); % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case 'basedcoMatrix' [M,N] = size(img); Gray=zeros(M,N); for n = 1:256/16 pp=find((n-1)*16<=img&img1&j800) [c,s]=wavedec2(img,2,'db2'); ca=appcoef2(c,s,'db2',1); Max=max(max(ca)); Min=min(min(ca)); img=255*(ca-Min)/(Max-Min); end [Nx,Ny] = size(img); Ng=256; G=double(img); %计算粗糙度(coarseness) Sbest=zeros(Nx,Ny); E0h=zeros(Nx,Ny);E0v=zeros(Nx,Ny); E1h=zeros(Nx,Ny);E1v=zeros(Nx,Ny); E2h=zeros(Nx,Ny);E2v=zeros(Nx,Ny); E3h=zeros(Nx,Ny);E3v=zeros(Nx,Ny); E4h=zeros(Nx,Ny);E4v=zeros(Nx,Ny); E5h=zeros(Nx,Ny);E5v=zeros(Nx,Ny); flag=0; for i=1:Nx for j=2:Ny E0h(i,j)=G(i,j)-G(i,j-1); end end E0h=E0h/2; for i=1:Nx-1 for j=1:Ny E0v(i,j)=G(i,j)-G(i+1,j); end end E0v=E0v/2; if (Nx<4||Ny<4) flag=1; end if(flag==0) for i=1:Nx-1 for j=3:Ny-1 E1h(i,j)=sum(sum(G(i:i+1,j:j+1)))-sum(sum(G(i:i+1,j-2:j-1))); end end for i=2:Nx-2 for j=2:Ny E1v(i,j)=sum(sum(G(i-1:i,j-1:j)))-sum(sum(G(i+1:i+2,j-1:j))); end end E1h=E1h/4; E1v=E1v/4; end if (Nx<8||Ny<8) flag=1; end if(flag==0) for i=2:Nx-2 for j=5:Ny-3 E2h(i,j)=sum(sum(G(i-1:i+2,j:j+3)))-sum(sum(G(i-1:i+2,j-4:j-1))); end end for i=4:Nx-4 for j=3:Ny-1 E2v(i,j)=sum(sum(G(i-3:i,j-2:j+1)))-sum(sum(G(i+1:i+4,j-2:j+1))); end end E2h=E2h/16; E2v=E2v/16; end %图片大小必须大于16*16才能计算E3h、E3v if (Nx<16||Ny<16) flag=1 end if(flag==0) for i=4:Nx-4 for j=9:Ny-7 E3h(i,j)=sum(sum(G(i-3:i+4,j:j+7)))-sum(sum(G(i-3:i+4,j-8:j-1))); end end for i=8:Nx-8 for j=5:Ny-3 E3v(i,j)=sum(sum(G(i-7:i,j-4:j+3)))-sum(sum(G(i+1:i+8,j-4:j+3))); end end E3h=E3h/64; E3v=E3v/64; end %图片大小必须大于32*32才能计算E4h、E4v if (Nx<32||Ny<32) flag=1; end if(flag==0) for i=8:Nx-8 for j=17:Ny-15 E4h(i,j)=sum(sum(G(i-7:i+8,j:j+15)))-sum(sum(G(i-7:i+8,j-16:j-1))); end end for i=16:Nx-16 for j=9:Ny-7 E4v(i,j)=sum(sum(G(i-15:i,j-8:j+7)))-sum(sum(G(i+1:i+16,j-8:j+7))); end end E4h=E4h/256; E4v=E4v/256; end %图片大小必须大于64*64才能计算E5h、E5v if (Nx<64||Ny<64) flag=1; end if(flag==0) for i=16:Nx-16 for j=33:Ny-31 E5h(i,j)=sum(sum(G(i-15:i+16,j:j+31)))-sum(sum(G(i-15:i+16,j-32:j-31))); end end for i=32:Nx-32 for j=17:Ny-15 E5v(i,j)=sum(sum(G(i-31:i,j-16:j+15)))-sum(sum(G(i+1:i+32,j-16:j+15))); end end E5h=E5h/1024; E5v=E5v/1024; end for i=1:Nx for j=1:Ny [maxv,index]=max([E0h(i,j),E0v(i,j),E1h(i,j),E1v(i,j),E2h(i,j),E2v(i,j),E3h(i,j),E3v(i,j),E4h(i,j),E4v(i,j),E5h(i,j),E5v(i,j)]); k=floor((index+1)/2); Sbest(i,j)=2.^k; end end Fcoarseness=sum(sum(Sbest))/(Nx*Ny); %计算对比度 [counts,graylevels]=imhist(img); PI=counts/(Nx*Ny); averagevalue=sum(graylevels.*PI); u4=sum((graylevels-repmat(averagevalue,[256,1])).^4.*PI); standarddeviation=sum((graylevels-repmat(averagevalue,[256,1])).^2.*PI); alpha4=u4/standarddeviation^2; Fcontrast=sqrt(standarddeviation)/alpha4.^(1/4); %计算方向度 PrewittH=[-1 0 1;-1 0 1;-1 0 1]; PrewittV=[1 1 1;0 0 0;-1 -1 -1]; %计算横向梯度 deltaH=zeros(Nx,Ny); for i=2:Nx-1 for j=2:Ny-1 deltaH(i,j)=sum(sum(G(i-1:i+1,j-1:j+1).*PrewittH)); end end for j=2:Ny-1 deltaH(1,j)=G(1,j+1)-G(1,j); deltaH(Nx,j)=G(Nx,j+1)-G(Nx,j); end for i=1:Nx deltaH(i,1)=G(i,2)-G(i,1); deltaH(i,Ny)=G(i,Ny)-G(i,Ny-1); end %计算竖向梯度 deltaV=zeros(Nx,Ny); for i=2:Nx-1 for j=2:Ny-1 deltaV(i,j)=sum(sum(G(i-1:i+1,j-1:j+1).*PrewittV)); end end for j=1:Ny deltaV(1,j)=G(2,j)-G(1,j); deltaV(Nx,j)=G(Nx,j)-G(Nx-1,j); end for i=2:Nx-1 deltaV(i,1)=G(i+1,1)-G(i,1); deltaV(i,Ny)=G(i+1,Ny)-G(i,Ny); end %梯度向量模 deltaG=(abs(deltaH)+abs(deltaV))/2; %梯度向量方向 theta=zeros(Nx,Ny); for i=1:Nx for j=1:Ny if (deltaH(i,j)==0)&&(deltaV(i,j)==0) elseif deltaH(i,j)==0 theta(i,j)=pi; else theta(i,j)=atan(deltaV(i,j)/deltaH(i,j))+pi/2; end end end theta1=reshape(theta,1,[]); phai=0:0.0001:pi; HD1=hist(theta1,phai); HD1=HD1/(Nx*Ny); HD2=zeros(size(HD1)); %定义一个阈值THRESHOLD THRESHOLD=0.01; for m=1:length(HD2) if HD1(m)>=THRESHOLD HD2(m)=HD1(m); end end [c,index]=max(HD2); phaiP=index*0.0001; Fdirection=0; for m=1:length(HD2) if HD2(m)~=0 Fdirection=Fdirection+(phai(m)-phaiP)^2*HD2(m); end end clear E0h;clear E0v; clear E1h;clear E1v; clear E2h;clear E2v; clear E3h;clear E3v; clear E4h;clear E4v; clear E5h;clear E5v; clear G;clear HD1;clear HD2; clear PI;clear Sbest;clear counts; clear deltaG;clear deltaH;clear deltaV; clear phaiP; clear theta;clear theta1; out=[Fcoarseness,Fcontrast,Fdirection]; otherwise error(['Unknown Algorithms .']); end