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对象将每一帧图像写入视频文件,最终生成一个包含液化效果动画的视频。

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

相关推荐
彭祥.6 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
烛阴6 小时前
简单入门Python装饰器
前端·python
超龄超能程序猿6 小时前
(三)PS识别:基于噪声分析PS识别的技术实现
图像处理·人工智能·计算机视觉
好开心啊没烦恼7 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开7 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
Tony沈哲7 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
2301_805054568 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python
万千思绪8 小时前
【PyCharm 2025.1.2配置debug】
ide·python·pycharm
微风粼粼10 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
云天徽上10 小时前
【PaddleOCR】OCR表格识别数据集介绍,包含PubTabNet、好未来表格识别、WTW中文场景表格等数据,持续更新中......
python·ocr·文字识别·表格识别·paddleocr·pp-ocrv5