#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 возможных решения:
- Сделайте параметром функции путь к изображению вместо самого изображения, а затем сохраните изображение в том же каталоге и ничего не возвращайте.
- Оставайтесь последовательными, и перед передачей функции изображения в качестве параметра загрузите его с помощью библиотеки PILLOW, а при его возврате обращайтесь к возвращаемому изображению только в терминах библиотеки PILLOW.
Комментарии:
1. В этом мы манипулируем
image_data
. Как я могу вернуть измененное изображение из моей функции?2. Разве не сработало просто использовать: ‘return image’ вместо: ‘image.save (…)’ ?
3. Не могли бы вы посмотреть обновленный qs? Метод работает индивидуально, но не с тем, как я хочу читать изображения.
4. Да, я могу. Я просто отредактировал свой собственный ответ в качестве ответа.
5. Спасибо. Я наткнулся на другое решение (которое я добавил в qs). Я действительно не понимаю, как работает индекс. Не могли бы вы взглянуть?