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)这个混合图片的函数,还没看源码,不知道他是用什么方法实现的。

原先的两张照片:

合成后的照片:

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

优劣:

方法一不易造成曝光过度,因为实际的像素点并没改动,只是间隔变大了,但这样可能会造成轮廓不清晰

方法二在比例适当时效果是优于方式一的,但比例不合适就会看起来像曝光过度一样,示例中方法二用的比例是0.3:0.7,又是比例不当效果会很糟糕,孰优孰劣请按效果好坏使用。

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

本文标题: python图片合成的示例

本文地址: http://www.cppcns.com/jiaoben/python/362850.html

python合成图片_python图片合成的示例相关推荐

  1. python标志图片_python图片加水印 - 小众知识

    图片加"水印"的制作过程:我们经常会看见一些地图网站的地图切片上都有一个l:很明显吧!:这样logo是怎么加上去的呢?我就花了点时间在网:现在我就介绍下实现所谓"水印&q ...

  2. python udp编程_Python UDP编程小示例

    参照着廖雪峰的python教程敲的代码. 这个示例就是很简单的服务器端直接接收来自客户端的数据,然后稍作处理返回给客户端:客户端给服务器端发送数据然后将接收到的返回数据打印. UDPServer.py ...

  3. python监控端口_python监控设备端口示例

    python监控设备端口示例 发布于 2014-08-10 18:22:16 | 120 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计算机程 ...

  4. python浮雕图片_python图片处理PIL

    一.PIL介绍 PIL中所涉及的基本概念有如下几个:通道(bands).模式(mode).尺寸(size).坐标系统(coordinate system).调色板(palette).信息(info)和 ...

  5. python html转图片_Python图片转html字符画

    GitHub上有个很有意思的项目,这个项目就是将一张图片转换成一个网页,例如这张蒙娜丽莎的微笑转换成网页之后的效果对比: image 左边是原图,右边是网页的效果,网页其实是由文字"爱&qu ...

  6. python字符照片_python图片转字符图片

    python图片转字符图片代码 话不多说,直接上代码. *************************** #-*- coding:utf-8 -*- from PIL import Image ...

  7. python批量压缩图片_Python图片批量压缩到指定大小并将JPG转为PNG格式

    背景: 待压缩的图片大小有几十KB到近10M大小不等,且绝大部分图片为JPG格式.这些待压缩图片放在picture文件夹下 以及picture文件夹下的子文件夹中 现需要将picture文件夹下这些图 ...

  8. python矩阵变成图片_Python图片转换成矩阵,矩阵数据转换成图片

    # coding=gbk from PIL import Image import numpy as np # import scipy def loadImage(): # 读取图片 im = Im ...

  9. python补充符号和图片_Python 图片转符号图

    先上图,如果用的是 mac 的时候打开 txt 文件时候 com + -图就可以清楚的显示了 下面上代码吧#!/usr/bin/python # -*- coding: UTF-8 -*- from ...

最新文章

  1. 你和区块链的距离就差这篇文章!
  2. 天高任鸟飞,海阔凭鱼跃
  3. 一款轻量级的桌面WebServer通讯组件
  4. Ubuntu命令行下安装,卸载软件包的过程
  5. 解决mysqlslap执行命令报错(BEGIN failed--compilation aborted at //bin/mysqlslap line 2098)usr...
  6. 机房运维很枯燥?来看看中国银行数据中心基础设施可视化运维管理
  7. 进程线程006 Windows线程切换-线程优先级
  8. 网站能拿到其他网站的cookie_网站能给公司带来哪些好处?
  9. 微软为 Java 开发者推出 VSCode 安装程序
  10. [51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]
  11. Eclipse用法和技巧五:生成说明文档2
  12. python中pygame放入图_python使用PyGame绘制图像并保存为图片文件的方法
  13. python3.7中文手册chm_python3.7 官方中文手册文档全套
  14. java detach_jQuery中detach()方法用法实例
  15. 2022哈工大计算机系统大作业
  16. ybc_xxx类模块应用1-ybc_speech(第一片)
  17. 搜狐狐友通过增加知名度增加用户量
  18. KMP算法的应用——碱基序列匹配
  19. Failed to execute ‘btoa‘ on ‘Window‘: The string to be encoded contains characters outside of the La
  20. 链表中为何使用二级指针

热门文章

  1. eclipse导入外部项目,package报错,显示红叉叉
  2. C++定义指针变量 | 使用指针变量
  3. 多应用多特点Abbkine驴抗兔IgG二抗绿色荧光标记
  4. 初学者刚开始如何正确运行pycharm
  5. iOS获取设备的唯一标识的方法
  6. IT行业三大热门专业,就业容易工资高,人才缺口比较大
  7. Discuz!教程之论坛编辑器默认勾选HTML代码的修改方法
  8. linux 如何简单地隐藏文件及显示隐藏文件
  9. 什么是公共语言运行时(CLR)
  10. 弧齿锥齿轮零件图_格利森弧齿锥齿轮的装配与调整