python图片合成的示例


Posted in Python onNovember 09, 2020

python的PIL库简直好用的不得了,PIL下面的Image库更是封装了很多对图片处理的函数,关于Image库的介绍和使用,看这里:http://effbot.org/imagingbook/image.htm

这里用我半个月前看到的一篇博客写的demo作为背景,做一下图片的合成

图片可以看作是很多像素点组成的,每个像素点都是一个RGB颜色,(red, green, blue), 那么合成两张照片就有办法了,我们可以在一张新的RGB色的图片里一个像素点取图片一的对应位置的像素,下一个像素点取图片二的像素,直到遍历完成,代码如下:

from PIL import Image

##这里采用传入图片地址调用此函数

#这个方法目前不支持按比例合成,默认为1:1
#各取一个像素点合并,传入的参数为两张图片的地址
def merge1(img1_address,img2_addess):
 status=100
 #状态码100为正常
 #  200为地址错误
 try:
  img1=Image.open(img1_address)
  img2=Image.open(img2_address)
 except:
  status=200
  img_new=""
 else:
  width=min(img1.size[0],img2.size[0])
  height=min(img1.size[1],img2.size[1])
  print(width,height)
  img_new = Image.new('RGB',(width,height))
  for x in range(width):
   for y in range(height):
    if y%2==0:
     pixel=img1.getpixel((x,y))
     img_new.putpixel((x,y),pixel)
    else:
     pixel=img2.getpixel((x,y))
     img_new.putpixel((x,y),pixel)
 finally:
  return img_new,status

上述代码会返回一张新的图片和一个状态码,接受的时候用两个变量接受

另一种方法是每个像素点各取%50的原图片的颜色,然后把像素点放置在对应位置,为了功能更加强大,我把两者的混合比例设为可调,默认是50%的比例,代码如下:

from PIL import Image

#将像素点按比例取色,然后合成一个新像素点
#传入的参数为两张图片的地址和比例
#如果两者之和不为1则以第一个图片的比例为准
def merge2(img1_address,img2_address,percent1=0.50,percent2=0.50):
 status=100
 #状态码100为正常
 #  200为地址错误
 try:
  img1=Image.open(img1_address)
  img2=Image.open(img2_address)
 except:
  status=200
  img_new=""
 else:
  if percent1+percent2!=1:
   percent2=1-percent1
  width = min(img1.size[0],img2.size[0])
  height = min(img1.size[1],img2.size[1])
  img_new = Image.new('RGB',(width,height))
  for x in range(width):
   for y in range(height):
    r1,g1,b1=img1.getpixel((x,y))
    r2,g2,b2=img2.getpixel((x,y))
    r=int(percent1*r1+percent2*r2)
    g=int(percent1*g1+percent2*g2)
    b=int(percent1*b1+percent2*b2)
    img_new.putpixel((x,y),(r,g,b))
 finally:
  return img_new,status

返回的参数与上述相同
 如果想要保存图片可用image.save()函数保存

总的代码如下:

from PIL import Image

##这里采用传入图片地址调用此函数

#这个方法目前不支持按比例合成,默认为1:1
#各取一个像素点合并,传入的参数为两张图片的地址
def merge1(img1_address, img2_addess, direct):
 status=100
 #状态码100为正常
 #  200为地址错误
 try:
  img1=Image.open(img1_address)
  img2=Image.open(img2_address)
 except:
  status=200
  img_new=""
 else:
  width=min(img1.size[0], img2.size[0])
  height=min(img1.size[1], img2.size[1])
  print(width,height)
  img_new = Image.new('RGB',(width, height))
  for x in range(width):
   for y in range(height):
    if y%2 == 0:
     pixel = img1.getpixel((x,y))
     img_new.putpixel((x,y), pixel)
    else:
     pixel = img2.getpixel((x,y))
     img_new.putpixel((x,y), pixel)
 finally:
  return status

#将像素点按比例取色,然后合成一个新像素点
#传入的参数为两张图片的地址和比例
#如果两者之和不为1则以第一个图片的比例为准
def merge2(img1_address, img2_address, direction, percent1):

 status = 100
 #状态码100为正常
 # 200为地址错误
 try:
  img1 = Image.open(img1_address)
  img2 = Image.open(img2_address)
 except:
  status = 200
  img_new = ""
 else:
  percent2 = 1 - percent1
  width = min(img1.size[0], img2.size[0])
  height = min(img1.size[1], img2.size[1])
  img_new = Image.new('RGB', (width,height))
  for x in range(width):
   for y in range(height):
    r1,g1,b1=img1.getpixel((x,y))
    r2,g2,b2=img2.getpixel((x,y))
    r = int(percent1 * r1 + percent2 * r2)
    g = int(percent1 * g1 +percent2 * g2)
    b = int(percent1 * b1 +percent2 * b2)
    img_new.putpixel((x,y),(r,g,b))
  img_new.save(direction)
  #img_new.show()
 finally:
  return status
 #切记在接受返回信息时先判断状态码是否异常,如果正确再执行相应操作
if __name__=='__main__':

 img1_address = "B:\Picture\YourName\1.jpg"
 img2_address = "B:\Picture\YourName\2.jpg"
 direction = "D:/Python/PyQt/课程设计/merges/merge9.png"
 status = merge2(img1_address, img2_address, direction, 0.30)
 print(status)

当然,我发现Image库中有Image.blend(image1, image2, alpha)这个混合图片的函数,还没看源码,不知道他是用什么方法实现的。

原先的两张照片:

python图片合成的示例

合成后的照片:

 python图片合成的示例

左图是方法一,右图是方法二

优劣: 
方法一不易造成曝光过度,因为实际的像素点并没改动,只是间隔变大了,但这样可能会造成轮廓不清晰 
方法二在比例适当时效果是优于方式一的,但比例不合适就会看起来像曝光过度一样,示例中方法二用的比例是0.3:0.7,又是比例不当效果会很糟糕,孰优孰劣请按效果好坏使用。

以上就是python图片合成的示例的详细内容,更多关于python图片合成的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python基于multiprocessing的多进程创建方法
Jun 04 Python
python实现将内容分行输出
Nov 05 Python
python实现红包裂变算法
Feb 16 Python
深入学习python的yield和generator
Mar 10 Python
python学习基础之循环import及import过程
Apr 22 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
python交易记录链的实现过程详解
Jul 03 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
python实现猜拳游戏项目
Nov 30 Python
java字符串格式化输出实例讲解
Jan 06 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 #Python
Python字典dict常用方法函数实例
Nov 09 #Python
Python实现哲学家就餐问题实例代码
Nov 09 #Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 #Python
Python暴力破解Mysql数据的示例
Nov 09 #Python
python 实现一个图形界面的汇率计算器
Nov 09 #Python
python 读取串口数据的示例
Nov 09 #Python
You might like
PHP与MySQL开发的8个技巧小结
2010/12/17 PHP
PHP编程风格规范分享
2014/01/15 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
为什么Python中没有"a++"这种写法
2018/11/27 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
人力资源管理专业学生自我评价
2013/11/20 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
未婚证明书模板
2014/10/08 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技