逐像素编辑图像 - Python

时间:2018-06-12 17:44:37

标签: python image

我有两张图片,一张叠加图片和一张背景图片。 我想创建一个新图像,通过编辑叠加图像并对其进行操作以仅显示背景图像中具有蓝色的像素。 我不想添加背景,它只是用于选择像素。 休息部分应该是透明的。 有什么提示或想法吗? PS:我用油漆编辑了结果图像,所以它并不完美。

图像1是背景图像。

图像2是叠加图像。

图像3是我想要执行的检查。 (找出哪些像素在背景中具有蓝色并使剩余像素透明)

图像4是编辑后的结果图像。

background overlay check result

1 个答案:

答案 0 :(得分:1)

我根据自己的思维方式重命名了您的图片,因此我将其视为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)您的图片已存在(未使用的)Alpha通道。

b)任何行开始:

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

只是修改第4个通道,即图像的alpha /透明通道