Opencv 使用cv2.COLOR_BGR2GRAY或COLOR.rgb2gray作为skimage中的hog描述符?
我想训练一个支持向量机与猪特征提取的 从撇渣中提取。 图像有3个通道(RGB图像),我想在提取hog特征之前将其转换为灰度。 当我使用OpenCV中的以下代码时,问题就出现了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之间,所以这些值似乎是标准化的
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)
只是为了确认一下,你认为在提取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')