python图片合成的示例
作者:py3study 发布时间:2023-11-17 17:09:36
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,又是比例不当效果会很糟糕,孰优孰劣请按效果好坏使用。
来源:https://cloud.tencent.com/developer/article/1570257


猜你喜欢
- 很久没有更新blog了,这段时间实在是发生了很多的事,累身累心。但还是有很多想做的事,比如更新merceCSS、把一直以来所总结的有关模块化
- 使Web系统的开发与维护更加方便,从而有效的节省人力物力,受到了越来越多企业的青眯。 模板引擎是MVC模式建立过程的重要方法,开发者可以设计
- 前言JavaScript中一共有3种用来声明变量的关键字,分别是var、let和const。其中var关键字是ES5时代的产物,由于ES5对
- 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片
- 严格来说,Having并不需要一个子表,但没有子表的Having并没有实际意义。如果你只需要一个表,那么你可以用Where子句达到一切目的。
- 手残删除python补救新建文件夹,下载下面的依赖wget http://vault.centos.org/7.2.1511/o
- MySQL 内连接、左连接、右连接、外连接、多表查询构建环境:create table t_emp(id int primary key,
- 在蓝色看到的几个js日历代码,整理了一下。大家可以用在blog上,或者可以用在表单的日期类型的数据选择中,方便大家填写日期。1.动感的日历,
- 废话少说,直接上代码<script type="text/javascript"> &
- 一、基本(1)利用pytorch建好的层进行搭建import torchfrom torch import nnfrom torch.nn
- 一、局部变量1 定义在{}里面的变量时局部变量,只能在{}里面有效2 执行到定义的那句话,开始分配内存空间,离开作用域自动进行释放3 作用域
- 目录1、将 PDF 转换为音频文件2、从列表中播放随机音乐3、不再有书签了4、清理下载文件夹前言:大家平时有没有注意到你每天可能会执行许多的
- 分页一般和表格一起用,分页链接作为表格的一部分,将分页链接封装成一个独立的组件,然后作为子组件嵌入到表格组件中,这样比较合理。效果:代码:1
- 目录一.权限简介二.权限表结构设计:第一版三.权限表结构设计:第二版四.客户管理之动态“一级”菜单五.客户管理之动态“二级”菜单六.客户管理
- Flask file upload代码import osfrom flask import Flask, request, re
- GetRef 函数 返回一个指向一过程的引用,此过程可绑定某事件。 Set object.eventname = GetRef(procna
- 一、项目展示项目是一个简单实用的二维码生成器。使用者可以在生成器中输入文字生成二维码,也可以在识别器中识别二维码的内容二、项目核心代码二维码
- 1、pd.cut()用于将数据值按照值本身进行分段并排序到 bins 中。参数包含:x, bins, right, include_lowe
- 最近在D4得到一本(美) Penny Mcintire写的《Visual Design for the Modern Web》.突然觉得可用
- 面对缺失值三种处理方法:option 1: 去掉含有缺失值的样本(行)option 2:将含有缺失值的列(特征向量)去掉option 3:将