почему cv2.imread меняет значения пикселей? - PullRequest
0 голосов
/ 11 декабря 2018

Недавно я заметил, что cv2.imread изменяет значения пикселей изображений.Я делаю сегментацию, поэтому значения пикселей важны, так как разные значения пикселей показывают разные метки.Я использую приведенный ниже код, и здесь мои входные изображения замаскированы черно-белыми изображениями (значения пикселей равны только 0 и 1, поскольку я читаю их в matlab, чтобы убедиться.) Но когда я печатаю значения пикселей original_mask, я вижу, что значения пикселейбыл изменен и имеет множество различных значений.Любая помощь очень ценится.Более того, когда я печатаю original_image.shape, я вижу, что изображение RGB, то есть имеет 3 канала (k, k, 3), а не 1 канал !!!!

        original_mask = cv2.imread(mask_dir + '/'+lists.iloc[i, 0] + '.png')
        print(original_mask, "original_masklllll")
        print(original_mask.shape, "original_mask")
        resized_mask = cv2.resize(original_mask, (256, 256))
        print(resized_mask.shape, "resized_mask")
        print(resized_mask, "resized_mask")
        print(resized_mask[:, :, 0], "resized_mask[:, :, 0]")

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Второй аргумент по умолчанию cv2.imread() ведет к 3-канальному изображению.В случае одноканального исходного изображения передача

img = cv2.imread(path, cv2.IMREAD_UNCHANGED)

или, в случае произвольного изображения, передача

img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)

приведет к одному каналу.

0 голосов
/ 11 декабря 2018

Вам необходимо использовать cv2.INTER_NEAREST в качестве входа для вызова изменения размера.В противном случае вы будете интерполировать значения между пикселями, что не является желаемым поведением.Подробнее здесь .

cv2.resize(original_mask, (256,256),interpolation=cv2.INTER_NEAREST)

Что касается 3 каналов, то все они должны содержать одинаковое значение, поэтому вы можете выделить один канал с помощью original_mask[...,0] или использовать cv2.IMREAD_GRAYSCALEв звонилке cv2.imread.

...