我想基于某些像素值创建一个蒙版。例如:B> 200
的每个像素Image.load()方法似乎正是我要识别具有这些值的像素所需要的,但是我似乎无法弄清楚如何获取所有这些像素并从中创建蒙版图像。
R, G, B = 0, 1, 2
pixels = self.input_image.get_value().load()
width, height = self.input_image.get_value().size
for y in range(0, height):
for x in range(0, width):
if pixels[x, y][B] > 200:
print("%s - %s's blue is more than 200" % (x, y))
``
答案 0 :(得分:3)
我的意思是要避免for
循环,而只使用Numpy。因此,从这张图片开始:
from PIL import Image
import numpy as np
# Open image
im = Image.open('colorwheel.png')
# Make Numpy array
ni = np.array(im)
# Mask pixels where Blue > 200
blues = ni[:,:,2]>200
# Save logical mask as PNG
Image.fromarray((blues*255).astype(np.uint8)).save('result.png')
如果要将蒙版像素设为黑色,请使用:
ni[blues] = 0
Image.fromarray(ni).save('result.png')
您可以针对以下范围进行更复杂的复合测试:
#!/usr/bin/env python3
from PIL import Image
import numpy as np
# Open image
im = Image.open('colorwheel.png')
# Make Numpy array
ni = np.array(im)
# Mask pixels where 100 < Blue < 200
blues = ( ni[:,:,2]>100 ) & (ni[:,:,2]<200)
# Save logical mask as PNG
Image.fromarray((blues*255).astype(np.uint8)).save('result.png')
您还可以对红色,绿色和蓝色设置条件,然后使用Numpy的np.logical_and()
和np.logical_or()
来制定复合条件,例如:
bluesHi = ni[:,:,2] > 200
redsLo = ni[:,:,0] < 50
mask = np.logical_and(bluesHi,redsLo)
答案 1 :(得分:1)
多亏了马克·谢切尔(Mark Setchell)的回复,我解决了一个使numpy数组大小与填充零的图像相同的问题。然后,对于B> 200的每个像素,我将数组中的对应值设置为255。最后,我以与输入图像相同的模式将numpy数组转换为PIL图像。
R, G, B = 0, 1, 2
pixels = self.input_image.get_value().load()
width, height = self.input_image.get_value().size
mode = self.input_image.get_value().mode
mask = np.zeros((height, width))
for y in range(0, height):
for x in range(0, width):
if pixels[x, y][2] > 200:
mask[y][x] = 255
mask_image = Image.fromarray(mask).convert(mode)