使用cv2.COLOR_BGR2GRAY或color.rgb2gray作为来自skimage的生猪描述符?

时间:2019-12-17 01:58:57

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

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

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

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

当我使用Skimage中的代码时

img_gray = color.rgb2gray(image)

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

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

当我查看来自skimage https://scikit-image.org/docs/dev/auto_examples/features_detection/plot_hog.html的以下链接时,我认为在使用HOG描述符之前不需要对图像进行归一化,因为此链接中的宇航员图像也未归一化。 不过,我仍然感到困惑。 您是否可以确认或不同意我的假设,那就是使用OpenCV的代码比将skimage的代码从rgb转换为grey更好?

完整代码:

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)

2 个答案:

答案 0 :(得分:1)

这是在[0 1]范围内进行标准化的方法,但是请确保图像具有浮点数据类型。

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

答案 1 :(得分:1)

  1. 关于灰度输入。如果您使用灰度图像作为输入。转换为float或其他方式不会 有很大的作用。这是因为如果您窥视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. 关于归一化。改善生猪产量的原因是因为标准化 就像直方图均衡一样。有效地拉伸或压缩动态范围,以便 您的图像内容得到了增强。这就是您观察此行为的原因。是预期的。