Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 图像检索-边缘直方图_Image Processing_Graphics_Computer Vision - Fatal编程技术网

Image processing 图像检索-边缘直方图

Image processing 图像检索-边缘直方图,image-processing,graphics,computer-vision,Image Processing,Graphics,Computer Vision,我的讲师在图像检索的边缘直方图上有幻灯片,其中他指出必须首先将图像划分为4x4块,然后检查水平、垂直、+45°和-45°方向的边缘。然后,他指出,这在14x1直方图中表示。我不知道他是如何决定必须创建14x1直方图的。是否有人知道他是如何得出这个值的,或者如何创建一个边缘直方图 谢谢。您所指的东西叫做定向梯度直方图(HoG)。然而,你的例子的数学结果并不正确。通常,您将选择空间装箱参数(4x4块)。对于每个块,您将计算一些不同方向上的梯度幅值(在您的示例中,只有两个方向)。因此,在每个块中都有N

我的讲师在
图像检索
边缘直方图上有幻灯片,其中他指出必须首先将图像划分为
4x4块
,然后检查
水平、垂直、+45°和-45°方向的边缘
。然后,他指出,这在
14x1直方图中表示。我不知道他是如何决定必须创建
14x1直方图的。是否有人知道他是如何得出这个值的,或者如何创建一个
边缘直方图


谢谢。

您所指的东西叫做定向梯度直方图(HoG)。然而,你的例子的数学结果并不正确。通常,您将选择空间装箱参数(4x4块)。对于每个块,您将计算一些不同方向上的梯度幅值(在您的示例中,只有两个方向)。因此,在每个块中都有
N_{directions}
测量值。将该值乘以块数(16个块),您将看到有
16*N_{directions}
总测量值

要形成直方图,只需将这些测量值连接成一个长向量。只要跟踪将bin/direction组合映射到1-D直方图中的一个槽中的方式,任何进行连接的方法都可以。这种长的连接直方图通常用于机器学习任务,比如训练分类器根据图像的梯度方向识别图像的某些方面

但在你的例子中,教授一定在做一些特别的事情,因为如果你有16个不同的图像块(一个4x4的图像块网格),那么你需要计算每个块不到1个测量值,最终得到整个直方图中总共14个测量值

或者,教授的意思可能是,取[-45,+45]之间的角度范围,然后将其分为14个不同的值:-45,-45+90/14,-45+2*90/14。。。等等

如果这就是教授的意思,那么在这种情况下,你会在一个街区内得到14个定向箱。一旦所有的东西都连接起来,就有一个很长的14*16=224分量向量来描述整个图像


顺便说一句,我已经用Python实现的Gradient直方图做了很多测试,所以您可以看到一些相关的工作。该站点上也有一些示例代码,尽管在中出现了一个更受支持的HoG版本。

当我说只有两个方向时,我是在看你的第一篇文章,你只说+/-45度。显然,在实践中,你会想要比这更多的方向,我在后面澄清了这一点,我说你的教授可能意味着你要选择-45和+45之间的所有方向,并将它们离散成一个方向网格。有两种不同的方法。有时人们会离散整个方向圈,有时他们只离散半个方向圈。通常,你只关心绝对方向,符号并不重要。至于“频率”轴,在这种情况下,你将计算一个全新的“图像”,其中每个“像素”包含该像素处梯度的大小。如果(i,j)处的像素具有梯度幅度M和梯度方向D,那么您可以计算出方向D所属的角度单元(基于您选择的离散化角度网格),并在直方图的该槽中添加幅度M。因此“频率”一个给定的像素对直方图的贡献是该像素处的梯度大小。实际上,大多数人采用0到pi之间的角度,并将其离散为11或15个像素。然后,对于每个图像块,它们循环通过这个角度列表,将该块中的像素的总梯度大小相加,这些像素构成特定的角度区域,然后将该总和插入该块的直方图中。他们对下一个块重复这个过程,以此类推,得到几个这样的直方图。然后,当所有这些都说了又做了,他们只是将直方图连接在一起,形成一个长直方图作为描述符。如果你编写代码来做这件事,它通常会接受图像的任何一块作为输入,然后它会将该块分块,将角度分块,并计算上述长直方图作为输出。通过这种方式,您可以获得任何给定图像补丁的描述符。例如,如果要询问两个图像块是否彼此相似,可以计算它们的描述符之间的距离。或者你可以用+1对某个物体的图像进行手动分类,并训练分类器根据其描述符识别这些图像。是的,你是对的。每个块将产生一个具有不同方向分量的4矢量
[d1,d2,d3,d4]
,其中d1为左至右,d2为右上至左下,依此类推。在d1分量中,将在该块中存储指向该方向的梯度幅值之和。对每个方向重复上述步骤,就得到了一个块级直方图。对每个块重复所有这些操作,就得到了16个不同的块级直方图。将它们叠加在一起,您将得到一个16*4=64个分量长的图像级直方图。