面向渐变的Python直方图

时间:2017-07-06 17:28:38

标签: python image-processing scikit-image

我正在尝试实现this版本的Oriented Gradients(HOG)直方图。我的代码如下。我的代码唯一的区别是我使用opencv来读取图像并将其转换为灰度。

import cv2
import matplotlib.pyplot as plt
from skimage.feature import hog
from skimage import data, color, exposure

filename = 'match1/hockey15.jpg'
im = cv2.imread(filename)
gr = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 

print im.shape
image = gr

fd, hog_image = hog(image, orientations=8, pixels_per_cell=(16, 16),
                    cells_per_block=(1, 1), visualise=True)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True)

ax1.axis('off')
ax1.imshow(image, cmap=plt.cm.gray)
ax1.set_title('Input image')
ax1.set_adjustable('box-forced')

# Rescale histogram for better display
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 0.02))

ax2.axis('off')
ax2.imshow(hog_image_rescaled, cmap=plt.cm.gray)
ax2.set_title('Histogram of Oriented Gradients')
ax1.set_adjustable('box-forced')
plt.show()

示例输入和输出是:

输入:

enter image description here

输出:

enter image description here

为什么输出如此混乱?我甚至在上面的skimage链接中尝试了宇航员的图像。对于这一点,我得到了很多混乱,输出完全不像链接中显示的那样。我怎样才能解决这个问题?

3 个答案:

答案 0 :(得分:1)

我可以使用您的代码重现您的错误,并获得相同的混乱图像。我稍微修改了你的代码,特别是改变了轴,我得到了以下输出。

enter image description here

这是修改后的代码。

import cv2
import matplotlib.pyplot as plt
from skimage.feature import hog
from skimage import data, color, exposure

filename = r"pathtoimage\hockey.jpg"

im = cv2.imread(filename)

gr = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 

print im.shape
image = gr

fd, hog_image = hog(image, orientations=8, pixels_per_cell=(16, 16),
                    cells_per_block=(1, 1), visualise=True)

fig, ax = plt.subplots(1, 2, figsize=(20, 10), sharex=True, sharey=True)

ax[0].axis('off')
ax[0].imshow(image, cmap=plt.cm.gray)
ax[0].set_title('Input image')
ax[0].set_adjustable('box-forced')

# Rescale histogram for better display
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 0.02))

ax[1].axis('off')
ax[1].imshow(hog_image, cmap=plt.cm.gray)
ax[1].set_title('Histogram of Oriented Gradients')
ax[1].set_adjustable('box-forced')

plt.show()

答案 1 :(得分:0)

我不确定为什么,但错误是由于读取图像并使用opencv将其转换为灰度。像教程建议的那样同时使用matplotlib,可以得到正确的结果。

答案 2 :(得分:0)

只需将值0.02更改为0.5。这将使它变暗。

hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 0.02))

更改为

hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0, 0.5))