【问题标题】:Resize an image for Histogram of Gradient调整梯度直方图的图像大小
【发布时间】:2015-06-07 14:33:45
【问题描述】:

我有一个高度为 150 像素,宽度为 188 像素的图像。我将在这张图片上计算 HOG。由于此描述符需要检测器窗口(图像)的大小为 64x128,我是否应该将图像大小调整为 64x128,然后使用此描述符?像这样:

 Image<Gray, Byte> GrayFrame = new Image<Gray, Byte>(_TrainImg.Size);
 GrayFrame = GrayFrame.Resize(64, 128, INTER.CV_INTER_LINEAR);

我担心调整大小可能会改变原始渐变方向,具体取决于调整大小的方式,因为我们忽略了图像的纵横比?

顺便说一句,图片被裁剪了,我不能再裁剪了。这意味着这是裁剪后图像的大小,这是我的最终边界框。

【问题讨论】:

  • 我对这个函数不是很熟悉,但是在 matlab 中我只是在 797x1300 大小的图像上运行它,没有任何问题。调整大小对我来说听起来不合适。您确定文档不是在谈论它产生的直方图的 bin 计数吗? 64 和 128 似乎是灰度图像的标准直方图 bin 大小。
  • 是的,我查看了 opencv 中的文档hogdescriptor 并没有发现任何相关内容。我也看了猪文章This Paper,但没有提到这一点

标签: matlab opencv image-processing computer-vision image-resizing


【解决方案1】:

很遗憾,openCV HoGDescriptor 文档丢失了。

在 openCV 中,您可以更改检测窗口、单元格大小、blockStride 和块大小的值。

cv::HOGDescriptor hogDesc;

hogDesc.blockSize = cv::Size(2*binSize, 2*binSize);
hogDesc.blockStride = cv::Size(binSize, binSize);
hogDesc.cellSize = cv::Size(binSize, binSize);
hogDesc.winSize = cv::Size(imgWidth, imgHeight);

然后使用提取特征

std::vector<float> descriptors;
std::vector<cv::Point> locations;
hogDesc.compute(img, descriptors, cv::Size(0,0), cv::Size(0,0), locations);

注意:

  1. 我猜想,winSize 必须能被 blockSize 整除,blockSize 必须能被 cellSize 整除。
  2. 特征的大小取决于所有这些变量,因此请确保使用相同大小的图像并且不要更改设置以免遇到麻烦。

【讨论】:

  • 非常感谢 LSA。你的意思是我不需要改变我的图像的大小,我可以定义块大小和单元格大小以及其他一些适合我图像大小的值?我说的对吗?
  • 顺便说一句,训练集包含许多不同大小的图像。我该怎么办?我应该调整所有的大小?或者我可以对具有不同参数的图像执行 hog
  • 是的,您可以更改窗口大小等以适合您的图像大小。但问题是,描述符大小随所有变量(图像大小、单元大小等)而变化。所以当然你可以提取这些不同大小的特征,但是如何比较它们呢?
  • 好点!其实我不知道。你知道我有一个不同大小的不同图像的训练集,我想提取他们的 HOGs 然后比较它们,但我不知道如何:-(
  • 你要达到什么目标?如果在这些图像中有一些大小相似的对象(以像素计),那么您可以使用足够小以适合每个训练图像的补丁(通常选择对象的大小)并使用滑动窗口方法.顺便说一句,这就是为什么原始检测窗口的大小为 128x64 的原因,发明者想要检测图像中的人,这些人可以被那个大小的盒子包围。
猜你喜欢
  • 2018-05-31
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多