Сбой изображения в градациях серого с использованием opencv из массива numpy - PullRequest
0 голосов
/ 03 июня 2018

Я использую следующий массив numpy, который содержит черно-белое изображение со следующей формой

print(img.shape)

(28, 112)

, когда я пытаюсь отрегулировать изображение в градациях серого, чтобы использовать его для получения контуров с помощью opencv сшаги

#grayscale the image
 grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 #thredshold image
 thresh = cv2.threshold(grayed, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

Я получил следующую ошибку

<ipython-input-178-7ebff17d1c18> in get_digits(img)
      6 
      7     #grayscale the image
----> 8     grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      9 
     10 

error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:11073: error: (-215) depth == 0 || depth == 2 || depth == 5 in function cv::cvtColor

в ошибках opencv нет информации, чтобы можно было понять, что не так

1 Ответ

0 голосов
/ 03 июня 2018

Вот рабочий код того, как вы пытались это сделать:

img = np.stack((img,) * 3,-1)
img = img.astype(np.uint8)
grayed = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(grayed, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

Более простой способ получить тот же результат - инвертировать изображение самостоятельно:

img = (255-img)
thresh = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)[1]

Как вы обнаружили, при выполнении различных операций с изображениями изображение должно быть в разных форматах.

cv2.THRESH_BINARY_INV и cv2.THRESH_BINARY предназначены для получения цветного изображения (и преобразования его в оттенки серого), поэтому вам необходимо трехканальное представление.

cv2.THRESH_OTSU работает с изображениями в оттенках серого, так чтоканал в порядке для этого.

Поскольку ваше изображение с самого начала было уже в оттенках серого, вы не смогли преобразовать его из цвета в оттенки серого, и в этом не было необходимости.Я предполагаю, что вы пытались инвертировать изображение, но это достаточно просто самостоятельно (255-img).

В какой-то момент вы пытались создать cv2.THRESH_OTSU со значениями с плавающей запятой, но для cv2.THRESH_OTSU требуются целые числа между0 и 255.

Если бы в openCV было больше удобных сообщений об ошибках, это действительно помогло бы с такими проблемами.

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