一、傅里叶描述子
傅里叶描述子的作用是用来描述图像的轮廓信息,具有平移、旋转、尺度不变性特征。
对于一幅图像,通过傅里叶描述子获得其图像轮廓信息,其本质就是空间、频域变换问题。通过将图像中的像素点进行傅里叶变换,得到得到图像的轮廓信息,
对于曲线上一点,可以用复数表示:
对s(t)进行傅里叶变换可得:
其中,a(k)为傅里叶描述子,为了使其具有平移,缩放,和旋转不变性需要对其进行归一化,归一化后的模为:
matlab代码:
InputImage=imread('捕获.JPG');
figure;
imshow(InputImage);
title('原始图像');
InputImage=imresize(InputImage,0.15);
InputImage=imadjust(InputImage,[0.1,0.9],[0.1,1],0.6);
g=InputImage(:,:,1);
g=wiener2(g,[99]);
T=graythresh(g);
bw=im2bw(g,T);
figure;
imshow(bw);
title('二值图像');
flag_index=2;
[m,n]=size(bw);
bound =boundaries(bw);
bound =bound{1};
bim=bound2im(bound,m,n);
figure;
imshow(bim,[]);
title('提取的边界图');
z=frdescp(bound);
%计算傅利叶描述子
zc=fftshift(z);
feature= abs(zc([1:13]))'
figure;
plot(feature); title('特征向量图');
二、HOG特征描述子
特征描述子,实质是把图像转换为向量表示。HOG(Histogram of Oriented Gridients方向梯度直方图)。
由于一幅图像太大,不能直接获取其特征,通常我们要把它划分成小区域,便于提取其特征。方向梯度直方图就是将图像先划分为不同的区块,然后对每个区块又划分为多个单元。先对每个单元计算其梯度幅值和方向,然后每个块包含的单元中的特征向量串联起来,最后将所有块的特征组成一个向量,从而获得了整幅图像的特征。
梯度幅值和方向可以利用梯度算子如sobel算子来进行计算,计算过程如下:
算法实现流程图为:
matlab代码(转):
clear;
clc;
img=imread('xjpic.jpg');%图片位置
%% 1、灰度化
img=rgb2gray(img);
img=double(img);
figure;
imshow(img,[]);%显示图像
title('灰度图像');
step=8; %step*step个像素作为一个cell
[m1 ,n1]=size(img);%获取图像尺寸
%改变图像尺寸为step的最近整数倍,要不然后面就会发生错误
img=imresize(img,[floor(m1/step)*step,floor(n1/step)*step],'nearest');
[m,n]=size(img);
% 1、伽马校正
figure;
img=sqrt(img);
imshow(img,[]);%显示图像
title('颜色归一化图像');
%% 下面是求边缘,也就是滤波,求梯度
fy=[-1 0 1]; %定义竖直模板
fx=fy'; %定义水平模板,该符号为转置
Iy=imfilter(img,fy,'replicate'); %竖直边缘
Ix=imfilter(img,fx,'replicate'); %水平边缘
Ied=sqrt(Ix.^2+Iy.^2); %边缘强度 求梯度的长度
Iphase=Iy./Ix; %边缘斜率,有些为inf,-inf,nan,其中nan需要再处理一下
figure; %% 创建一个画板
imshow(Ied,[]); %显示梯度提取后的值
title('边缘提取图像');
%% 下面是求cell
orient=9; %方向直方图的方向个数
angular=360/orient; %每个方向包含的角度数,划分角度区间,0到40度一个区间...
Cell=cell(1,1); %所有的角度直方图,cell是可以动态增加的,所以先设了一个
%% 开始获取orient个方向的特征向量
ii=1;
jj=1;
for i=1:step:m-step %如果处理的m/step不是整数,最好是i=1:step:m-step
ii=1;
for j=1:step:n %注释同上
tmpx=Ix(i:i+step-1,j:j+step-1); %水平
%% 边缘强度
tmped=Ied(i:i+step-1,j:j+step-1);
%% 局部边缘强度归一化
tmped=tmped/sum(sum(tmped));
%% 边缘斜率局部提取
tmpphase=Iphase(i:i+step-1,j:j+step-1);
%% 创建直方图
Hist=zeros(1,orient); %当前step*step像素块统计角度直方图,就是cell
%% 统计一个块里面的梯度信息
for p=1:step
for q=1:step
%% 判断是不是一个数字True for Not-a-Number.如果不是一个数字,就归零
if isnan(tmpphase(p,q))==1 %因为会遇到0/0的情况
tmpphase(p,q)=0;
end
%% 进行区间的划分
ang=atan(tmpphase(p,q)); %atan求的是[-90 90]度之间
ang=mod(ang*180/pi,360); %全部变正,-90变270
if tmpx(p,q)<0 %根据x方向确定真正的角度
if ang<90 %如果是第一象限
ang=ang+180; %移到第三象限
end
if ang>270 %如果是第四象限
ang=ang-180; %移到第二象限
end
end
ang=ang+0.0000001; %防止ang为0
Hist(ceil(ang/angular)) = Hist(ceil(ang/angular))+tmped(p,q); %ceil向上取整,使用边缘强度加权
end
end
%% 方向直方图归一化
Hist=Hist/sum(Hist);
Cell{ii,jj}=Hist; %放入Cell中
ii=ii+1; %针对Cell的y坐标循环变量
end
jj=jj+1; %针对Cell的x坐标循环变量
end
%% 下面是求feature,2*2个cell合成一个block,没有显式的求block
[m2, n2]=size(Cell);
feature=cell(1,(m2-1)*(n2-1));
for i=1:m2-1
for j=1:n2-1
f=[];
f=[f Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)'];
feature{(i-1)*(n2-1)+j}=f;
end
end
l=length(feature);
f=[];
for i=1:l
f=[f;feature{i}(:)'];
end
figure
mesh(f)
title('特征向量图')
参考文献:
[1]https://blog.csdn.net/lemon_jay/article/details/89349006
[2]https://blog.csdn.net/dulingtingzi/article/details/51488060?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158993436619195162517681%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=158993436619195162517681&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_v25-2-51488060.nonecase&utm_term=HOGmatlab代码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)