Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果

news2024/11/28 0:53:52

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果

一、简单介绍

二、简单视频卡通画效果实现原理

三、简单视频卡通画效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单视频卡通画效果实现原理

视频卡通画效果是一种图像处理技术,通过对视频进行处理,使其呈现出类似于卡通画风格的效果。这种效果通常会对视频中的图像进行简化和抽象化处理,使得图像更加平滑、颜色更加饱满,同时突出图像的轮廓和边缘,让整个画面看起来更加生动、有趣。

视频卡通画效果的主要特点包括:

  1. 简化和抽象化: 通过去除图像中的细节信息,简化图像的内容,使其更符合卡通画的风格。
  2. 颜色鲜艳: 增加图像的饱和度和对比度,使颜色更加鲜艳明亮。
  3. 轮廓突出: 通过增强图像的边缘和轮廓,使物体更加清晰和突出。
  4. 平滑过渡: 使图像的色彩过渡更加柔和,减少颜色的跳变,增加画面的连贯性。

实现视频卡通画效果的关键技术包括图像边缘检测、颜色增强、滤波处理等。通过这些处理手段,可以将原始视频转换为具有卡通画风格的效果。

卡通效果的实现原理如下:

  1. 灰度化:首先将彩色图像转换为灰度图像,以便进行边缘检测。

  2. 边缘检测:利用边缘检测算法(例如自适应阈值边缘检测)找到图像中的边缘部分,这些边缘部分将用于后续步骤。

  3. 颜色量化:对彩色图像进行颜色量化,使得图像中的颜色变得更加平滑。这一步通常使用双边滤波器来实现。

  4. 合并边缘和颜色图像:将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色。这样就得到了卡通效果的图像。

具体实现方法如下:

  • 使用OpenCV库提供的功能函数对图像进行处理,例如颜色转换、边缘检测、双边滤波等。

  • 对于边缘检测,可以选择不同的算法,例如自适应阈值边缘检测、Canny边缘检测等,根据实际效果选择合适的算法。

  • 在颜色量化过程中,可以调节滤波器的参数来控制图像的平滑程度,从而调节卡通效果的强度。

  • 最后,将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色,得到最终的卡通效果图像。

实现卡通效果涉及了以下关键函数:

  1. cv2.cvtColor()

    • 作用:用于图像颜色空间转换,将彩色图像转换为灰度图像。
    • 参数:包括输入图像和转换类型。
    • 示例:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  2. cv2.adaptiveThreshold()

    • 作用:自适应阈值边缘检测,根据图像局部特性自适应地选择阈值。
    • 参数:包括输入图像、输出图像、最大灰度值、阈值类型等。
    • 示例:edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 2)
  3. cv2.bilateralFilter()

    • 作用:双边滤波器,同时考虑空间距离和像素值差异,可以保留图像的边缘信息。
    • 参数:输入图像、滤波器尺寸、颜色标准差和空间标准差等。
    • 示例:color_filtered = cv2.bilateralFilter(image, 9, 75, 75)
  4. cv2.bitwise_and()

    • 作用:对两个图像进行按位与操作,获取它们相交的部分。
    • 参数:输入两个图像。
    • 示例:cartoon = cv2.bitwise_and(color_filtered, color_filtered, mask=edges)

这些函数结合使用,实现了卡通效果的处理过程。首先将彩色图像转换为灰度图像,然后对灰度图像进行边缘检测,得到图像中的边缘部分。接着对彩色图像进行双边滤波处理,使得图像颜色更加平滑。最后将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色,得到最终的卡通效果图像。

三、简单视频卡通画效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

"""
简单视频卡通画效果
    1、灰度化:首先将彩色图像转换为灰度图像,以便进行边缘检测。
    2、边缘检测:利用边缘检测算法(例如自适应阈值边缘检测)找到图像中的边缘部分,这些边缘部分将用于后续步骤。
    3、颜色量化:对彩色图像进行颜色量化,使得图像中的颜色变得更加平滑。这一步通常使用双边滤波器来实现。
    4、合并边缘和颜色图像:将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色。这样就得到了卡通效果的图像。
"""


import cv2


def cartoonize(image, edge_threshold=9, color_reduction=300):
    """
    图片卡通画效果
    :param image:
    :param edge_threshold:
    :param color_reduction:
    :return:
    """
    # 转换为灰度图像
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 边缘检测
    edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, edge_threshold)

    # 颜色量化
    color = cv2.bilateralFilter(image, 9, color_reduction, color_reduction)

    # 合并边缘和颜色图像
    cartoon = cv2.bitwise_and(color, color, mask=edges)

    return cartoon


def main(input_video_path, output_video_path, edge_threshold=9, color_reduction=300):
    """
    简单视频卡通画效果
    :param input_video_path:
    :param output_video_path:
    :param edge_threshold:
    :param color_reduction:
    :return:
    """
    # 读取输入视频
    cap = cv2.VideoCapture(input_video_path)
    if not cap.isOpened():
        print("Error: Unable to open input video.")
        return
    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    # 创建输出视频
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))
    if not out.isOpened():
        print("Error: Unable to create output video.")
        return

    # 逐帧处理视频
    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 应用卡通画效果
        cartoon_frame = cartoonize(frame, edge_threshold, color_reduction)

        # 写入输出视频
        out.write(cartoon_frame)

    # 释放资源
    cap.release()
    out.release()
    cv2.destroyAllWindows()


def main():
    # 调用函数并指定输入和输出视频文件路径
    input_video_path = "Videos/TwoPeopleRunning.mp4"
    output_video_path = "Videos/VideoCartoonEffect.mp4"
    main(input_video_path, output_video_path, edge_threshold=5, color_reduction=3000)


if __name__ == "__main__":
    main()

四、注意事项

  1. 在处理视频时,需要逐帧处理每一帧图像,并将处理后的图像写入输出视频。

  2. 调节参数时要注意平衡效果和性能,过大的参数可能会导致处理时间过长,而过小的参数可能会导致效果不明显。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv8改进 | 检测头篇 | 自研超分辨率检测头HATHead助力超分辨率检测(混合注意力变换器检测头)

一、本文介绍 本文给大家带来的改进机制是由由我本人利用HAT注意力机制(超分辨率注意力机制)结合V8检测头去掉其中的部分内容形成一种全新的超分辨率检测头。混合注意力变换器(HAT)的设计理念是通过融合通道注意力和自注意力机制…

记录一个Kafka客户端Offset Explore连不上的问题

我昨天把集群重装了一下,再连这个工具就连不上了(你先把zk和kafka在集群启起来),报错截图如下: 英文翻译过来大概就是说遍历zk指定路径不存在,我还以为zk的问题,回去又把zk的文档翻了一遍&#…

物联网实战--驱动篇之(七)RTC时钟(DS1302)

目录 一、RTC简介 二、DS1302介绍 三、初始化 四、字节读写 五、功能函数 一、RTC简介 实时时钟,简称RTC,这个在STM32的外设里也有,不过STM32F1系列的RTC实际上只有一个计数器功能,如果需要年月日要自己写软件计算 &#xff…

C++/QT 医院信息管理系统

一、项目介绍 (1)管理员、居民、医生三个角色登录;居民可注册账号登录,医生由管理员添加,管理员权限最高 (2)管理员: 模块一:信息管理(医生信息管理、医院…

Leetcode算法训练日记 | day23

一、修剪二叉搜索树 1.题目 Leetcode:第 669 题 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff…

基于级联H桥的多电平逆变器PWM控制策略的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 级联H桥(CHB)多电平逆变器是一种通过多个H桥单元级联实现更高电压等级和更高质量输出波形的电力电子转换装置。这种逆变器在高压大功率场合应用广泛&am…

[CTF]使用浏览器firefox插件伪装IP地址

来源:https://jingyan.baidu.com/article/ab0b56306d9890c15bfa7d6a.html 浏览器想必是大家再熟悉不过的东东了,我们会经常使用它访问下载一些页面或文件。但是对于它的更深层次的功能可能就陌生了。比如说一些网站后台会记录我们的IP地址,假…

U盘怎么加密?U盘加密的方法有哪些?

U盘作为一种便携式的存储设备,广泛应用于日常生活和工作中。但由于其易于携带和使用的特性,U盘中的数据也面临着被未经授权访问的风险。因此,对U盘进行加密成为了保护数据安全的重要措施。本文将介绍几种常见的U盘加密方法,帮助用…

5G智慧港口简介(一)

引言 港口作为交通运输的枢纽,在促进国际贸易和地区发展中起着举足轻重的作用,全球贸易中约 90% 的贸易由海运业承载,作业效率对于港口至关重要。在“工业 4.0”、“互联网 +”大发展的时代背景下,港口也在进行数字化、全自动的转型升级。随着全球 5G 技术浪潮的到来,华为…

android android.permission.MANAGE_EXTERNAL_STORAGE使用

android11 及以上版本&#xff0c;如果release版本要读取外部存储公共目录&#xff0c;即sdcard公共目录&#xff0c;需要在androidManifest.xml下申明 <uses-permission android:name"android.permission.MANAGE_EXTERNAL_STORAGE" /> 如果要发版到海外&…

前端对接fastGPT流式数据+打字机效果

首先在对接api时 参数要设置stream: true, const data {chatId: abc,stream: true,//这里true返回流式数据detail: false,variables: {uid: sfdsdf,name: zhaoyunyao,},messages: [{ content: text, role: user }]}; 不要用axios发请求 不然处理不了流式数据 我这里使用fetch …

7.接口自动化测试-Allure报告

1.环境搭建 &#xff08;1&#xff09;下载并解压allure.zip&#xff0c;不要用中文路径&#xff0c;将bin目录配置到path环境变量 官网&#xff1a;Allure下载 &#xff08;2&#xff09;cmd安装allure-pytest第三方库 pip install allure-pytest 检测是否安装成功 pip show …

ollama与open-webui简单使用案例

参考: https://github.com/ollama/ollama https://github.com/open-webui/open-webui ollama最为大模型后端服务 open-webui前端聊天页面 ollama直接下载客服端安装win cpu安装推理;open-webui使用docker安装 1、ollama 安装好后可以直接运行,cpu使用不稳定比较慢 ollama…

Kimichat的浏览器插件Kimi Copilot:一键总结网页内容

在阅读网页的时候&#xff0c;如果需要总结网页内容要点&#xff0c;可以把链接丢进Kimichat&#xff0c;让它总结。但是&#xff0c;这样稍微有些麻烦。Chrome浏览器现在已经有一个非官方的Kimichat插件&#xff1a; Kimi Copilot - 网页总结助手&#xff0c;可以用Kimi AI一键…

【模板】费马小定理求逆元|快速幂、数论

题目&#xff1a; P1226 【模板】快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 下面这道题用费马小定理快速幂的结论的程序会TLE&#xff0c;且费马小定理需要互质和模数p为质数&#xff0c; 但是可以作为练习 P3811 【模板】模意义下的乘法逆元 - 洛谷 | 计算机…

IJKPLAYER源码分析-iOS端显示

1 简介 1.1 EAGL(Embedded Apple Graphics Library) 与Android系统使用EGL连接OpenGL ES与原生窗口进行surface输出类似&#xff0c;iOS则用EAGL将CAEAGLLayer作为OpenGL ES输出目标。 与 Android EGL 不同的是&#xff0c;iOS EAGL 不会让应用直接向 BackendFrameBuffer 和 F…

maven package的时候@Value

运行时候没问题 ,但是在maven package的时候Value报错 代码如上 ,说红框内的minio.endpoint找不到,我对了一遍配置是能找到的 解决办法,再pom.xml加入如下代码,确保把你的配置文件路径引入进去 <resources> <resource><directory>src/main/resources</…

设计模式-组合模式(Composite Pattern)

1. 概念 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树状的层次结构&#xff0c;用来表示“整体-部分”的关系。 2. 原理结构图 原理图 抽象角色&#xff08;Component&#xff09;&#xff1a;这是组合模式的核心&#xff0c;它定义了树叶和树枝构件的公…

多模态 ——LLaVA 集成先进图像理解与自然语言交互GPT-4的大模型

概述 提出了一种大型模型 LLaVA&#xff0c;它使用 GPT-4 生成多模态语言图像指令跟随数据&#xff0c;并利用该数据将视觉和语言理解融为一体。初步实验表明&#xff0c;LLaVA 展示了出色的多模态聊天能力&#xff0c;在合成多模态指令上的表现优于 GPT-4。 在科学质量保证中…

Web程序设计-实验01 HTML与CSS基础

【实验主题】 影视详情页设计 【实验任务】 1、浏览并分析多个影视详情页面&#xff08;详见参考资源&#xff0c;建议自行搜索更多影视网站&#xff09;的主要元素构成和版面设计&#xff0c;借鉴并构思预期效果。 2、新建 index.html文件&#xff0c;合理运用HTML标记编写…