Конвертировать RGB-изображение в черно-белое - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть следующее изображение RGB (форма (3, 50, 200)):

enter image description here

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

Я сделал (с помощью inte rnet) следующую функцию:

def rgb2gray(rgb):
    r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
    gray = (0.2989 * r + 0.5870 * g + 0.1140 * b)
    for x in range(rgb.shape[1]):
      for y in range(rgb.shape[0]):
        if gray[y][x]>128: #if bright
          gray[y][x] = 255.0 #white
        else:
          gray[y][x] = 0.0 #black
    return gray

Затем я запустил:

im = cv2.imread("samples/55y2m.png")
print(im.shape)
print(rgb2gray(im).shape)
plt.imshow(rgb2gray(im))

И получил следующий вывод:

(50, 200, 3) #for the input
(50, 200)    #for the output

Почему изображение желтого и фиолетового, и как я могу изменить его на черный и белый?

ps Я попытался изменить функцию на:

def rgb2gray(rgb):
    r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
    gray = (0.2989 * r + 0.5870 * g + 0.1140 * b)

    for x in range(rgb.shape[1]):
      for y in range(rgb.shape[0]):
        if gray[y][x]>128:
          rgb[y][x] = 255.0 #changed
        else:
          rgb[y][x] = 0.0 #changed
    return rgb #changed

И я действительно получил чисто черно-белое изображение, но это было 3 канала (RGB). Поэтому я попытался удалить последнюю ось и снова получил пурпурный и желтый цвета.

enter image description here

1 Ответ

3 голосов
/ 14 апреля 2020

Вам это не нужно:

r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
gray = (0.2989 * r + 0.5870 * g + 0.1140 * b)

, поскольку ваше изображение уже в градациях серого, что означает R == G == B, поэтому вы можете выбрать ЗЕЛЕНЫЙ канал (или любой другой, если хотите) и использовать его.

И да, укажите цветовую карту для matplotlib:

plt.imshow(im[:,:,1], cmap='gray')
...