Python图像处理:打造平滑液化效果动画

液化动画中的强度变化是通过在每一帧中逐渐调整液化效果的强度参数来实现的。在提供的代码示例中,强度变化是通过一个简单的线性插值方法来控制的,即随着动画帧数的增加,液化效果的强度也逐渐增加。

复制代码
def liquify_image(image, center, radius, strength):
    """
    对图像应用液化效果。
    :param image: 原始图像
    :param center: 液化效果的圆心坐标
    :param radius: 液化效果的半径
    :param strength: 液化效果的强度
    :return: 液化后的图像
    """
    # 创建一个与原始图像大小相同的空白图像
    liquified = np.zeros_like(image)
    height, width = image.shape[:2]

    # 创建一个网格,用于记录每个像素的位置
    grid_x, grid_y = np.meshgrid(np.arange(width), np.arange(height))
    grid = np.stack((grid_x, grid_y), axis=-1).astype(np.float32)

    # 计算每个像素到中心的距离
    distances = np.linalg.norm(grid - np.array(center), axis=-1)

    # 应用液化效果
    for y in range(height):
        for x in range(width):
            if distances[y, x] < radius:
                # 根据距离计算偏移量
                offset_x = strength * (center[0] - x) / radius
                offset_y = strength * (center[1] - y) / radius
                grid[y, x] += np.array([offset_x, offset_y])

    # 使用remap函数重新映射图像
    cv2.remap(image, grid, None, cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, dst=liquified)

    return liquified


# 读取图像
image = cv2.imread('0e5.jpg')

# 设置液化参数
center = (image.shape[1] // 2, image.shape[0] // 2)  # 图像中心
radius = 150 * 3  # 液化半径
max_strength = 30 * 3  # 最大液化强度

# 创建一个视频写入对象,设置帧率为30
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 30.0, (image.shape[1], image.shape[0]))

# 创建动画的帧
frames = 120  # 总帧数
for i in range(frames):
    # 逐渐增加液化强度以创建动画效果
    strength = max_strength * (i / frames)
    result_image = liquify_image(image, center, radius, strength)

    # 将帧写入视频
    out.write(result_image)

# 释放视频写入对象
out.release()

# 显示最后一帧
cv2.imshow('Liquified Image', result_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图如下:

以下是实现这一效果的关键步骤:

  1. 定义动画帧数和最大强度

    在代码中,frames变量定义了动画的总帧数,max_strength定义了液化效果的最大强度。

  2. 计算每帧的强度

    在动画的每一帧中,通过strength = max_strength * (i / frames)计算当前帧的液化强度。这里i是当前帧的编号,frames是总帧数。这样,随着i的增加,strength也会从0逐渐增加到max_strength

  3. 应用液化效果

    对于每一帧,使用计算出的strength值调用liquify_image函数,该函数会根据传入的强度参数对图像应用液化效果。

  4. 更新液化效果

    liquify_image函数中,每个像素的偏移量是根据其到液化中心的距离和当前帧的强度来计算的。距离中心越近的像素,偏移量越大,从而产生更明显的液化效果。

  5. 写入视频帧

    液化后的图像作为一帧被写入视频文件中。随着帧的增加,液化效果逐渐增强,从而在视频中创建出动画效果。

  6. 视频输出

    使用cv2.VideoWriter对象将每一帧图像写入视频文件,最终生成一个包含液化效果动画的视频。

通过这种方式,动画的每一帧都展示了液化效果的不同强度,从而创建出平滑过渡的动画效果。这种技术可以用于各种视觉效果的创建,比如模拟水面波动、模拟物体变形等。

相关推荐
kishu_iOS&AI1 小时前
深度学习 —— 损失函数
人工智能·pytorch·python·深度学习·线性回归
好运的阿财1 小时前
OpenClaw工具拆解之canvas+message
人工智能·python·ai编程·openclaw·openclaw工具
wengqidaifeng1 小时前
python启航:1.基础语法知识
开发语言·python
观北海1 小时前
Windows 平台 Python 极简 ORB-SLAM3 Demo,从零实现实时视觉定位
开发语言·python·动态规划
FreakStudio2 小时前
做了个Claude Code CLI 电子宠物:程序员的实体监工代码搭子
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
柴米油盐那点事儿2 小时前
python+mysql+bootstrap条件搜索分页
python·mysql·flask·bootstrap
AC赳赳老秦2 小时前
OpenClaw二次开发实战:编写专属办公自动化技能,适配个性化需求
linux·javascript·人工智能·python·django·测试用例·openclaw
Ulyanov3 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真
刀法如飞4 小时前
一款Python语言Django框架DDD脚手架,助你快速搭建项目
python·ddd·脚手架
刀法如飞4 小时前
一款Python语言Django框架DDD脚手架,适合中大型项目
后端·python·领域驱动设计