Как изменить изображение на градации серого, представленные в виде массива NumPy - PullRequest
0 голосов
/ 08 сентября 2018

Предисловие:

У меня есть изображение монеты. Это любое общее изображение монеты, которое я вставляю в python, и я хочу сделать эту монету изображением в градациях серого. Переменная P представляет массив, содержащий значения RGB для изображения монеты, и я считаю, что я могу превратить RGB в оттенки серого, изменив любые значения RGB в диапазоне от 128 до 0, а все значения RGB выше 128 до 255.

Ошибка:

Я пытаюсь использовать цикл for, чтобы превратить значения в массиве, сгенерированные P, в 0, 128 и 255. Когда я делаю так, я сталкиваюсь с ошибкой:

TypeError: '<' не поддерживается между экземплярами 'tuple' и 'int' ". </p>

Код:

import numpy as np
import matplotlib.pyplot as plt
P = plt.imread('coin.jpg')
for item in enumerate(P):
    if item < 128:
        item = 0
    elif item > 128:
        item = 255

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Я цитирую Википедию :

Преобразование цвета в оттенки серого

Преобразование произвольного цветного изображения в градации серого не является в общем случае уникальным; Различный вес цветовых каналов эффективно отражает эффект съемки черно-белой пленки с помощью фотографических фильтров разного цвета на камерах.

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

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

Thresholding (обработка изображений)

Thresholding - самый простой метод сегментации изображения. Из изображения в градациях серого пороговое значение можно использовать для создания двоичных изображений.

Подробнее о Оттенки серого :

0 голосов
/ 08 сентября 2018

Два вопроса. Во-первых, вы не переходите в оттенки серого. Во-вторых, весь смысл numpy в том, чтобы векторизовать и избегать циклов for, потому что они медленные.

Итак, начиная с этого изображения:

enter image description here

Вы хотите что-то вроде этого:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Load coins and convert to greyscale
grey = np.array(Image.open('coins.png').convert('L'))

# Threshold at 128
thresholded=((grey>128)*255).astype(np.uint8)

# Save
Image.fromarray(thresholded).save('result.png')

enter image description here

0 голосов
/ 08 сентября 2018

Срути V прав.enumerate () возвращает кортеж.

Таким образом, вместо if item < 128 это должно быть if item[1] < 128

Или вы можете просто полностью удалить enumerate (), если вы его не используете.Кажется, без него все будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...