python - 在 Python 上使用 PIL 更改像素颜色

标签 python image loops python-imaging-library

我对编程非常陌生,我正在学习更多有关使用 PIL 进行图像处理的知识。

我有一项任务,要求我用另一种颜色更改每个特定像素的颜色。由于需要更改的像素数量不少,因此我创建了一个 for 循环来访问每个像素。该脚本至少“有效”,但结果只是一个黑屏,每个像素都有 (0, 0, 0) 颜色。

from PIL import Image
img = Image.open('/home/usr/convertimage.png')
pixels = img.load()
for i in range(img.size[0]):
    for j in range(img.size[1]):
            if pixels[i,j] == (225, 225, 225):
                pixels[i,j] = (1)
            elif pixels[i,j] == (76, 76, 76):
                pixels [i,j] = (2)
            else: pixels[i,j] = (0)
img.save('example.png')

我的图像是灰度图像。有特定的颜色,并且在边界附近有渐变颜色。我试图用另一种颜色替换每种特定颜色,然后用另一种颜色替换渐变颜色。

但是对于我来说,我根本不明白为什么我的输出是单一 (0, 0, 0) 颜色的。

我尝试在网上和 friend 寻找答案,但找不到解决方案。

如果有人知道我做错了什么,我们非常感谢任何反馈。提前致谢。

最佳答案

问题是,正如您所说,您的图像是灰度,因此在这一行:

if pixels[i,j] == (225, 225, 225):

没有任何像素会等于 RGB 三元组 (255,255,255),因为白色像素只是灰度值 255 而不是 RGB 三元组。

如果将循环更改为:

,效果很好
        if pixels[i,j] == 29:
            pixels[i,j] = 1
        elif pixels[i,j] == 179:
            pixels [i,j] = 2
        else:
            pixels[i,j] = 0

这是对比度拉伸(stretch)的结果:

enter image description here

<小时/>

您可能会考虑使用“查找表”或 LUT 进行转换,因为大量 if 语句可能会变得难以处理。基本上,图像中的每个像素都会被替换为通过在表中查找其当前索引找到的新像素。我也用 numpy 来做这件事:

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

# Open the input image
PILimage=Image.open("classified.png")

# Use numpy to convert the PIL image into a numpy array
npImage=np.array(PILimage)

# Make a LUT (Look-Up Table) to translate image values. Default output value is zero.
LUT=np.zeros(256,dtype=np.uint8)
LUT[29]=1    # all pixels with value 29, will become 1
LUT[179]=2   # all pixels with value 179, will become 2

# Transform pixels according to LUT - this line does all the work
pixels=LUT[npImage];

# Save resulting image
result=Image.fromarray(pixels)
result.save('result.png')

结果 - 拉伸(stretch)对比度后:

enter image description here

<小时/>

我上面可能有点冗长,所以如果你喜欢更简洁的代码:

import numpy as np
from PIL import Image

# Open the input image as numpy array
npImage=np.array(Image.open("classified.png"))

# Make a LUT (Look-Up Table) to translate image values
LUT=np.zeros(256,dtype=np.uint8)
LUT[29]=1    # all pixels with value 29, will become 1
LUT[179]=2   # all pixels with value 179, will become 2

# Apply LUT and save resulting image
Image.fromarray(LUT[npImage]).save('result.png')

关于python - 在 Python 上使用 PIL 更改像素颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580779/

相关文章:

python - 我在运行代码时遇到错误(语法无效)

jquery - <IMG/> LowSrc 属性+事件?

Swift - 如何检查分配给按钮的图像

java - 在java中暂停for循环

php - 如何从循环中删除此查询?

Python:循环并编辑字符串字符

python - 我无法安装 numpy,因为它找不到 python 2.7,虽然我已经安装了 python

php - PHP 中缺少 $_SERVER header ,但 Python 中存在 $_SERVER header

python - 按另一个日期列表拆分日期列表

c - 如何从资源中在 PictureBox 上显示图像?