Ошибка типа данных в функции opencv equalizeHist - PullRequest
0 голосов
/ 04 июня 2019

Учитывая изображение, читаемое cv2.readimg() следующим образом:

cv2.imread(path)

и затем при вызове cv2.equalizeHist происходит следующая ошибка:

Traceback (most recent call last):
    hist = cv2.equalizeHist(cv_image)
cv2.error: OpenCV(4.1.0) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/histogram.cpp:3345: error: (-215:Assertion failed) _src.type() == CV_8UC1 in function 'equalizeHist'

Я прочитал и применил ответы на этот вопрос и этот один. Вот код, использованный в ответе first :

  import cv2
  removedNoise = cv2.medianBlur(img,3)
  removedNoise1 = np.uint8(removedNoise)
  hist = cv2.equalizeHist(cv_image)

Вот тот же код, модифицированный для попытки ответа second :

  from skimage import img_as_ubyte
  cv_image = img_as_ubyte(removedNoise)
  hist = cv2.equalizeHist(cv_image)

В обоих случаях возникает одна и та же исходная ошибка. Консультации о том, как решить эту проблему, будут оценены. Я использую opencv 4.1.0 на macos.

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

В прикрепленной трассировке указано, что:

(- 215: утверждение не выполнено) _src.type () == CV_8UC1 в функции 'equalizeHist'

В котором говорится, что входной аргумент cv2. equalizeHist() должен быть изображением одного канала. По умолчанию cv2.imread() возвращает 3-канальное изображение BGR, даже если это изображение в градациях серого. Вы можете попробовать одно из следующих предложений, чтобы исправить эту ошибку:

  1. cv2.imread("path/to/img.png", cv2.IMREAD_GRAYSCALE)

  2. cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

1 голос
/ 04 июня 2019

equalizeHist в opencv принимает аргумент src, где src должен быть 8-битным одноканальным изображением.

В вашем коде вы читаете изображение как 3-канальное изображение или BGR. Вы можете прочитать изображение как GrayScale, например,

img = cv2.imread(path, 0)

Передача этого изображения в equalizeHist, как показано ниже, даст желаемый результат.

hist = cv2.equalizeHist(img)

Дополнительную информацию вы можете найти в документации здесь .

0 в imread - это флаг, обозначающий тип цвета изображения. Вы можете прочитать больше о flags здесь .

0 голосов
/ 05 июня 2019

Почему бы не использовать Python Wand (который основан на Imagemagick)? Вот пример выравнивания гистограммы всего за несколько строк кода.

Введите:

enter image description here

#!/bin/python3.7

from wand.image import Image

with Image(filename='zelda.png') as img:
    img.equalize()
    img.save(filename='zelda_equalize.png')


enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...