首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Python的Hog输出(scikit-image)与MATLAB的Hog (vlfeat)不同?

为什么Python的Hog输出(scikit-image)与MATLAB的Hog (vlfeat)不同?
EN

Stack Overflow用户
提问于 2014-09-01 16:59:46
回答 1查看 1.6K关注 0票数 2

我有一段MATLAB代码,它从图像中提取91x91的像素补丁,并使用苹果HOG来提取其特征向量。我想用Python重写函数。我已经挣扎了一段时间,试图找出如何在Python中获得与在MATLAB中相同的HOG返回值,但失败了。如果你能提供任何帮助,我将不胜感激。

MATLAB代码中使用了VLFeat库(http://www.vlfeat.org/overview/hog.html),我在Python中使用了scikit-image (http://scikit-image.org/docs/dev/api/skimage.feature.html?highlight=peak_local_max#skimage.feature.hog)。

在Matlab中,输入‘im2single( single.HoG )’是一个91*91的数组,而返回的Hog数据类型是4* 4 *16补丁是使用23的单元格大小和4的方向数应用的。

代码语言:javascript
复制
     hog = vl_hog(im2single(patch),23, 'variant', 'dalaltriggs', 'numOrientations',4) ;

返回数据为4*4*16单,可通过以下形式展示:

代码语言:javascript
复制
     val(:,:,1) =

     0         0         0         0
     0         0         0         0
     0    0.2000    0.2000    0.0083
     0    0.2000    0.2000    0.0317

     ....

     val(:,:,16) =

     0         0         0         0
     0         0         0         0
     0         0    0.0526    0.0142
     0         0    0.2000    0.2000

然后手动将结果展平为256*1的特征向量。总而言之,在91*91像素补丁中,提取256*1个特征向量。现在我想在Python中得到同样的结果。

在我的Python代码中,我尝试应用具有相同单元大小的HOG,并将orientations.The块大小的数量设置为(1,1)

代码语言:javascript
复制
    tc = hog(repatch, orientations=4, pixels_per_cell=(23,23), cells_per_block= (1,1), visualise=False, normalise=False)

我将补丁的大小附加到92*92,因此补丁的大小是单元格大小的整数倍。输入数组现在被称为'repatch‘。然而,输出'tc‘是一个64*1数组(梯度直方图被展平为特征向量)

代码语言:javascript
复制
   tc.shape 

   (64,)

然后我查看了Skimage的源代码,

代码语言:javascript
复制
    orientation_histogram = np.zeros((n_cellsy, n_cellsx, orientations))
    orientation_histogram.shape 
    (4, 4, 4)

这里的n_cellsx是:x中的单元格数量,n_cellsy是: y中的单元格数量。看起来猪的输出与orientation_histogram的维度高度相关。

返回值HoG的实际维度由以下参数决定:

代码语言:javascript
复制
    normalised_blocks = np.zeros((n_blocksy, n_blocksx,by, bx, orientations))

其中,n_blocksy、n_blocksy的计算公式为:

代码语言:javascript
复制
    n_blocksx = (n_cellsx - bx) + 1
    n_blocksy = (n_cellsy - by) + 1

方向是:x中的单元格数量,这里的值是4,所以n_cellsy也是;bx,by是cells_per_block,它是(1,1);在这种情况下方向是4。

返回值的大小(normalised_blocks)好像是按4*4*1*1*4 (n_blocksy * n_blocksx * by * bx * orientations)计算的

我试着改变块的大小,但仍然不能得到我所期望的…(当块大小为(2,2)时,返回值为144*1数组)

有人能帮帮忙吗..。如何获得与Matlab中相同的Hog输出?非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2016-07-22 06:19:32

与scikit image相比,VLFeat库做了一些不同的事情。VLFeat库返回9(方向数)对比度不敏感,18个对比度敏感和4个维度,这些维度捕获正方形块(包含四个单元)中的总体梯度能量。因此,它输出每个单元格31个维度。然而,scikit image过程是不同的,我想你对它有很好的理解。

根据我的经验,如果你想使用scikit image和MATLAB找到相同的HoG向量,你至少应该为scikit image设置cells_per_block= (2,2)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25602247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档