Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
Opencv 使用cv2.COLOR_BGR2GRAY或COLOR.rgb2gray作为skimage中的hog描述符?_Opencv_Svm_Normalization_Feature Extraction_Scikit Image - Fatal编程技术网

Opencv 使用cv2.COLOR_BGR2GRAY或COLOR.rgb2gray作为skimage中的hog描述符?

Opencv 使用cv2.COLOR_BGR2GRAY或COLOR.rgb2gray作为skimage中的hog描述符?,opencv,svm,normalization,feature-extraction,scikit-image,Opencv,Svm,Normalization,Feature Extraction,Scikit Image,我想训练一个支持向量机与猪特征提取的 从撇渣中提取。 图像有3个通道(RGB图像),我想在提取hog特征之前将其转换为灰度。 当我使用OpenCV中的以下代码时,问题就出现了 img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 然后我得到了未标准化的特征,这意味着像素值仍然在0到255之间 当我使用Skimage中的代码时 img_gray = color.rgb2gray(image) 因为像素值大约在0和1之间,所以这些值似乎是标准化的

我想训练一个支持向量机与猪特征提取的 从撇渣中提取。 图像有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中查看以下链接时,我假设在使用HOG描述符之前,图像不需要标准化,因为此链接中的宇航员图像也没有标准化。 尽管如此,我还是感到困惑。 您是否可以确认或不同意我的假设,即使用OpenCV的代码比使用skimage的代码更好地将rgb转换为灰色

完整代码:

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

以前

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)

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

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

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

img_gray_normalized = cv2.normalize(img_gray , None, alpha=0, beta=1, 
                                   norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
  • 关于灰度输入。如果使用灰度图像作为输入。转换为float或其他方式将不起作用 影响很大。这是因为如果你窥视一下skimage的实现。 您会注意到,如果输入为灰度,则会在内部转换为浮点图像。 看

  • 关于正常化。这提高了猪产量的原因是因为标准化 就像直方图均衡化一样。有效地拉伸或压缩动态范围,以便 您的图像内容已增强。这就是你观察这种行为的原因。这是意料之中的

  • 关于灰度输入。如果使用灰度图像作为输入。转换为float或其他方式将不起作用 影响很大。这是因为如果你窥视一下skimage的实现。 您会注意到,如果输入为灰度,则会在内部转换为浮点图像。 看

  • 关于正常化。这提高了猪产量的原因是因为标准化 就像直方图均衡化一样。有效地拉伸或压缩动态范围,以便 您的图像内容已增强。这就是你观察这种行为的原因。这是意料之中的


  • 只是为了确认一下,你认为在提取HOG特征之前应该对灰度图像进行归一化吗?或者这不是多余的?从0-255标准化为0-1不会对结果产生任何影响。但是“块_norm”可以减少光线变化的影响。好的,这解释了为什么两种方法的HOG特征的像素值非常相似。然后,在用HOG特征训练SVM之前,只需要对HOG特征进行归一化。为了确认,您认为在提取HOG特征之前,灰度图像应该进行归一化吗?或者这不是多余的?从0-255标准化为0-1不会对结果产生任何影响。但是“块_norm”可以减少光线变化的影响。好的,这解释了为什么两种方法的HOG特征的像素值非常相似。然后,在用HOG特征训练SVM之前,只需要对HOG特征进行标准化,我才真正理解它。关于第2点:这是否意味着在提取hog特征之前对图像进行块标准化而不是标准化?如果是这种情况,那么无论我使用上述哪一个函数(OpenCV或skimage)将rgb转换为灰度?是的。没错。块归一化是在局部级别进行拉伸。而标准化则是对整个图像(即全球图像)进行的,只是我真正理解了它。关于第2点:这是否意味着在提取hog特征之前对图像进行块标准化而不是标准化?如果是这种情况,那么无论我使用上述哪一个函数(OpenCV或skimage)将rgb转换为灰度?是的。没错。块归一化是在局部级别进行拉伸。而标准化则在整个图像(即全局图像)上实现。
     if image.dtype.kind == 'u':
            # convert uint image to float
            # to avoid problems with subtracting unsigned numbers
            image = image.astype('float')