【发布时间】:2012-04-03 01:03:15
【问题描述】:
我正在尝试在 python 中使用 PIL 根据像素 RGB 值删除部分图像。从文档看来,功能点可以做我正在寻找的东西。但是,我很难遵循文档。如果我想将所有蓝色值小于 100 的像素更改为白色,那么最简单的方法是什么?
【问题讨论】:
标签: python python-imaging-library
我正在尝试在 python 中使用 PIL 根据像素 RGB 值删除部分图像。从文档看来,功能点可以做我正在寻找的东西。但是,我很难遵循文档。如果我想将所有蓝色值小于 100 的像素更改为白色,那么最简单的方法是什么?
【问题讨论】:
标签: python python-imaging-library
类似以下的方法会起作用:
source = im.split()
mask = source[2].point(lambda i: i < 100 and 255)
im = Image.merge(im.mode, source)
请参阅 Point Operations 标题下的 PIL Tutorial 了解更多信息。
【讨论】:
我认为最简单的方法是使用Mahotas library,它可以让您将图像加载为 NumPy ndarray。然后你就可以在你的图片上使用逻辑索引了。
import Mahotas as mh
import numpy as np
fname = "/home/stuff/images/my_image.jpg"
image = mh.imread(fname)
# Make a copy to play with the indices.
img = np.copy(image)
# Replace places with 3rd coordinate less than 100 with the white-color
# vector [255, 255, 255].
inds = img[:,:,2] < 100
img[inds] = [255,255,255]
好处是 Mahotas 将图像直接加载到 Numpy 数组中,这使您可以轻松地以 NumPy 一致的语法对不同的维度进行切片。或者,如果你真的想用 PIL 做图像 I/O,那么你应该在 PIL 中寻找可以将图像转换为 NumPy 数组的函数,然后上面的代码仍然可以工作。
不过,总的来说,让 PIL 真正发挥作用时,我一直遇到问题。 PIL 似乎总是存在某种图像文件类型支持问题、某种解码器问题或其他一些问题。这很挑剔。出于同样的原因,我通常会尽量避免使用 Python-OpenCV。我更喜欢包含 scikits.learn、scikits.image、Mahotas 和 PyPNG 的工作流程。
【讨论】: