Python使用Pillow和Matplotlib处理图片像素并实现图像合并
本文介绍如何在Python 3.x环境下使用Pillow库获取图片的RGBA像素数据,并通过NumPy转换为二维数组。接着利用Matplotlib将处理后的像素数据渲染为图像并保存。文章提供了一个完整的示例,演示如何读取两张图片,通过自定义算法合并像素值,最终输出合成后的结果图片。
Python环境准备与Pillow安装
本文基于Python 3.x版本进行讲解。
首先需要安装Pillow库。
由于原始的PIL库仅支持到Python 2.7且已停止维护,志愿者们基于PIL创建了一个兼容Python 3.x的兼容版本,名为Pillow。该版本不仅支持最新Python版本,还加入了许多新特性,因此建议直接安装使用Pillow。
安装命令如下:
pip install pillow
获取图片像素数据
接下来介绍如何获取图片的像素点数据。
import numpy as np
from PIL import Image
img = Image.open("./b.png").convert('RGBA')
a_img = np.asarray(img)
获取到的图片像素数据是一个二维数组,可以将其视为二维坐标系。数组中的每个元素存储一个元组,分别代表红(R)、绿(G)、蓝(B)和透明度(A)通道的值。
使用Matplotlib保存处理结果
在分别计算并修改像素值后,需要将数据写回图片。此时可以使用Matplotlib库来完成图像的显示和保存操作。
import matplotlib.pyplot as plt
plt.figure("beauty") # 开启图层,名称为 beauty
plt.imshow(a_img) # 二维数组的数据
plt.axis('off')
#plt.show()
plt.savefig("./result.png")
下面提供一个完整的代码示例。
图片合并计算完整示例
本例演示如何将两张图片进行合并计算,并输出最终结果。


将上述两张图片进行合并处理。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
def modeSuperposition(basePixel,mixPixel,alpha):
basePixel = int(basePixel)
mixPixel = int(mixPixel);
res=0
if basePixel <= 128 :
res = int(mixPixel) * int(basePixel) / 128;
else:
res = 255 - (255 - mixPixel)*(255 - basePixel) / 128;
a = alpha / 255;
if a > 1:
a = 1
res = (1-a)*basePixel + a*res
t = int(res)&-256
if t == 0:
return int(res)
if res > 255:
return 255
return 0
def mergePoint(x,y):
p1 = img1[x][y]
p2 = img2[x][y]
p1[1] = modeSuperposition(p1[0],p2[0],p2[3])
p1[2] = modeSuperposition(p1[1],p2[1],p2[3])
p1[3] = modeSuperposition(p1[2],p2[2],p2[3])
imgA = Image.open('./b.png')
img1=np.array(imgA.convert('RGBA')) #打开图像并转化为数字矩
img2=np.array(Image.open("./light.png").convert('RGBA'))
i = len(img1);
j = len(img1[0]);
for k in range(0,len(img2)):
for n in range(0,len(img2[0])):
if k < i and n < j:
mergePoint(k,n)
#img = Image.new("RGBA",imgA.size)###创建一个5*5的图片
plt.figure("beauty") # 开启图层,名称为 beauty
plt.imshow(img1) # 二维数组的数据
plt.axis('off')
#plt.show()
plt.savefig("./result.png")
最终生成的结果图片如下所示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













