我想用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)
最佳答案
有很大的作用。这是因为如果您窥视skimage的实现。
您会注意到,如果输入为灰度,则它将在内部转换为 float 图像。
参见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')
就像直方图均衡一样。有效地拉伸(stretch)或压缩动态范围,以便
您的图像内容得到了增强。这就是您观察此行为的原因。可以预料的。