(scikit-image) Изображение визуализации HOG при сохранении выглядит черным

Я новичок в компьютерном зрении и обработке изображений и использую этот код

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

введите здесь описание изображения

У меня есть 2 вопроса:

  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, которое, как кажется, этот ответ означает, что изображение не в оттенках серого.

Наконец, еще одна полезная информация: запуск print(hog_img.dtype) на изображении возвращает float64.

А пока я продолжу отладку

Спасибо за любые мысли :)


person lampShadesDrifter    schedule 11.08.2017    source источник
comment
Совершенно очевидно, что все ваши проблемы вызваны неправильным типом данных. вам нужно преобразовать ваши данные из float64 во что-то, что могут обрабатывать алгоритмы. обратитесь к справочной документации и ошибкам утверждения.   -  person Piglet    schedule 11.08.2017


Ответы (2)


  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).

person lampShadesDrifter    schedule 11.08.2017

Если бы была такая же проблема. Но если вы заглянете в документ, они также используют это код для лучшей визуализации:

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

Но у меня все та же проблема. Визуализация с помощью matplotlib не проблема. сохранение изображения с помощью opencv (или skimage) сохраняет только черное изображение ...

person Pablo    schedule 11.08.2017