Редактировать изображение попиксельно - Python - PullRequest
0 голосов
/ 12 июня 2018

У меня есть два изображения, одно наложение и один фон.Я хочу создать новое изображение, отредактировав оверлейное изображение и манипулируя им, чтобы показать только пиксели, которые имеют синий цвет на фоновом изображении.Я не хочу добавлять фон, это только для выбора пикселей.Остальная часть должна быть прозрачной.Любые намеки или идеи, пожалуйста?PS: я отредактировал результат изображения с краской, так что это не идеально.

Изображение 1 является фоновым изображением.

Изображение 2 является наложенным изображением.

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

Изображение 4 - это результат изображения после редактирования.

backgroundoverlaycheckresult

1 Ответ

0 голосов
/ 14 июня 2018

Я переименовал ваши изображения в соответствии со своим мышлением, поэтому я принял это как image.png:

enter image description here

и это mask.png:

enter image description here

Тогда я сделал то, что, как я думаю, вы хотите, следующим образом.Я написал это довольно многословно, чтобы вы могли видеть все шаги по пути:

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

# Open input images
image = Image.open("image.png")
mask  = Image.open("mask.png")

# Get dimensions
h,w=image.size

# Resize mask to match image, taking care not to introduce new colours (Image.NEAREST)
mask = mask.resize((h,w), Image.NEAREST)    
mask.save('mask_resized.png')

# Convert both images to numpy equivalents
npimage = np.array(image)
npmask  = np.array(mask)

# Make image transparent where mask is not blue
# Blue pixels in mask seem to show up as RGB(163 204 255)
npimage[:,:,3] = np.where((npmask[:,:,0]<170) & (npmask[:,:,1]<210) & (npmask[:,:,2]>250),255,0).astype(np.uint8)

# Identify grey pixels in image, i.e. R=G=B, and make transparent also
RequalsG=np.where(npimage[:,:,0]==npimage[:,:,1],1,0)
RequalsB=np.where(npimage[:,:,0]==npimage[:,:,2],1,0)
grey=(RequalsG*RequalsB).astype(np.uint8)
npimage[:,:,3] *= 1-grey

# Convert numpy image to PIL image and save
PILrgba=Image.fromarray(npimage)
PILrgba.save("result.png")

И вот результат:

enter image description here


Примечания:

a) На вашем изображении уже есть (неиспользованный) альфа-канал.

b) Любые строки начинаются с:

npimage[:,:,3] = ...

просто изменяют 4-й канал, то есть канал альфа / прозрачности изображения

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