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-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
使用PHP+JavaScript将HTML页面转换为图片的实例分享
这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
- 下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13- 这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01