#python #numpy #image-processing #colors
Вопрос:
У меня есть небольшой вопрос, надеюсь, вы, ребята, сможете мне помочь. Я знаю, что для преобразования изображения RGB в оттенки серого без использования numpy мы можем использовать:
img = cv2.imread(input_file, cv2.IMREAD_COLOR)
r, g, b = img[:, :, 0], img[:, :, 1], img[:, :, 2]
img_gray = 0.2989 * r 0.5870 * g 0.1140 * b
Теперь я хочу прочитать изображение по шкале BGR , а затем преобразовать это изображение BGR в оттенки серого, не используя cv2.COLOR_BGR2GRAY
, как я могу это сделать с помощью аналогичного кода выше?
Комментарии:
1. Я не понимаю. Вы уже не пользуетесь
COLOR_BGR2RGB
?2. Отредактированный. Извинись за неправильный набор текста.
3. Я все еще не понимаю. Ваш код не использует
cv2.COLOR_BGR2GRAY
ни то, ни другое — вы, конечно, уже достигли своей заявленной цели?4. Я думал, что приведенный выше код предназначен для чтения и преобразования изображения RGB в серую шкалу. На самом деле я хочу знать то же самое для BGR в серой шкале.
Ответ №1:
OpenCV будет считывать файл в память в порядке BGR, даже если он находится в RGB на диске. Просто так это работает. Поэтому вам нужно изменить свою вторую строку на:
b, g, r = img[:, :, 0], img[:, :, 1], img[:, :, 2]
Тогда ваша третья строка будет работать правильно, хотя вы можете захотеть сделать 8-разрядные целые числа без знака с:
img_gray = (0.2989 * r 0.5870 * g 0.1140 * b).astype(np.uint8)
Кстати, вы могли бы на самом деле сделать это быстрее с numpy
помощью такого:
import numpy as np
grey = np.dot(img[...,::-1], [0.299, 0.587, 0.114]).astype(np.uint8)