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实现的阳历转阴历(农历)算法
Apr 25 Python
python3.5仿微软计算器程序
Mar 30 Python
win与linux系统中python requests 安装
Dec 04 Python
Python中int()函数的用法浅析
Oct 17 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
pandas去除重复列的实现方法
Jan 29 Python
python中dict使用方法详解
Jul 17 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
Python批量处理csv并保存过程解析
May 16 Python
Django Auth用户认证组件实现代码
Oct 13 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编程实现获取excel文档内容的代码实例
2011/06/28 PHP
ThinkPHP之import方法实例详解
2014/06/20 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
10个php函数实用却不常见
2015/10/13 PHP
网站上面有这种切换效果
2006/06/26 Javascript
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
2013/04/23 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
谈谈JS中的!!
2017/12/07 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
什么是事务?事务有哪些性质?
2012/03/11 面试题
北京天润融通.net面试题笔试题
2012/02/20 面试题
思想汇报范文
2013/11/04 职场文书
教师评优事迹材料
2014/01/10 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
初三新学期计划书
2014/05/03 职场文书
英文演讲稿
2014/05/15 职场文书
消防志愿者活动方案
2014/08/23 职场文书
校长创先争优承诺书
2014/08/30 职场文书
农行心得体会
2014/09/02 职场文书
教师个人成长总结
2015/02/11 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫
mybatis 获取更新记录的id
2022/05/20 Java/Android