【问题标题】:Using cv2.COLOR_BGR2GRAY or color.rgb2gray for hog descriptor from skimage?使用 cv2.COLOR_BGR2GRAY 或 color.rgb2gray 作为来自 skimage 的 hog 描述符?
【发布时间】:2020-04-09 12:08:13
【问题描述】:

我想训练一个具有 hog 特征的 SVM 来自 skimage 的 hog 描述符。 这些图像有 3 个通道(RGB 图像),我想在提取 hog 特征之前将其转换为灰度。 这就是问题所在,当我使用 OpenCV 中的以下代码时

img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

然后我得到未归一化的特征,这意味着像素值仍在 0 到 255 之间。

当我使用来自 Skimage 的代码时

img_gray = color.rgb2gray(image)

然后这些值似乎被归一化,因为像素值约为。介于 0 和 1 之间。

我尝试了两个版本的 hog 特征提取,结果相似但不一样,当我训练 SVM 时,结果也相似但不一样。当我用归一化图像训练 SVM 时,精度等会好一些,但不会很多。

当我查看来自 skimage https://scikit-image.org/docs/dev/auto_examples/features_detection/plot_hog.html 的以下链接时,我假设在使用 HOG 描述符之前不需要对图像进行标准化,因为此链接中的宇航员图像也未标准化。 不过,我觉得这很混乱。 您能否确认或不同意我的假设,即使用 OpenCV 的代码比使用 skimage 的代码从 rgb 转换为灰色更好?

完整代码:

import cv2
img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY

from skimage import color
img_gray = color.rgb2gray(image)

之前

from skimage import feature
feat = feature.hog(img_gray, orientations=12, pixels_per_cell=(5,5), cells_per_block=(2,2), transform_sqrt=True, visualize=False)

【问题讨论】:

    标签: opencv svm normalization feature-extraction scikit-image


    【解决方案1】:
    1. 关于灰度输入。如果您使用灰度图像作为输入。转换为浮动或其他方式不会 有很大的作用。这是因为如果您查看 skimage 的实现。 您会注意到,如果输入是灰度的,它会在内部转换为浮点图像。 见skimage hog implementation here

       if image.dtype.kind == 'u':
              # convert uint image to float
              # to avoid problems with subtracting unsigned numbers
              image = image.astype('float')
      
    2. 关于标准化。这提高了您的生猪产量的原因是因为标准化 就像直方图均衡一样。有效地拉伸或压缩动态范围,使 您的图像内容得到增强。这就是您观察此行为的原因。意料之中。

    【讨论】:

    • 只有我真正理解它。关于第 2 点:这是否意味着块归一化,而不是在提取 hog 特征之前对图像进行归一化?如果是这种情况,那么无论我使用上述哪个函数(OpenCV 或 skimage)将 rgb 转换为灰度?
    • 是的。没错。块归一化是在局部级别进行这种拉伸。虽然标准化是在整个图像上进行的,即全局。
    【解决方案2】:

    这是如何在 [0 1] 范围内进行归一化,但要确保图像具有浮点数据类型。

    img_gray_normalized = cv2.normalize(img_gray , None, alpha=0, beta=1, 
                                       norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
    

    【讨论】:

    • 只是为了确认,您认为在提取HOG特征之前应该对灰度图像进行归一化吗?或者这不是多余的?
    • 从 0-255 标准化到 0-1 不会对结果产生任何影响。但是“block_norm”可以减少光线变化的影响。
    • 好的,这就解释了为什么两种方法的 HOG 特征的像素值非常相似。然后在用它们训练 SVM 之前,只需对 HOG 特征进行归一化。
    猜你喜欢
    • 2020-01-21
    • 2017-01-14
    • 2014-10-11
    • 2013-12-28
    • 1970-01-01
    • 2018-06-14
    • 2017-03-21
    • 2013-03-10
    • 2011-08-25
    相关资源
    最近更新 更多