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

目录

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

一、简单介绍

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

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

四、注意事项


一、简单介绍

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

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

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

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

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

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

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

具体实现方法如下:

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

  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、编写代码

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

2、运行效果

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

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. 调节参数时要注意平衡效果和性能,过大的参数可能会导致处理时间过长,而过小的参数可能会导致效果不明显。

04-12 08:16