Вот рабочий код того, как вы пытались это сделать:
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 было больше удобных сообщений об ошибках, это действительно помогло бы с такими проблемами.