matlab 提取HOG特征

来源:互联网 发布:第二次工业革命 知乎 编辑:程序博客网 时间:2024/05/22 22:07

HOG(Histogram of Oriented Gradient)方向梯度直方图,主要用来提取图像特征,最常用的是结合svm进行行人检测。

算法流程图如下(这篇论文上的):

下面我再结合自己的程序,表述一遍吧:

1.对原图像gamma校正,img=sqrt(img);

2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率。

3.将图像每16*16(取其他也可以)个像素分到一个cell中。对于256*256的lena来说,就分成了16*16个cell了。

4.对于每个cell求其梯度方向直方图。通常取9(取其他也可以)个方向(特征),也就是每360/9=40度分到一个方向,方向大小按像素边缘强度加权。最后归一化直方图。

5.每2*2(取其他也可以)个cell合成一个block,所以这里就有(16-1)*(16-1)=225个block。

6.所以每个block中都有2*2*9个特征,一共有225个block,所以总的特征有225*36个。

当然一般HOG特征都不是对整幅图像取的,而是对图像中的一个滑动窗口取的。

lena图:

求得的225*36个特征:

matlab代码如下:

复制代码
clear all; close all; clc;img=double(imread('lena.jpg'));imshow(img,[]);[m n]=size(img);img=sqrt(img);      %伽马校正%下面是求边缘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需要再处理一下%下面是求cellstep=16;                %step*step个像素作为一个单元orient=9;               %方向直方图的方向个数jiao=360/orient;        %每个方向包含的角度数Cell=cell(1,1);              %所有的角度直方图,cell是可以动态增加的,所以先设了一个ii=1;                      jj=1;for i=1:step:m          %如果处理的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                if isnan(tmpphase(p,q))==1  %0/0会得到nan,如果像素是nan,重设为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/jiao))=Hist(ceil(ang/jiao))+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[m n]=size(Cell);feature=cell(1,(m-1)*(n-1));for i=1:m-1   for j=1:n-1                   f=[];        f=[f Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)'];        feature{(i-1)*(n-1)+j}=f;   endend%到此结束,feature即为所求%下面是为了显示而写的l=length(feature);f=[];for i=1:l    f=[f;feature{i}(:)'];  end figuremesh(f)
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四核豌豆2变砖怎么办 苹果32g不够用怎么办 移动4g网络卡怎么办 移动4g网非常卡怎么办 移动4g卡网速慢怎么办 手机移动4g网卡怎么办 华为手机摄像头进灰怎么办 美图t8忘记密码怎么办 华为mate7忘记开机密码怎么办 华为mate9开机密码忘记怎么办 华为手机系统更新失败怎么办 mate9系统升级后耗电快怎么办 华为荣耀手机耗电快怎么办 荣耀10手机拍照不清晰怎么办 荣耀6x拍照模糊怎么办 华为荣耀P9进水了怎么办 苹果5s手机信号不好怎么办 苹果5s信号不好怎么办? 苹果5s像素不好怎么办 华为mate边缘有缝怎么办 华为mate8边缘有缝怎么办 手机系统占用运行内存大怎么办 安卓手机储存空间不足怎么办 手机显示系统空间不足怎么办 联系人存储已停止运行怎么办 荣耀note8听筒声音小怎么办 红米4x内存不足怎么办 安卓电视内存小怎么办 红米手机运行内存不足怎么办 红米手机存储空间不足怎么办 华为手机储存空间不足怎么办 大麦机顶盒遥控器丢了怎么办 大麦盒子总自动加软件怎么办 小米手机玩王者荣耀卡怎么办 荣耀8青春版信号差怎么办 华为mate8电池不耐用怎么办 华为4x内存小怎么办 发现手机被用过怎么办 华为p8手机声音小怎么办 手机指纹解锁密码忘了怎么办 华为p10黑色掉漆怎么办