python - 如何使用 Pillow 的 Image.load() 函数生成蒙版
问题描述
我想根据某些像素值创建一个蒙版。例如: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))
``
解决方案
我的意思是让你避免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')
您还可以在 Reds、Greens 和 Blues 上创建条件,然后使用 Numpy'snp.logical_and()
和np.logical_or()
创建复合条件,例如:
bluesHi = ni[:,:,2] > 200
redsLo = ni[:,:,0] < 50
mask = np.logical_and(bluesHi,redsLo)
推荐阅读
- c# - 单个 HttpClientHandler 是否应该与多个 HttpClient 对象一起使用?
- javascript - 呈现包含样式代码的字符串
- swift - ARSCNView 中像素的颜色
- javascript - 将遍历所有 css 文件并将每个 .classname 更改为 .class-name 的脚本
- c# - 如何使用 C# .NET 在 Windows 中“取消配对”、“删除”蓝牙设备
- salt-stack - 在新的 salt-master 上重新连接 minion 会导致问题
- excel - 复制到变量引用指定的范围
- typescript - 量角器测试使用 TypeScript 和 Webpack 的非 Angular 站点
- c++ - 如何将每秒接收的字节数和每秒发送的字节数转换为 MB?
- c# - 更改对象中每个字符串属性的值