Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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
为什么';s Python';s Hog输出(scikit图像)不同于MATLAB';s猪(vlfeat)?_Python_Matlab_Scikit Image_Vlfeat - Fatal编程技术网

为什么';s Python';s Hog输出(scikit图像)不同于MATLAB';s猪(vlfeat)?

为什么';s Python';s Hog输出(scikit图像)不同于MATLAB';s猪(vlfeat)?,python,matlab,scikit-image,vlfeat,Python,Matlab,Scikit Image,Vlfeat,我有一段MATLAB代码,它从图像中提取91x91像素块,并提取其特征向量。我想用Python重写这个函数。我一直在努力寻找如何在Python中获得与在MATLAB中相同的HOG返回值,但失败了。如果你能提供任何帮助,我将不胜感激 MATLAB代码中使用了VLFeat库(),我正在Python()中使用scikit图像 在Matlab中,输入“im2single(patch)”是一个91*91的数组,而Hog的返回数据类型是4*4*16 single。应用Hog时,单元格大小为23,方向数为4

我有一段MATLAB代码,它从图像中提取91x91像素块,并提取其特征向量。我想用Python重写这个函数。我一直在努力寻找如何在Python中获得与在MATLAB中相同的HOG返回值,但失败了。如果你能提供任何帮助,我将不胜感激

MATLAB代码中使用了VLFeat库(),我正在Python()中使用scikit图像

在Matlab中,输入“im2single(patch)”是一个91*91的数组,而Hog的返回数据类型是4*4*16 single。应用Hog时,单元格大小为23,方向数为4

     hog = vl_hog(im2single(patch),23, 'variant', 'dalaltriggs', 'numOrientations',4) ;
返回的数据为4*4*16单,可以如下形式显示:

     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

我将面片的大小附加到92*92,因此面片大小是单元格大小的整数倍。输入数组现在称为“重新匹配”。但是,输出“tc”是一个64*1数组(梯度直方图被展平为特征向量)

然后我查看了Skimage的源代码

    orientation_histogram = np.zeros((n_cellsy, n_cellsx, orientations))
    orientation_histogram.shape 
    (4, 4, 4)
这里n_cellsx是:x中的细胞数,n_cellsy是:y中的细胞数。似乎Hog的输出与方向直方图的维数高度相关

返回值的HoG的实际维度由以下公式确定:

    normalised_blocks = np.zeros((n_blocksy, n_blocksx,by, bx, orientations))
其中n_blocksy,n_blocksy的计算公式为:

    n_blocksx = (n_cellsx - bx) + 1
    n_blocksy = (n_cellsy - by) + 1
n_cellsx是:x中的细胞数,这里的值是4,n_cellsy也是;bx,由每个块的单元格组成,即(1,1);在这种情况下,方向是4

返回值(归一化的_块)的大小似乎是由4*4*1*1*4(n_blocksy*n_blocksx*x*bx*方向)计算的

我试图更改块大小,但仍然无法获得预期的大小。。。(当块大小为(2,2)时,返回值为144*1数组)


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

与scikit图像相比,VLFeat库做了一些不同的事情。VLFeat库返回9个(方向数)对比度不敏感、18个对比度敏感和4个维度,以方形块(包含四个单元格)捕获总体梯度能量。因此,它每个单元输出31个维度。但是,scikit图像处理程序不同,我认为您对它有很好的理解

根据我的经验,如果你想用scikit图像和MATLAB找到相同的HoG向量,你肯定至少应该为scikit图像放入
cells\u per_block=(2,2)

    normalised_blocks = np.zeros((n_blocksy, n_blocksx,by, bx, orientations))
    n_blocksx = (n_cellsx - bx) + 1
    n_blocksy = (n_cellsy - by) + 1