使用 cv2.COLOR_BGR2GRAY 或 color.rgb2gray 作为 skimage 的猪描述符?
Using cv2.COLOR_BGR2GRAY or color.rgb2gray for hog descriptor from skimage?
我想用由
来自 skimage 的猪描述符。
这些图像有 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 查看以下 link 时,我假设在使用 HOG 描述符之前不需要对图像进行归一化,因为这个 [=35] 中的宇航员图像=] 也没有规范化。
尽管如此,我还是觉得很困惑。
您能否确认或不同意我的假设,即使用 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)
这是在 [ 0 1] 范围内进行归一化的方法,但要确保图像具有浮点数据类型。
img_gray_normalized = cv2.normalize(img_gray , None, alpha=0, beta=1,
norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
关于灰度输入。如果您使用灰度图像作为输入。转换为浮点数或其他方式不会
有很大的作用。这是因为如果你窥视一下 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')
关于规范化。这是提高你的生猪输出的原因是因为规范化
就像直方图均衡一样。有效地拉伸或压缩动态范围,使
您的图像内容得到增强。这就是您观察到这种行为的原因。符合预期。
我想用由 来自 skimage 的猪描述符。 这些图像有 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 查看以下 link 时,我假设在使用 HOG 描述符之前不需要对图像进行归一化,因为这个 [=35] 中的宇航员图像=] 也没有规范化。 尽管如此,我还是觉得很困惑。 您能否确认或不同意我的假设,即使用 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)
这是在 [ 0 1] 范围内进行归一化的方法,但要确保图像具有浮点数据类型。
img_gray_normalized = cv2.normalize(img_gray , None, alpha=0, beta=1,
norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
关于灰度输入。如果您使用灰度图像作为输入。转换为浮点数或其他方式不会 有很大的作用。这是因为如果你窥视一下 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')
关于规范化。这是提高你的生猪输出的原因是因为规范化 就像直方图均衡一样。有效地拉伸或压缩动态范围,使 您的图像内容得到增强。这就是您观察到这种行为的原因。符合预期。