2017-12-18 260 views

回答

1

人们通常在这种情况下做的是对遵循以下两种情况之一:

  1. 调整所有图像(或图像块)以固定的大小和提取与HOG特征。
  2. 使用“Bag of Words/Features”方法,不要调整图像大小。

第一种方法1.很简单,但它有一些方法2.试图解决的问题。首先,考虑一下猪描述符的作用。它将图像划分为固定长度的单元格,按照单元格计算梯度以生成单元格直方图(基于投票)。最后,你会得到所有单元格的连接直方图,这就是你的描述符。

所以有一个问题,因为对象(你想检测)必须以类似的方式覆盖图像。否则,根据图像内部对象的位置,您的描述符看起来会有所不同。

方法2.的工作原理如下:

  1. 在你的训练集正反两方面的图像提取HOG特征。
  2. 使用像k-means这样的聚类算法来定义一个固定的质心值k
  3. 对于数据集中的每个图像,提取HOG特征并将它们按元素方式与质心进行比较以创建频率直方图。

使用频率直方图训练SVM并将其用于分类阶段。这样,该位置并不重要,您将始终拥有固定大小的输入。您还将从尺寸缩小中受益。

1

您可以使用cv2.resize()将图像归一化为给定的目标形状,将图像划分为您想要的块的数量并计算方位的直方图以及幅度。以下是相同的简单实现。

img = cv2.imread(filename,0) 
img = cv2.resize(img,(16,16)) #resize the image 

gx = cv2.Sobel(img, cv2.CV_32F, 1, 0) #horizontal gradinets 
gy = cv2.Sobel(img, cv2.CV_32F, 0, 1) # vertical gradients 

mag, ang = cv2.cartToPolar(gx, gy) 
bin_n = 16 # Number of bins 
# quantizing binvalues in (0-16) 
bins = np.int32(bin_n*ang/(2*np.pi)) 

# divide to 4 sub-squares 
s = 8 #block size 
bin_cells = bins[:s,:s],bins[s:,:s],bins[:s,s:],bins[s:,s:] 
mag_cells = mag[:s,:s], mag[s:,:s], mag[:s,s:], mag[s:,s:] 
hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells,mag_cells)] 

hist = np.hstack(hists) #histogram feature data to be fed to SVM model 

希望有所帮助!