Преобразование изображения в оттенки серого - PullRequest
0 голосов
/ 01 ноября 2018

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

image = cv2.imread('lenna.jpg')
gray = cv2.cvtColor(image, cv2.IMREAD_GRAYSCALE)

gray1 = rgb2gray(image)

gray2 = cv2.imread('lenna.jpg', cv2.IMREAD_GRAYSCALE)

image1 = Image.open('lenna.jpg', 'r')
gray3 = image1.convert('L')

Когда я рисую их, я получаю их в синей шкале, зеленой шкале, зеленой шкале и сером соответственно. Когда я должен использовать каждый из них?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы столкнулись с ситуацией, когда система типов Python не защищает вас так, как это делает C ++.

cv2.IMREAD_GRAYSCALE и cv2.COLOR_BGR2GRAY являются значениями из различных перечислений. Первый, чье числовое значение равно 0, относится к cv2.imread(). Последний, числовое значение которого равно 6, относится к cv2.cvtColor(). C ++ сказал бы вам, что cv2.IMREAD_GRAYSCALE нельзя передать на cv2.cvtColor(). Python спокойно принимает соответствующее значение типа int.

Таким образом, вы думаете , что вы просите cv2 преобразовать цветное изображение в серое, но, передавая cv2.IMREAD_GRAYSCALE, cv2.cvtColor() видит значение 0 и думает, что вы передаете cv2.COLOR_BGR2BGRA , Вместо изображения в оттенках серого вы получите исходное изображение с добавленным альфа-каналом.

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

- это то, что вам нужно.

Другая проблема, с которой вы сталкиваетесь, предполагая, что вы используете ноутбук Jupyter, заключается в том, что cv2 накладывает слои цвета в порядке BGR вместо RGB. Чтобы отобразить их правильно, сначала выполните

image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

и затем отобразить результат.

0 голосов
/ 01 ноября 2018

Изображения, которые не являются серыми, являются все еще трехмерными массивами, то есть они все еще каким-то образом сохраняют информацию о цвете, причина, по которой вы видите синий и зеленый цвета, состоит в том, что в этих трехмерных массивах красный и зеленый каналы в первом случае и синий и красный каналы во втором были уменьшены до 0, оставив только синий и зеленый, которые вы видите.

Чтобы прочитать изображение в градациях серого, вы должны использовать

img_gray=cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

В результате получится двумерный массив со значениями от 0 до 255, которые соответствуют яркости пикселя, а не яркости каждого из 3 цветовых каналов пикселя.

...