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

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

相关推荐
砚底藏山河10 分钟前
【量化纯GET实战 #04】批量快照:一次 HTTP GET 取多只股票
java·python·金融·eclipse
烂蜻蜓15 分钟前
Flask入门教程(九):模板渲染——用Jinja2构建动态页面
后端·python·flask
2601_9668714024 分钟前
AE影视后期特效-遮罩/调色/抠像/MG动画/3D/Vlog制作(完结)jzit
python
circuitsosk41 分钟前
大模型本体安全防护实践:提示词注入防御、输出合规过滤与敏感信息脱敏
python·安全·数据脱敏·纵深防御·提示词注入·llmsecurity
工业一体机老司机1 小时前
Python实现工业一体机Modbus-TCP通信-从协议解析到多设备轮询实战
开发语言·python·tcp/ip
2401_885885041 小时前
国际语音php接口代码示例:PHP使用cURL快速调用语音发送API
android·开发语言·前端·人工智能·python·php·语音识别
EW Frontier1 小时前
基于 Python + NumPy 的雷达信号处理仿真平台设计与实现——从 LFM 波形到 CFAR 检测的完整信号链
python·雷达信号处理·cfar\]·mti·mtd
axinawang2 小时前
Tesseract入门--把图片里印刷文字提取成文本
python
青 春 记 忆2 小时前
LeetCode 283. 移动零|Python 解法详解
python·算法·leetcode
人工干智能2 小时前
科普:Python中的生成器——带`yield`的函数
开发语言·python