OpenCV-Python图形图像处理:制作雪花飘落特效

article/2025/9/21 15:08:40

☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░

在这里插入图片描述

一、引言

前几天有博友咨询,能否在视频中实现雪花飘落的效果,答案是肯定的。老猿前天简单构思了一下,利用周末时间,使用OpenCV-Python通过图像循环显示方式,实现了给图片显示增加动态雪花飘落的效果,经过不停优化,效果还是不错的,花了半天时间将实现过程总结成文,供大家参考。

二、案例背景

本次雪花来源于如下图片(文件名:f:\pic\snow.jpg):

背景可以是任意图片,下面是老猿在网上找到的一张珠峰图像(文件名:f:\pic\Qomolangma2.jpg):

珠峰背景的天空飘落着纷纷扬扬的雪花,意境不错吧?

三、实现思路

要实现雪花飘落,单张图片的单次显示肯定不够,需要不停循环显示图片,并且在每次图片显示时,生成新的雪花并更新图片中已有雪花的位置,这就需要将图片中每个雪花的位置精确管理。

自然界的雪花大小是不同的,因此为了提升逼真效果,还需要使得雪花大小在一定范围内随机变化和旋转。

不停产生大小不同的雪花,如果每次产生雪花都对雪花进行变换其实浪费了系统的资源,因此为了提升处理性能,只在程序开始初始化时一次批量生产各种不同大小、不同旋转角度的各种雪花,后续程序生成雪花时,直接从批量生成的雪花中取一个作为要生成的雪花,而不用每次从基本的雪花图像开始进行变换。

四、关键实现代码

4.1、生成各种雪花形状

def initSnowShapes():"""从文件中读入雪花图片,并进行不同尺度的缩小和不同角度的旋转从而生成不同的雪花形状,这些雪花形状保存到全局列表中snowShapesList"""global snowShapesListimgSnow = readImgFile(r'f:\pic\snow.jpg') imgSnow = cv2.resize(imgSnow, None, fx=0.2, fy=0.2) #图片文件中的雪花比较大,需要缩小才能象自然的雪花形象minFactor,maxFactor = 50,100  #雪花大小在imgSnow的0.5-1倍之间变化for factor in range(minFactor,maxFactor,5): #每次增加5%大小f = factor*0.01imgSnowSize = cv2.resize(imgSnow, None, fx=f, fy=f)for ange in range(0,360,5):#雪花0-360之间旋转imgRotate = rotationImg(imgSnowSize,ange)snowShapesList.append(imgRotate)

4.2、产生一排雪花

def generateOneRowSnows(width,count):"""产生一排雪花对象,每个雪花随机从snowShapesList取一个、横坐标位置随机、纵坐标初始为0:param width: 背景图像宽度:param count: 希望的雪花数:return:一个包含产生的多个雪花对象信息的列表,每个列表的元素代表一个雪花对象,雪花对象包含三个信息,在snowShapesList的索引号、初始x坐标、初始y坐标(才生成固定为0)"""global snowShapesListline = []picCount = len(snowShapesList) for loop in range(count):imgId = random.randint(0,picCount-1)xPos = random.randint(0,width-1)line.append((imgId,xPos,0))return line

4.3、将所有雪花对象融合到背景图像

def putSnowObjectToImg(img):"""将所有snowObjects中的雪花对象融合放到图像img中,融合时y坐标随机下移一定高度,x坐标左右随机小范围内移动"""global snowShapesList,snowObjectshorizontalMaxDistance,verticalMaxDistance = 5,20 #水平方向左右漂移最大值和竖直方向下落最大值snowObjectCount = len(snowObjects)rows,cols = img.shape[0:2]imgResult = np.array(img)for index in range(snowObjectCount-1,-1,-1):imgObj = snowObjects[index] #每个元素为(imgId,x,y)if imgObj[2]>rows: #如果雪花的起始纵坐标已经超出背景图像的高度(即到达背景图像底部),则该雪花对象需进行失效处理del(snowObjects[index])else:imgSnow = snowShapesList[imgObj[0]]x,y = imgObj[1:] #取该雪花上次的位置x = x+random.randint(-1*horizontalMaxDistance,horizontalMaxDistance) #横坐标随机左右移动一定范围y = y+random.randint(1,verticalMaxDistance) #纵坐标随机下落一定范围snowObjects[index] = (imgObj[0],x,y) #更新雪花对象信息imgResult = addImgToLargeImg(imgSnow,imgResult,(x,y),180) #将所有雪花对象图像按照其位置融合到背景图像中return imgResult #返回融合图像

4.4、主函数

主函数读入背景图片,初始化雪花形状列表,然后循环自顶部产生一排新的雪花,并将所有雪花对象动态调整位置后融合到背景图像,每200毫秒循环一次,直至按ESC退出。

def main():global snowShapesList,snowObjectsbg = readImgFile(r'f:\pic\Qomolangma2.jpg')initSnowShapes()rows,cols = bg.shape[:2]maxObjsPerRow = int(cols/100)while(True):snowObjects += generateOneRowSnows(cols,random.randint(0,maxObjsPerRow))result = putSnowObjectToImg(bg)cv2.imshow('result',result)ch = cv2.waitKey(200)if ch==27:break

4.5、其他说明

程序的执行直接直接main函数即可,另外本程序还用到了部分老猿经常用的公用函数,这部分函数包括readImgFile、addImgToLargeImg、rotationImg,其功能请参考《https://blog.csdn.net/LaoYuanPython/article/details/111351901 OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》的介绍,根据介绍大家自行实现相关代码并不难。

五、主程序完整代码及雪花飘落效果

5.1、 主程序完整代码

# -*- coding: utf-8 -*-
import cv2,random
import numpy as npfrom opencvPublic import addImgToLargeImg,readImgFile,rotationImg
snowShapesList = [] #雪花形状列表
snowObjects=[]  #图片中要显示的所有雪花对象def initSnowShapes():"""从文件中读入雪花图片,并进行不同尺度的缩小和不同角度的旋转从而生成不同的雪花形状,这些雪花形状保存到全局列表中snowShapesList"""global snowShapesListimgSnow = readImgFile(r'f:\pic\snow.jpg')imgSnow = cv2.resize(imgSnow, None, fx=0.2, fy=0.2) #图片文件中的雪花比较大,需要缩小才能象自然的雪花形象minFactor,maxFactor = 50,100  #雪花大小在imgSnow的0.5-1倍之间变化for factor in range(minFactor,maxFactor,5): #每次增加5%大小f = factor*0.01imgSnowSize = cv2.resize(imgSnow, None, fx=f, fy=f)for ange in range(0,360,5):#雪花0-360之间旋转,每次旋转角度增加5°imgRotate = rotationImg(imgSnowSize,ange)snowShapesList.append(imgRotate)def generateOneRowSnows(width,count):"""产生一排雪花对象,每个雪花随机从snowShapesList取一个、横坐标位置随机、纵坐标初始为0:param width: 背景图像宽度:param count: 希望的雪花数:y:当前行对应的竖直坐标:return:一个包含产生的多个雪花对象信息的列表,每个列表的元素代表一个雪花对象,雪花对象包含三个信息,在snowShapesList的索引号、初始x坐标、初始y坐标(才生成固定为0)"""global snowShapesListline = []picCount = len(snowShapesList)for loop in range(count):imgId = random.randint(0,picCount-1)xPos = random.randint(0,width-1)line.append((imgId,xPos,0))return linedef putSnowObjectToImg(img):"""将所有snowObjects中的雪花对象融合放到图像img中,融合时y坐标随机下移一定高度,x坐标左右随机小范围内移动"""global snowShapesList,snowObjectshorizontalMaxDistance,verticalMaxDistance = 5,20 #水平方向左右漂移最大值和竖直方向下落最大值snowObjectCount = len(snowObjects)rows,cols = img.shape[0:2]imgResult = np.array(img)for index in range(snowObjectCount-1,-1,-1):imgObj = snowObjects[index] #每个元素为(imgId,x,y)if imgObj[2]>rows: #如果雪花的起始纵坐标已经超出背景图像的高度(即到达背景图像底部),则该雪花对象需进行失效处理del(snowObjects[index])else:imgSnow = snowShapesList[imgObj[0]]x,y = imgObj[1:] #取该雪花上次的位置x = x+random.randint(-1*horizontalMaxDistance,horizontalMaxDistance) #横坐标随机左右移动一定范围y = y+random.randint(1,verticalMaxDistance) #纵坐标随机下落一定范围snowObjects[index] = (imgObj[0],x,y) #更新雪花对象信息imgResult = addImgToLargeImg(imgSnow,imgResult,(x,y),180) #将所有雪花对象图像按照其位置融合到背景图像中return imgResult #返回融合图像def main():global snowShapesList,snowObjectsinitSnowShapes()bg = readImgFile(r'f:\pic\Qomolangma2.jpg')rows,cols = bg.shape[:2]maxObjsPerRow = int(cols/100)while(True):snowObjects += generateOneRowSnows(cols,random.randint(0,maxObjsPerRow))result = putSnowObjectToImg(bg)cv2.imshow('result',result)ch = cv2.waitKey(200)if ch==27:breakmain()

5.2、雪花飘落特效

在这里插入图片描述

六、小结

本文介绍了通过OpenCV-Python以特定图像为背景制作雪花飘落特效的实现思路、关键函数功能以及主程序的完整代码。雪花飘落特效实际上属于图像融合的操作,只要掌握图像融合的基础知识以及设计后实现思路,实现起来还是比较快的,效果也挺不错。结合上面代码,大家还可以调整雪花的大小以及飘雪的密集程度。

有了以上内容的介绍,要实现视频加雪花特效就很容易了,只要将上述过程使用的关键步骤叠加Moviepy音视频处理合成就可以实现,老猿对本文的代码稍进行调整,然后写了个三行代码的函数就完成了相关处理,相信学习过Moviepy的都能很快实现,在此就不多介绍了,等过一阵子老猿再在Moviepy相关专栏发布相关实现。

以上实现过程需要注意:

  1. 雪花图片一般会比图片需要的效果大,怎么缩小到合适的大小需要多试一下,下面是才开始将原始图片只缩写一半之后的效果。
    在这里插入图片描述
    可以看到该效果就不太让人满意。

  2. 控制好雪花左右移动以及下落的速度和幅度,太快、太慢以及幅度过大或过小都不太象在雪花飘落。

更多图像处理的介绍请参考专栏《OpenCV-Python图形图像处理 https://blog.csdn.net/laoyuanpython/category_9979286.html》和《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》相关文章。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。
在这里插入图片描述

跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░


http://chatgpt.dhexx.cn/article/iuPHHsMy.shtml

相关文章

图像处理程序的设计与实现

一、要求: 1.利用Qt和QPainter实现一个图像处理程序,有菜单栏、工具栏和状态栏 2.有图像选择对话框,以选择和读取图像 3.状态栏显示图像的像素,位深,导入图像的路径和鼠标所在点的像素点坐标 4.可以对图像缩放&#xf…

C#图形化程序设计知识总结

图形化程序设计 用可视化的界面进行程序设计 逃出控制台丑丑的黑框 知识导图 图为图形化程序设计的内容清单 Windows窗体程序设计 窗体设计 窗体是一个窗口或对话框,是存放各种控件的容器,可用来向用户显示信息 一个Windows应用程序可以包含多个窗体 …

python 图像分割_5行Python代码实现图像分割的步骤详解

众所周知图像是由若干有意义的像素组成的,图像分割作为计算机视觉的基础,对具有现有目标和较精确边界的图像进行分割,实现在图像像素级别上的分类任务。 图像分割可分为语义分割和实例分割两类,区别如下: 语义分割&am…

台式计算机驱动程序未被安装,计算机图形驱动程序安装失败的原因及其解决方法...

由于许多问题,兼容性和数字签名,计算机图形驱动程序可能会失败. 很有可能没有启用Windows安装程序服务. 每个问题都有不同的解决方案. 如何确定问题的原因,可以借用软件进行检测,也可以尝试一种然后修复. 如果由于Windows Install…

LabVIEW程序框图保存为图像

LabVIEW程序框图保存为图像 想将LabVIEW程序框图保存为标准图像文件,以便可以在LabVIEW之外查看或在文档中使用。如何将程序框图生成为图像? 可以通过打印VI或以编程方式获取LabVIEW程序框图图像。 要打印VI,请使用以下步骤: …

Python图形绘制程序设计

第1关:绘制多边形 任务描述 本关任务:依照案例教程例6-2,用多边形函数绘制各种多边形图形。 编程要求 根据提示,在右侧编辑器补充代码。 测试说明 平台会对你编写的代码进行测试: 开始你的任务吧,祝你成功! 第2关:绘制五角星图形 任务描述 本关任务:绘制一个黄色…

升级计算机的图形卡和驱动程序,如何升级计算机图形卡,计算机图形卡升级方法图...

[哈哈IT网络中关村显卡]如何升级计算机显卡,通常我们会对显卡驱动程序做进一步的升级,这有助于提高显卡的性能,达到达到显卡升级的目的. 显卡驱动程序升级使计算机显示效果更好,显示效果也得到了提高. 下面介绍如何升级计算机图形…

计算机图形驱动程序原理,您知道更新计算机图形驱动程序的作用吗?怎么做

购买或使用计算机时,为了获得更好的视觉体验并避免显示的AV质量,我们通常在选择时安装独立的显卡!使用计算机时,有时第三方软件会提示您更新计算机图形驱动程序,但有时却没有!更新计算机图形驱动程序有什么…

VTK图形图像开发进阶-学习笔记 01 VTK概述

1.1 VTK概述 1.1.1VTK是什么 1.1.2VTK能做什么 1.1.3如何获取VTK源码 略 1.1.4 VTK学习资源 略 1.2 VTK编译安装 略 1.3创建一个简单的VTK程序 步骤一:创建目录A: D:\VTK\example\Chap01 步骤二:在目录A中创建txt文件:CMa…

用Java完成图形图像绘制

我们要来图形图像的处理,目标就是滑动鼠标绘制一根直线,绘制一个矩形,绘制一个圆,并且绘制任意的一个三角形,和任意的一个等腰三角形 我们先创建一个DrawPad类,在这个类里面完成一些操作 步骤1、创建一个…

图形图像学习随笔:计算机图形学的一些基本概念

本文内容摘抄于:《计算机图形学的概念》 一、计算机图形学的范畴 1、图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地形图、曲面的线框图等;另一类是明暗图,也就是通常所说的真实感图形; …

升级计算机的图形卡和驱动程序,驱动程序向导如何更新图形卡驱动程序?更新图形驱动程序方法说明...

有许多用户使用驱动程序向导,并且一些新用户不清楚更新图形驱动程序的教程. 今天,我将带给您有关更新图形驱动程序的教程. 希望它能对您有所帮助. 我们首先打开计算机上已安装的驱动程序向导软件,然后进入软件,然后单击页面“立即…

大数据学习内容有哪些?大数据学习路线图

很多人想学习大数据,但是都不清楚大数据学习应该怎么下手。大数据开发工程师简单整理了一下大数据学习路线图,希望对于学习大数据的朋友,有一定的帮助。 总的来说,如果是从零基础开始学习,总共分为八个阶段 第一阶段:HTML+css 第二阶段:JAVASE学习 第三阶段:javaweb …

(转载)大数据学习路线大数据学习路线

一、背景介绍 本人目前是一名大数据工程师,项目数据50T,日均数据增长20G左右,个人是从Java后端开发,经过3个月的业余自学成功转型大数据工程师。 二、大数据介绍 大数据本质也是数据,但是又有了新的特征&#xff0c…

2022最全大数据学习路线(建议收藏)

【不要错过文末彩蛋】 申明: 本文旨在为【大数据自学者|大数据专业学生|工资低的程序员(Java/Python等)】提供一个从入门到入职的的大数据技术学习路径,不适合5年以上大数据工程师的进阶学习。 前言: 一、个人介绍 …

大数据学习的必要性,让你走向时代前沿!

大数据及人工智能可谓是目前最热门的行业,从走在前沿的科技公司,到努力创新的传统行业,几乎都想把握这个新“风口”。一部分学校也走上了大数据的道路。 在这里还是要推荐下我自己建的大数据学习交流群:199427210,群里都是学大数据开发的,如果你正在学习高大上大数据 ,小…

2022年Python+大数据学习路线图,源码笔记,最优学习资源

任何学习过程都需要一个科学合理的学习路线,才能够有条不紊的完成我们的学习目标。Python大数据所需学习的内容纷繁复杂,难度较大,所以今天特别为大家整理了一个全面的Python大数据学习路线图,帮大家理清思路,攻破难关…

大数据学习路线图(2023完整版)适合收藏

大数据开发是一门涉及处理和分析大规模数据的技术领域,随着大数据技术的不断发展和应用,对大数据开发人员的需求也在逐渐增加。就业前景相对较好,尤其在科技行业和数据驱动型企业中。大数据开发的前景还是有很多优势的,就业范围广…

大数据学习完可以做什么

如果要推荐一种人人都能掌握的编程语言,应该没有比Python更合适的了。如果想学习大数据,可以选择从python语言入手~ Python 简单易学,用途广泛,不仅可以在日常办公中提高大家的职场效率,还能被大型互联网企业应用于后…