一、明确在图像处理中对应的x轴和y轴与我们常用的有所不同
二、在需要更换图片中的某个某行或者某个形状的像素值时,通常需要使用两层for循环,来进行遍历,此时我们就需要知道对应的横向最大和纵向最大,即这张图片的宽和高,具体获得代码如下:
# 1. 用pillow载入cat.png
from PIL import Image
img = Image.open("cat.png") # 打开名为"cat.png"的图像文件
pixels = img.load() # 获取图像的像素数据
w, h = img.size # 获得图像的宽和高
三、接下来我们以具体的一个案列来讲解,导入一张图片将整张图片更改为红色通道图。
# 1. 用pillow载入xxx.png
from PIL import Image
img = Image.open("xxx.png") # 打开名为"xxx.png"的图像文件
pixels = img.load() # 获取图像的像素数据
w, h = img.size # 获得图像的宽和高
# 2. 循环每一个像素, 只保留其红色通道的值
for x in range(w):
for y in range(h):
r, _, _ = pixels[x, y]
pixels[x, y] = r, 0, 0
# 3. 保存并显示图像
img.save("xxx_blue.png", "PNG")
img.show()
A、但是注意,并不是所有的图片都是只有三个通道的,还可能具有第四个通道——透明度。
所以当一张图片含有透明度第四个分量的时候,将代码修改如下:
from PIL import Image
# 1. 用Pillow载入图像
img_path = r"F:\\图像处理\\实验示例图片\\星云.png"
img = Image.open(img_path)
pixels = img.load()
w, h = img.size
# 打印一个像素的值来查看它有多少个分量
print(pixels[0, 0]) # 打印图像左上角的像素值 这个不仅有三个分量,还有一个透明度分量
# 2. 循环每一个像素, 只保留其红色通道的值
for x in range(0,int(w/2)):
for y in range(int(h/2),h):
# 根据实际的像素值分量数量来解包
r, *rest = pixels[x, y] # 使用扩展的序列解包来获取红色通道和其他通道
pixels[x, y] = (r, 0, 0) # 只保留r值
# 3. 保存并显示图像
output_path = r"F:\\图像处理\\实验示例图片\\星云_red.png"
img.save(output_path, "PNG")
img.show()
B、将上诉代码所使用的图片放在下面了