python合成图片_python图片合成的示例
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图片合成的示例相关推荐
- python标志图片_python图片加水印 - 小众知识
图片加"水印"的制作过程:我们经常会看见一些地图网站的地图切片上都有一个l:很明显吧!:这样logo是怎么加上去的呢?我就花了点时间在网:现在我就介绍下实现所谓"水印&q ...
- python udp编程_Python UDP编程小示例
参照着廖雪峰的python教程敲的代码. 这个示例就是很简单的服务器端直接接收来自客户端的数据,然后稍作处理返回给客户端:客户端给服务器端发送数据然后将接收到的返回数据打印. UDPServer.py ...
- python监控端口_python监控设备端口示例
python监控设备端口示例 发布于 2014-08-10 18:22:16 | 120 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计算机程 ...
- python浮雕图片_python图片处理PIL
一.PIL介绍 PIL中所涉及的基本概念有如下几个:通道(bands).模式(mode).尺寸(size).坐标系统(coordinate system).调色板(palette).信息(info)和 ...
- python html转图片_Python图片转html字符画
GitHub上有个很有意思的项目,这个项目就是将一张图片转换成一个网页,例如这张蒙娜丽莎的微笑转换成网页之后的效果对比: image 左边是原图,右边是网页的效果,网页其实是由文字"爱&qu ...
- python字符照片_python图片转字符图片
python图片转字符图片代码 话不多说,直接上代码. *************************** #-*- coding:utf-8 -*- from PIL import Image ...
- python批量压缩图片_Python图片批量压缩到指定大小并将JPG转为PNG格式
背景: 待压缩的图片大小有几十KB到近10M大小不等,且绝大部分图片为JPG格式.这些待压缩图片放在picture文件夹下 以及picture文件夹下的子文件夹中 现需要将picture文件夹下这些图 ...
- python矩阵变成图片_Python图片转换成矩阵,矩阵数据转换成图片
# coding=gbk from PIL import Image import numpy as np # import scipy def loadImage(): # 读取图片 im = Im ...
- python补充符号和图片_Python 图片转符号图
先上图,如果用的是 mac 的时候打开 txt 文件时候 com + -图就可以清楚的显示了 下面上代码吧#!/usr/bin/python # -*- coding: UTF-8 -*- from ...
最新文章
- 你和区块链的距离就差这篇文章!
- 天高任鸟飞,海阔凭鱼跃
- 一款轻量级的桌面WebServer通讯组件
- Ubuntu命令行下安装,卸载软件包的过程
- 解决mysqlslap执行命令报错(BEGIN failed--compilation aborted at //bin/mysqlslap line 2098)usr...
- 机房运维很枯燥?来看看中国银行数据中心基础设施可视化运维管理
- 进程线程006 Windows线程切换-线程优先级
- 网站能拿到其他网站的cookie_网站能给公司带来哪些好处?
- 微软为 Java 开发者推出 VSCode 安装程序
- [51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]
- Eclipse用法和技巧五:生成说明文档2
- python中pygame放入图_python使用PyGame绘制图像并保存为图片文件的方法
- python3.7中文手册chm_python3.7 官方中文手册文档全套
- java detach_jQuery中detach()方法用法实例
- 2022哈工大计算机系统大作业
- ybc_xxx类模块应用1-ybc_speech(第一片)
- 搜狐狐友通过增加知名度增加用户量
- KMP算法的应用——碱基序列匹配
- Failed to execute ‘btoa‘ on ‘Window‘: The string to be encoded contains characters outside of the La
- 链表中为何使用二级指针