【问题标题】:(scikit-image) HOG visualization image appears black when saved(scikit-image) HOG 可视化图像在保存时显示为黑色
【发布时间】:2018-01-19 19:22:45
【问题描述】:

我是计算机视觉和图像处理的新手,正在使用此代码

from skimage.feature import hog
hog_list, hog_img = hog(test_img_gray, 
                        orientations=8, 
                        pixels_per_cell=(16, 16), cells_per_block=(1, 1),
                        block_norm='L1', 
                        visualise=True,
                        feature_vector=True)
plt.figure(figsize=(15,10))
plt.imshow(hog_img)

获取此 HOG 可视化图像

此时我有两个问题:

  1. 当我尝试保存此图像(作为 .pdf 或 .jpg)时,生成的图像是纯黑色的。将此图像转换为 PIL 格式并使用检查它

    hog_img_pil = Image.fromarray(hog_img) hog_img_pil.show()

仍将图像显示为纯黑色。为什么会发生这种情况,我该如何解决?

  1. 当我尝试运行这段代码时

    hog_img = cv2.cvtColor(hog_img, cv2.COLOR_BGR2GRAY)

要将图像转换为灰度,我收到错误error: (-215) depth == CV_8U || depth == CV_16U || depth == CV_32F in function cvtColor。我需要做什么才能让这张图片变成灰度图,为什么会这样?

作为附加信息,运行 hog_img.shape 会返回 (1632, 1224),这只是图像的大小,我最初将其解释为图像已经处于灰度状态(因为它似乎缺少用于颜色通道)。但是,当我尝试运行时

test_img_bw = cv2.adaptiveThreshold(
    src=hog_img, 
    maxValue=255, 
    adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
    thresholdType=cv2.THRESH_BINARY, 
    blockSize=115, C=4)

我收到错误error: (-215) src.type() == CV_8UC1 in function adaptiveThreshold this 的答案似乎表明图像不是灰度。

最后,还有一点有用的信息是,在图像上运行print(hog_img.dtype) 会返回float64

在此期间我会继续调试

感谢您的任何想法:)

【问题讨论】:

  • 很明显,您的所有问题都是由错误的数据类型引起的。您必须将数据从 float64 转换为算法可以处理的数据。请参阅参考文档和断言错误。

标签: python image opencv computer-vision scikit-image


【解决方案1】:
  1. 使用hog_img_inv = cv2.bitwise_not(hog_img) 反转图像并使用 plt.figure(figsize=(15,10)) plt.imshow(hog_img_uint8_inv) 表明这些线条实际上存在但非常微弱(为了完整起见,我在此处包含了图像,但您可以看到它(但相信我,它就在那里))。我将不得不对图像进行更多处理以使线条更容易区分。

  2. 运行print(hog_img.dtype) 表明dtype 是float64,而(我认为)它应该是uint8。我通过运行hog_img_uint8 = hog_img.astype(np.uint8) 解决了这个问题,这似乎解决了将图像传递给其他算法(例如cv2.adaptiveThreshold)的问题。

【讨论】:

    【解决方案2】:

    如果有同样的问题。但是,如果您查看 docu 内部,他们也会使用此代码进行更好的可视化:

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

    但我仍然有同样的问题。使用 matplotlib 进行可视化没有问题。用opencv(或skimage)保存图像只会保存黑色图像...

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多