Преобразование 1-слойного изображения в 3-слойное изображение - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь преобразовать 1-слойное изображение (в оттенках серого) в 3-слойное изображение RGB. Ниже приведен код, который я использую. Это работает без ошибок, но не создает правильный результат.

from PIL import Image  # used for loading images

def convertLToRgb(img):
    height = img.size[1]
    width = img.size[0]
    size = img.size
    mode = 'RGB'
    data = np.zeros((height, width, 3))
    for i in range(height):
        for j in range(width):
            pixel = img.getpixel((j, i))
            data[i][j][0] = pixel
            data[i][j][1] = pixel
            data[i][j][2] = pixel
    img = Image.frombuffer(mode, size, data)
    return img

Что я здесь не так делаю? Я не ожидаю цветного изображения, но я ожидаю черно-белого изображения, напоминающего ввод. Ниже приведены входные и выходные изображения:

enter image description here enter image description here

Ответы [ 3 ]

0 голосов
/ 18 января 2019

В зависимости от битовой глубины вашего изображения, измените:

data = np.zeros((height, width, 3))

до:

data = np.zeros((height, width, 3), dtype=np.uint8)

Для 8-битного изображения вам нужно принудительно установить dtype массива Numpy в 8-битное целое число без знака, в противном случае по умолчанию используется значение float64. Для 16-битных используйте np.uint16 и т. Д.

0 голосов
/ 18 января 2019

Вы можете сделать это с PIL.Image и PIL.ImageOps, как показано ниже. Из-за того, как оно написано, исходное изображение не обязательно должно быть одним слоем - оно преобразует его в один, если необходимо, перед его использованием:

from PIL import Image
from PIL.ImageOps import grayscale

def convertLToRgb(src):
    src.load()   
    band = src if Image.getmodebands(src.mode) == 1 else grayscale(src)
    return Image.merge('RGB', (band, band, band))

src = 'whale_tail.png'
bw_img = Image.open(src)
rgb_img = convertLToRgb(bw_img)
rgb_img.show()
0 голосов
/ 18 января 2019

Какова ваша задача? черно-белое изображение или цветное изображение RGB. Если вы хотите преобразовать серое изображение в черно-белое изображение. Вы можете напрямую преобразовать изображение в двоичное изображение. Что касается вашего кода, две вещи, которые вам нужно заботиться. Во-первых, расположение пикселя правильное, неправильное расположение сделает изображение полностью черным, как ваш пост. Во-вторых, вы можете напрямую преобразовать только RGB в изображение в градациях серого, но вы не можете напрямую преобразовать изображение в градациях серого в RGB, поскольку оно может быть неточным.

...