[英]Changing pixel color using PIL on Python
我对编程非常陌生,并且正在学习有关使用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)颜色。
我试图在网上和朋友那里寻找答案,但无法提出解决方案。
如果外面有人知道我在做什么错,我们将非常感谢您提供任何反馈意见。 提前致谢。
问题是,正如您所说,您的图像是灰度的 ,因此在此行上:
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
这是对比结果:
您可能要考虑使用“ Look Up Table”或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')
结果-拉伸对比度后:
上面我可能有点冗长,所以如果您喜欢更简洁的代码:
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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.