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中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
Django中cookie的基本使用方法示例
Feb 03 Python
Python unittest模块用法实例分析
May 25 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
python定时按日期备份MySQL数据并压缩
Apr 19 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
Python字符串对象实现原理详解
Jul 01 Python
Django配置文件代码说明
Dec 04 Python
tensorflow 变长序列存储实例
Jan 20 Python
2021年最新用于图像处理的Python库总结
Jun 15 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
thinkPHP查询方式小结
2016/01/09 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
javascript 数组的方法集合
2008/06/05 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python的UTC时间转换讲解
2019/02/26 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
python如何实现异步调用函数执行
2019/07/08 Python
利用python计算时间差(返回天数)
2019/09/07 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
饮料业务员岗位职责
2013/12/15 职场文书
体育专业自荐书
2014/05/29 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS