удаление определенного цвета из изображения

#python #machine-learning #computer-vision #rgb #scikit-image

#python #машинное обучение #компьютерное зрение #rgb #scikit-изображение

Вопрос:

Возможно ли удалить определенный цвет rbg из изображения? Например, я хочу создать такую функцию, чтобы я передавал изображение и цвет в качестве параметра, и она возвращала то же изображение, но без этого цвета.

Например, эта функция

функция (изображение, «R»)

должно дать мне изображение, у которого нет R оттенков. Как я могу это сделать?

В настоящее время работает что-то вроде этого:

 def exclusionWithPIL(image, channel):
    out = None
    image = Image.open(image)
    image_data = image.load()
    height,width = image.size
    for loop1 in range(height):
        for loop2 in range(width):
            r,g,b = image_data[loop1,loop2]
            image_data[loop1,loop2] = 0,g,b
    return image

result = rgb_exclusion('./image.jpg', "G")
result.save('new.jpg')
  

но здесь я читаю изображение следующим Image.open(image) образом внутри функции. Вместо этого я хочу передать, image1 который уже читается следующим образом:

 image1 = load(image1_path)
  
 def load(image_path):
    out = io.imread(image_path)
    out = out.astype(np.float64) / 255
    return out
  

Как я могу соответствующим образом изменить функцию?
P.S Я использую io.imread из skimage для чтения изображений.

Редактировать: если я передам изображение, загруженное io.imread непосредственно в функцию, похоже, что-то вроде этого работает:

     out = image.copy()
    if (channel == "R"):
        out[:, :, 0] = 0
  

Но я не совсем понимаю индексы [:, :, 0]

Ответ №1:

нашел онлайн-учебник, который решает именно вашу проблему: ссылка на учебник

Основная идея их решения заключается в использовании PIL для открытия изображения, его загрузки, а затем перебора каждого пикселя изображения (с использованием 2 циклов) и установки выбранного цвета равным нулю.


РЕДАКТИРОВАТЬ: я думаю, что ваша проблема возникает из-за того, что вы пытаетесь передать функции в качестве параметра изображение, которое было загружено с помощью sicikit-image library ( io.imread() ) , а затем внутри функции вы пытаетесь использовать функции библиотеки PILLOW для того же изображения.

Вот почему это не должно работать, вы объединяете 2 разные библиотеки. На мой взгляд, есть 2 возможных решения:

  1. Сделайте параметром функции путь к изображению вместо самого изображения, а затем сохраните изображение в том же каталоге и ничего не возвращайте.
  2. Оставайтесь последовательными, и перед передачей функции изображения в качестве параметра загрузите его с помощью библиотеки PILLOW, а при его возврате обращайтесь к возвращаемому изображению только в терминах библиотеки PILLOW.

Комментарии:

1. В этом мы манипулируем image_data . Как я могу вернуть измененное изображение из моей функции?

2. Разве не сработало просто использовать: ‘return image’ вместо: ‘image.save (…)’ ?

3. Не могли бы вы посмотреть обновленный qs? Метод работает индивидуально, но не с тем, как я хочу читать изображения.

4. Да, я могу. Я просто отредактировал свой собственный ответ в качестве ответа.

5. Спасибо. Я наткнулся на другое решение (которое я добавил в qs). Я действительно не понимаю, как работает индекс. Не могли бы вы взглянуть?