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函数学习笔记
Oct 07 Python
python中ASCII码和字符的转换方法
Jul 09 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
python实现桌面托盘气泡提示
Jul 29 Python
python实现视频读取和转化图片
Dec 10 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
python判断两个序列的成员是否一样的实例代码
Mar 01 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 Python
基于Python下载网络图片方法汇总代码实例
Jun 24 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
Python非单向递归函数如何返回全部结果
Dec 18 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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 QRCODE生成彩色二维码的方法
2016/05/19 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
Python编写一个闹钟功能
2017/07/11 Python
pandas 时间格式转换的实现
2019/07/06 Python
python实现车牌识别的示例代码
2019/08/05 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
七年级英语教学反思
2014/01/15 职场文书
企业军训感言
2014/02/08 职场文书
西游降魔篇观后感
2015/06/15 职场文书
投诉书范文
2015/07/02 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
实现GO语言对数组切片去重
2022/04/20 Golang