Изменение формы изображения не работает в подушке для серого изображения? - PullRequest
0 голосов
/ 16 апреля 2020

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

from PIL import Image
import numpy as np
def load_image_into_numpy_array(image):
    (im_width, im_height) = image.size
    return np.array(image).reshape((im_height, im_width, 3)).astype(np.uint8)

image_path="color.jpg"
image = Image.open(image_path)
image_np = load_image_into_numpy_array(image)
image.close()

Это рабочее изображение color.jpg

enter image description here

Это не рабочее изображение grey.jpg

enter image description here

Обе формы изображения 'одинаковы.

image.size

(714, 714)

Когда я печатал изображение, я обнаружил разницу.

Рабочее изображение print(image)

 <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=714x714 at 0x7F95DB4D4BA8>

не рабочее изображение print(image)

 <PIL.JpegImagePlugin.JpegImageFile image mode=L size=714x714 at 0x7F32B5430BA8>
  1. как решить проблему?
  2. Это из-за смены режима?

Любая помощь будет полезна.

Ошибка:

Traceback (most recent call last):
  File "checker.py", line 11, in <module>
    image_np = load_image_into_numpy_array(image)
  File "checker.py", line 5, in load_image_into_numpy_array
    return np.array(image).reshape((im_height, im_width, 3)).astype(np.uint8)
ValueError: cannot reshape array of size 509796 into shape (714,714,3)

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Вам не нужно менять форму. Если вам нужно 3-канальное изображение в массиве Numpy, просто сделайте:

import numpy as np
from PIL import Image

# Open image as PIL Image and ensure 3-channel RGB
im = Image.open('input.jpg').convert('RGB')

# Make into Numpy array
na = np.array(im)

Вам также может пригодиться этот ответ о палитре изображений.

1 голос
/ 16 апреля 2020

Эта функция не будет работать на изображениях в градациях серого, вам нужно отредактировать количество каналов в последнем измерении до (IM_HEIGHT, IM_WIDTH, 1). Это потому, что вы больше не используете цветовые каналы RGB.

Попробуйте:

def load_image_into_numpy_array(image):
    (im_width, im_height) = image.size
    return np.array(image).reshape((im_height, im_width, 1)).astype(np.uint8)
0 голосов
/ 16 апреля 2020

Другой простой идеей было бы объединить изображение в оттенках серого трижды вдоль размера канала (т.е. оси 2), если входящее изображение имеет кортеж формы длины 2, как в вашем случае:

def load_image_into_numpy_array(image):
    if len(image.shape) == 2:
        image = image[:, :, np.newaxis]
        image = np.concatenate([image]*3, axis=2)
    return np.array(image).astype(np.uint8)
...