图像风格化处理器 -python-CSDN

目的

使图像变得风格化,动态化,图像转换为视频。后续可通过视频发送至各个平台。

代码效果如下

image.png

代码解析

import cv2 as cv
import numpy as np
import os
import datetime

# 指定包含图片的文件夹路径
folder_path = 'E:\\Photo'  # 请替换为实际文件夹路径

# 读取文件夹中的所有文件名
files = os.listdir(folder_path)

# 过滤出图片文件,假设图片文件是jpg或png格式
image_paths = [os.path.join(folder_path, f) for f in files if f.endswith('.jpg') or f.endswith('.png')]

# 确保至少有一个图片文件
if not image_paths:
    print("没有找到图片文件")
    exit()

# 创建视频窗口
cv.namedWindow('Video')

# 读取第一张图片以获取视频的统一尺寸
first_image = cv.imread(image_paths[0])
if first_image is None:
    print(f"Error: 第一张图像 {image_paths[0]} 没有正确加载。")
    exit()

# img = cv.imread('path_to_image.jpg') # 如果需要读取图片请取消注释
height, width, channels = first_image.shape

# 获取第一张图片的尺寸
height, width = first_image.shape[:2]

current_time = datetime.datetime.now()
timestamp = current_time.strftime("%Y%m%d_%H%M%S")
filename = f"output_{timestamp}.mp4"

# 创建视频编写器
fourcc = cv.VideoWriter_fourcc(*'mp4v')
out = cv.VideoWriter('E:\\Video\\' + filename, fourcc, 40.0, (width, height))

# 遍历所有的图片
for image_path in image_paths:
    # 读取图像并转为灰度图像
    img = cv.imread(image_path)

    # 检查图像是否正确读取
    if img is None:
        print(f"Error: 图像 {image_path} 没有正确加载。")
        continue

    # 调整图像大小以匹配第一张图片的尺寸
    img = cv.resize(img, (width, height))

    gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    gray_img_color = cv.cvtColor(gray_img, cv.COLOR_GRAY2BGR)  # 将灰度图像转换为BGR格式
    # 从黑到白
    for i in range(256):
        ret, threshold_img = cv.threshold(gray_img, i, 255, cv.THRESH_BINARY)
        color_img = cv.cvtColor(threshold_img, cv.COLOR_GRAY2BGR)
        cv.imshow('Video', color_img)
        out.write(color_img)
        if cv.waitKey(30) == 27:
            break

    # 创建一个与原图大小相同的全黑图像
    black_img = np.zeros((height, width, channels), dtype=np.uint8)     

    # 逐步透露图片
    for i in range(256):
        # 计算当前应显示的图像
        alpha = i / 255.0
        revealed_img = cv.addWeighted(black_img, 1 - alpha, gray_img_color, alpha, 0)
        # 显示图像
        cv.imshow('Video', revealed_img)
        # 写入视频帧
        out.write(revealed_img)

        # 按下 'Esc' 键退出循环
        if cv.waitKey(30) == 27:
            break

    for i in range(256):
        # 根据当前色值逐步补充彩色通道
        colored_img = np.zeros_like(img)
        colored_img[:, :, 0] = np.minimum(gray_img + i, 255)
        colored_img[:, :, 1] = np.minimum(gray_img + i, 255)
        colored_img[:, :, 2] = np.minimum(gray_img + i, 255)
        # 显示图像
        cv.imshow('Video', colored_img)
        # 写入视频帧
        out.write(colored_img)
        # 按下 'Esc' 键退出循环
        if cv.waitKey(30) == 27:
            break

    # 从黑白过渡到彩色原图
    for i in range(1, 256):
        alpha = i / 255.0
        blended_img = cv.addWeighted(gray_img_color, 1 - alpha, img, alpha, 0)
        cv.imshow('Video', blended_img)
        out.write(blended_img)
        if cv.waitKey(30) == 27:
            break

    # 创建一个与原图大小相同的全黑图像
    black_img = np.ones((height, width, channels), dtype=np.uint8) * 255  

    # 逐步透露图片
    for i in range(256):
        # 计算当前应显示的图像
        alpha = i / 255.0
        revealed_img = cv.addWeighted(img, 1 - alpha, black_img, alpha, 0)
        # 显示图像
        cv.imshow('Video', revealed_img)
        # 写入视频帧
        out.write(revealed_img)

        # 按下 'Esc' 键退出循环
        if cv.waitKey(30) == 27:
            break
    
# 释放视频编写器和窗口
out.release()
cv.destroyAllWindows()

解析

  1. 导入必要的库
    • cv2:OpenCV库,用于图像和视频处理。
    • numpy:用于数值计算。
    • os:用于文件和目录操作。
    • datetime:用于获取当前时间戳。
  2. 指定文件夹路径
    • folder_path:指定包含图片的文件夹路径。
  3. 读取文件夹中的所有文件名
    • os.listdir(folder_path):获取文件夹中的所有文件名。
  4. 过滤出图片文件
    • image_paths:过滤出.jpg.png格式的图片文件路径。
  5. 确保至少有一个图片文件
    • 如果没有找到图片文件,程序将退出。
  6. 创建视频窗口
    • cv.namedWindow('Video'):创建一个名为’Video’的窗口。
  7. 读取第一张图片以获取视频的统一尺寸
    • first_image = cv.imread(image_paths[0]):读取第一张图片。
    • 如果第一张图片没有正确加载,程序将退出。
  8. 获取第一张图片的尺寸
    • height, width, channels = first_image.shape:获取图片的高度、宽度和通道数。
  9. 创建视频编写器
    • fourcc = cv.VideoWriter_fourcc(*'mp4v'):定义视频编码器。
    • out = cv.VideoWriter('E:\\Video\\' + filename, fourcc, 40.0, (width, height)):创建视频编写器,指定输出路径、编码器、帧率和视频尺寸。
  10. 遍历所有的图片
  • 读取图像并转为灰度图像。
  • 调整图像大小以匹配第一张图片的尺寸。
  • 将灰度图像转换为BGR格式。
  • 从黑到白逐步显示图像。
  • 创建一个与原图大小相同的全黑图像。
  • 逐步透露图片。
  • 根据当前色值逐步补充彩色通道。
  • 从黑白过渡到彩色原图。
  • 创建一个与原图大小相同的全黑图像。
  • 逐步透露图片。
  1. 释放视频编写器和窗口
  • out.release():释放视频编写器。
  • cv.destroyAllWindows():关闭所有OpenCV窗口。

API解析

  • os.listdir(path):返回指定路径下的文件和文件夹列表。
  • os.path.join(path, *paths):将多个路径组合后返回。
  • cv.imread(filename[, flags]):读取图像文件。
  • cv.namedWindow(winname[, flags]):创建一个窗口。
  • cv.VideoWriter_fourcc(*fourcc):创建一个视频编码器。
  • cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor]):创建一个视频编写器。
  • cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]):调整图像大小。
  • cv.cvtColor(src, code[, dst[, dstCn]]):转换图像颜色空间。
  • cv.threshold(src, thresh, maxval, type[, dst]):对图像进行阈值处理。
  • cv.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]):计算两个图像的加权和。
  • cv.imshow(winname, mat):在指定窗口中显示图像。
  • cv.waitKey(delay):等待按键事件。
  • cv.destroyAllWindows():关闭所有OpenCV窗口。
  • cv.VideoWriter.write(image):将图像写入视频文件。
  • cv.VideoWriter.release():释放视频编写器。
  • 28
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值