MATLAB代码实现HOG方向梯度直方图特征提取

这篇具有很好参考价值的文章主要介绍了MATLAB代码实现HOG方向梯度直方图特征提取。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一步:原始图像预处理:灰度图、伽马矫正

 导入图片后,转化为灰度图,对图像进行滤波、矫正。滤波、矫正使用的方法、参数根据图片的情况进行选择。

第二步:计算各像素的总梯度、梯度方向

使用[-1,0,1]作x方向的算子;[-1;0;1]作y方向的算子;x方向梯度存入f1(i,j);y方向梯度存入f2(i,j)。计算总梯度与梯度方向。

总梯度:rho(i,j)=((f1(i,j))^2+(f2(i,j)^2))^0.5

梯度方向:theta(i,j)=(atan(f2(i,j)/f1(i,j)))*180/3.14

matlab图像左向右为正,上向下为正,计算完梯度方向后需要将其转换为平面直角坐标系中的角度以y轴正方向为0°,顺时针旋转,角度由0°变化至360°。便于后续统计方向梯度直方图。

matlab中图像坐标与角度如下图所示:

MATLAB代码实现HOG方向梯度直方图特征提取

为了方便后续不同角度区间的统计,可将上图的角度转换为下图的坐标,本例子中将360°划分为6个区间,间隔为60°,统计6个区间的的方向梯度直方图(角度划分方法、划分间隔可根据需要做不同选择): 

MATLAB代码实现HOG方向梯度直方图特征提取

第三步:设置1个cell为cellx×celly的图片区域,该例中取10×10个像素,统计10×10=100个像素6个方向上的直方图特征。

本例子图像大小为300×400像素,因此需要统计(300/10)×(400/10)=30×40=1200个cell,每个cell中包含100个像素点,每个点都包含总梯度、梯度方向的信息,将这100个像素点根据梯度方向,划分为6个组,统计每个组的总梯度累加值(统计完后选用合适的方法对每个cell的6个方向上的总梯度累加值做归一化处理,得到1个cell的特征值。或者统计时不做简单累加,采用插值方法进行各方向的累加,得到1个cell的特征值)。

(cell的大小可根据实际需要做不同选择。)

第四步:设置1个block为n×n个cell,该例中取1个block为3×3个cell,因每个cell中包含6个方向的直方图特征,则每个block包含9×6=54个特征。

逐行、逐列取block,每个cell会多次进入不同的block进行统计。本例子中1个block由3×3个cell组成,一共可取得(30-2)×(40-2)=1064个block,每个cell包含6个特征值,因此1个block中包含9×6=54个特征值,最终产生1064×54=57456个特征值。(每个block中的54个特征值可选用合适的方法进行归一化处理)。

matlab实现程序如下:

F=imread('D:\Desktop\matlab\13.png');

%第一步:原始图像预处理:灰度图、伽马矫正。
F=rgb2gray(F);
subplot(2,3,1),imshow(F);title('灰度图');

f=double(F);
[row,col]=size(f);
for i=1:row
    for j=1:col
         f(i,j)=(f(i,j))^0.5;                     %伽马矫正Gamma=1/2,
    end
end
subplot(2,3,2),imshow(f,[]);title('伽马矫正');

%第二步:计算各像素的总梯度、梯度方向
f1=zeros(row,col);           %f1用于存x方向梯度
f2=zeros(row,col);           %f2用于存y方向梯度
rho=zeros(row,col);          %rho用于存总方向梯度
theta=zeros(row,col);        %theta用于存梯度方向
gx=[-1,0,1];                 %计算x方向的算子,matlab图像左向右为正
gy=[-1;0;1];                 %计算x方向的算子,matlab图像上向下为正
for i=2:row-1
    for j=2:col-1
        fx=[f(i,j-1),f(i,j),f(i,j+1)];
        fy=[f(i-1,j);f(i,j);f(i+1,j)];
        Gx=gx.*fx;
        Gy=gy.*fy;
        f1(i,j)=sum(Gx,"all");                    %计算x方向梯度
        f2(i,j)=sum(Gy,"all");                    %计算y方向梯度
        rho(i,j)=((f1(i,j))^2+(f1(i,j)^2))^0.5;    %计算总梯度
        %下面计算梯度方向,matlab图像左向右为正,上向下为正,使用f2(i,j)/f1(i,j)计算方向后需要将其转换为平面直角坐标系中的角度
        %以y轴正方向为0°,顺时针旋转,角度由0°变化至360°。便于统计方向梯度直方图
        if f1(i,j)>0 && f2(i,j)<0                                          
             theta(i,j)=(atan(f2(i,j)/f1(i,j)))*180/3.14+90;                  %x方向梯度>0,y方向梯度<0,平面直角坐标系中的第一象限,转换为0°~90°范围
        end
        if f1(i,j)>0 && f2(i,j)>0 
             theta(i,j)=(atan(f2(i,j)/f1(i,j)))*180/3.14+90;                  %x方向梯度>0,y方向梯度>0,平面直角坐标系中的第四象限,转换为90°~180°范围
        end
        if f1(i,j)<0 && f2(i,j)>0 
             theta(i,j)=(atan(f2(i,j)/f1(i,j)))*180/3.14+270;                 %x方向梯度<0,y方向梯度>0,平面直角坐标系中的第三象限,转换为180°~270°范围
        end
        if f1(i,j)<0 && f2(i,j)<0 
             theta(i,j)=(atan(f2(i,j)/f1(i,j)))*180/3.14+270;                 %x方向梯度<0,y方向梯度<0,平面直角坐标系中的第二象限,转换为270°~360°范围
        end
        if f1(i,j)==0 && f2(i,j)<0 
             theta(i,j)=0.00001;                                              %x方向梯度=0,y方向梯度<0,平面直角坐标系中的y轴正方向,转换为0°,为了和无梯度方向(f2(i,j)、f1(i,j)均为0的情况)区别开,设该方向为极小的正值
        end
        if f1(i,j)>0 && f2(i,j)==0 
             theta(i,j)=90;                                                   %x方向梯度>0,y方向梯度=0,平面直角坐标系中的x轴正方向,转换为90°
        end
        if f1(i,j)==0 && f2(i,j)>0 
             theta(i,j)=180;                                                  %x方向梯度=0,y方向梯度>0,平面直角坐标系中的y轴负方向,转换为180°
        end
        if f1(i,j)<0 && f2(i,j)==0 
             theta(i,j)=270;                                                  %x方向梯度<0,y方向梯度=0,平面直角坐标系中的x轴负方向,转换为270°
        end
        if f1(i,j)==0 && f2(i,j)==0 
             theta(i,j)=0;                                                    %f2(i,j)、f1(i,j)均为0,无梯度方向
        end
     end
end
subplot(2,3,3),imshow(f1,[]);title('x方向梯度');
subplot(2,3,4),imshow(f2,[]);title('y方向梯度');
subplot(2,3,5),imshow(rho,[]);title('总梯度');
subplot(2,3,6),imshow(theta,[]);title('梯度方向');

%第三步:设置1个cell为cellx×celly的图片区域,该例中取10×10个像素,统计10×10=100个像素6个方向上的直方图特征.
       % 需要统计(300/10)×(400/10)=30×40=1200个cell
theta_num=6;                    %设置统计6个方向的直方图特征(也可设置为统计9个或其他n个方向)
cellx=10;                       %设置1个cell有几行像素               
celly=10;                       %设置1个cell有几列像素
theta_size=360/theta_num;       %统计6个方向上的直方图,每个方向60°

cell_rho=zeros(cellx,celly);    %创建cell_rho矩阵,用来放1个cell中各像素的总梯度
cell_theta=zeros(cellx,celly);  %创建cell_theta矩阵,用来放1个cell中各像素的梯度方向
histogram=zeros(1,theta_num);   %创建histogram数组,用来放1个cell中的6个统计直方图特征
Cell=cell(row/cellx,col/celly); %定义元胞数组大小,用于存放所有cell中的6个直方图特征

for x=1:row/cellx                                                          %需要确定图片尺寸的行数可被整除,即可得到图片可分为几行cell
    for y=1:col/celly                                                      %需要确定图片尺寸的列数可被整除,即可得到图片可分为几列cell
         cell_rho=rho(10*x-9:10*x,10*y-9:10*y);                            
         cell_theta=theta(10*x-9:10*x,10*y-9:10*y);                        %把每个cell中的总梯度、梯度方向放入矩阵cell_rho、cell_theta中,便于后面统计
                          
             for i=1:cellx
                  for j=1:celly
                      if cell_theta(i,j)>0
                      histogram(ceil(cell_theta(i,j)/theta_size))=histogram(ceil(cell_theta(i,j)/theta_size))+cell_rho(i,j); %统计10×10像素中各6个方向的直方图特征,放入histogram这个1×6的数组中
                      end
                  end
             end
             s=sum(histogram,"all");
             for h=1:theta_num
                 histogram(h)=histogram(h)/s;     %归一化
             end
             figure(2),plot(histogram);
             Cell{x,y}=histogram;                 %将归一化后的histogram(1×6)放入元胞数组中
             for h=1:theta_num
                 histogram(h)=0;                  %将histogram各元素置0,为下一个cell统计做好准备
             end
             
             histogram=zeros(1,6);
    end
end

%第四步:设置1个block为n×n个cell,该例中取1个block为3×3个cell,因每个cell中包含6个方向的直方图特征,则每个block包含9×6=54个特征.
       % 逐行、逐列取block,一共可取得(30-2)×(40-2)=1064个block,最终产生1064×6=6384个特征值
n=3;
[v,w]=size(Cell);
feature=cell(1,(v-(n-1))*(w-(n-1)));

for xx=1:v-2
    for yy=1:w-2
        feature{(xx-1)*(w-2)+yy}=[Cell{xx:xx+(n-1),yy:yy+(n-1)}];          %将3×3个cell的特征向量合并放入1个block中,作为1个block的特征
    end
end
%feature包含整图1064个block中所有的特征值

l=length(feature);
fmesh=[];
for i=1:l
    fmesh=[fmesh;feature{i}(:)'];            %用于画图
end
figure(3);
mesh(fmesh);

下图为完成第一步、第二步的结果:

MATLAB代码实现HOG方向梯度直方图特征提取

下图为完成第三步,其中1个cell的6个方向的特征值:

MATLAB代码实现HOG方向梯度直方图特征提取

下图为各block特征值的可视化结果,即本图片提取得到的HOG特征值:

MATLAB代码实现HOG方向梯度直方图特征提取

需要能够识别图片为汽车,则需要其他的训练方法与检测方法,本例子仅简单介绍提取HOG特征值的流程,其中有多处需要根据实际情况选择参数、方法。

本例子参考了以下内容:

HOG特征提取原理_沈子恒的博客-CSDN博客

MATLAB HOG方向梯度直方图 - 一杯清酒邀明月 - 博客园 (cnblogs.com)

【人脸识别】基于matlab HOG特征提取人脸识别【含Matlab源码 641期】_matlab提取hog特征_海神之光的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-484591.html

到了这里,关于MATLAB代码实现HOG方向梯度直方图特征提取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 MATLAB测试结果: FPGA测试结果: 上述仿真图中,红色XX表示图像读取完毕。因此输出XX。当图像输出完成之后,最下面的相似性指标 same1输出为11226,same2输出为67584.即图1和图

    2024年04月09日
    浏览(43)
  • Matlab遍历文件及直方图统计

    参考链接: 使用MATLAB遍历文件 strtrim用法 strsplit用法 cell单元数据使用{}

    2024年02月15日
    浏览(57)
  • 【opencv】教程代码 —Histograms_Matching(2)计算直方图、直方图比较、直方图均衡、模板匹配...

    计算直方图 直方图比较 图像进行直方图均衡化处理 模板匹配 1. calcHist_Demo.cpp 计算直方图 这段代码的功能是加载图像,分离图像的三个颜色通道,然后分别计算这三个通道的直方图,绘制出来并显示结果。直方图是图像中像素值分布的图形表示,可以用于图像分析或图像处

    2024年04月11日
    浏览(51)
  • 【MATLAB图像处理】直方图均衡化

    直方图均衡化有以下几个好处: 增强图像对比度:直方图均衡化可以通过重新分配像素值来增强图像的对比度。这可以使得图像中的细节更加清晰可见,从而提高图像的质量和可读性。 均衡化图像亮度:直方图均衡化可以将图像的亮度均衡化,使得图像的整体亮度更加均匀

    2024年02月08日
    浏览(43)
  • 【matlab图像处理】图像直方图操作和matlab画图

    中国史之【平王东迁】: 公元前771年,因镐京曾遭地震,残破不堪,又接近戎、狄等外患威胁,周平王遂在郑、秦、晋等诸侯的护卫下,将国都东迁至洛邑,东周历史由此开始。 ——来源:全历史APP 【路漫漫其修远兮,吾将上下而求索】 今天介绍图像的直方图操作以及用

    2024年02月04日
    浏览(44)
  • Matlab论文插图绘制模板第43期—直方图(histogram)

    在之前的文章中,分享过很多 柱状图的Matlab绘制模板 : 这一次,来分享一种比较特殊的柱状图: 统计直方图 。 先来看一下 成品效果 : 特别提示 :Matlab论文插图绘制模板系列, 旨在降低大家使用Matlab进行科研绘图的门槛 ,只需按照模板格式添加相应内容,即可得到满足

    2024年02月15日
    浏览(44)
  • Matlab之统计数据分布并绘制直方图函数histogram

    直方图是一种将数据分组到条柱中的条形图。该函数可以统计数据在划分区间内的数量分布,同时以直方图的形式展示统计结果。 创建直方图X的图。该函数使用 一种自动分箱算法,返回具有统一宽度的分箱, 选择以涵盖元素范围并揭示 分布的基础形状。 将条柱显示为矩形

    2024年04月14日
    浏览(47)
  • 计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例

    MSE 计算模型的预测 Ŷ 与真实标签 Y 的接近程度。公式表示为:   对于两个m×n的单通道图像I和K,它们的均方误差可定义为: 优点:MSE的函数曲线光滑、连续,处处可导,便于使用梯度下降算法,是一种常用的损失函数。而且,随着误差的减小,梯度也在减小,这有利于收敛

    2024年02月02日
    浏览(41)
  • Python实现直方图均衡化

    直方图均衡化: 作用:直方图均衡化是一种有效的图像增强技术,原始图像在灰度分布上可能集中在较窄的区间,造成图像不够清晰。采用直方图均衡化可以将原始图像的直方图变换为均匀分布,这样增加了像素之间的灰度值差别,从而达到增强图像整体对比度的效果。 具

    2024年02月11日
    浏览(43)
  • (数字图像处理MATLAB+Python)第五章图像增强-第二节:基于直方图修正的图像增强

    基于直方图修正的图像增强 :是一种常见的图像处理方法。该方法通过对图像的像素值分布进行调整,以改善图像的对比度和亮度等视觉效果。具体地,直方图校正方法将图像的像素值转换为一个新的值域范围,使得像素值的分布更加均匀,从而增强图像的细节和对比度。这

    2023年04月19日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包