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批量添加zabbix Screens的两个脚本分享
Jan 16 Python
python实现扫描日志关键字的示例
Apr 28 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
python实现遍历文件夹修改文件后缀
Aug 28 Python
python numpy元素的区间查找方法
Nov 14 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
python匿名函数的使用方法解析
Oct 10 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
在python里创建一个任务(Task)实例
Apr 25 Python
Python用Jira库来操作Jira
Dec 28 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 Python
Python集合的基础操作
Nov 01 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
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
Javascript的一种模块模式
2010/09/08 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
React快速入门教程
2017/01/17 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Python中使用Inotify监控文件实例
2015/02/14 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
pytorch进行上采样的种类实例
2020/02/18 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
Bjorn Borg官方网上商店:国际运动时尚品牌
2016/08/27 全球购物
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
Java语言程序设计测试题改错题部分
2014/07/22 面试题
应届毕业生求职自荐书
2014/01/03 职场文书
信息专业大学生自我评价分享
2014/01/17 职场文书
大学生的创业计划书就该这么写
2014/01/30 职场文书
简历的自我评价
2014/02/03 职场文书
仓管员岗位责任制
2014/02/19 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
廉洁家庭事迹材料
2014/05/15 职场文书
服务口号大全
2014/06/11 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
2014年双拥工作总结
2014/11/21 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
收费员岗位职责
2015/02/14 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
win10更新失败无限重启解决方法
2022/04/19 数码科技
详解MySQL的内连接和外连接
2023/05/08 MySQL