warp

简介: 【6月更文挑战第30天】
import numpy as np
from PIL import Image
import cv2
from utils.face import face_keypoints, draw_points
import matplotlib.pyplot as plt

class SimpleWarpEffect:
    def __init__(self, center, mouse, radius):
        self.center = center
        self.mouse = mouse
        self.radius = radius

    def warp(self, x, y, center, mouse, radius):
        cx, cy = center
        mx, my = mouse
        dis_x_c = np.sqrt((x - cx) ** 2 + (y - cy) ** 2)
        if dis_x_c > radius:
            return x, y
        factor = ((radius - dis_x_c) / radius) ** 2
        u = x - factor * (mx - cx)
        v = y - factor * (my - cy)
        return u, v

    def __call__(self, img):
        width, height = img.size
        new_img = img.copy()
        pixels = new_img.load()
        for x in range(width):
            for y in range(height):
                u, v = self.warp(x, y, self.center, self.mouse, self.radius)
                u, v = int(round(u)), int(round(v))
                if 0 <= u < width and 0 <= v < height:
                    pixels[x, y] = img.getpixel((u, v))
        return new_img
  1. 初始化方法 __init__:

    def __init__(self, center, mouse, radius):
    

    这个方法初始化 SimpleWarpEffect 类的实例,接受三个参数:

    • center: 定义扭曲效果的中心点,通常是鼠标按下的点。
    • mouse: 鼠标释放时的位置,用于确定扭曲的方向和程度。
    • radius: 扭曲效果的作用半径,定义了扭曲影响范围。
  2. 扭曲方法 warp:

    def warp(self, x, y, center, mouse, radius):
    

    这是一个辅助方法,用于计算图像中每个点 (x, y) 扭曲后的新位置 u, v。它考虑了点到中心点的距离,并根据这个距离来计算扭曲的程度:

    • 首先计算点 (x, y) 到中心点 (cx, cy) 的距离 dis_x_c
    • 如果这个距离大于作用半径 radius,则点不会被扭曲,直接返回原始坐标。
    • 否则,计算扭曲因子 factor,这个因子随着距离中心点的距离增加而增加,从而实现越靠近中心点扭曲越大的效果。
    • 根据扭曲因子和鼠标点与中心点的相对位置,计算新坐标 uv
  3. 魔术方法 __call__:

    def __call__(self, img):
    

    这个方法允许类的实例表现得像一个函数,可以通过调用实例来应用扭曲效果。它接受一个参数 img,即要扭曲的图像:

    • 获取图像的尺寸 widthheight
    • 创建图像的一个副本 new_img,以避免修改原始图像。
    • 使用 load 方法加载图像的像素数据,以便可以直接访问和修改。
    • 遍历图像的每个像素点,使用 warp 方法计算扭曲后的新坐标。
    • 将每个像素点的颜色值从原始图像中取出,并设置到新图像的相应位置。
  4. 图像扭曲过程:

    • 对于图像中的每个像素点,如果它在扭曲作用的半径内,就根据 warp 方法计算出新位置。
    • 如果像素点的新坐标仍然在图像范围内,就从原始图像中取出该位置的像素值,并将其设置到新图像的当前位置。
    • 最后返回扭曲后的图像。

这个类实现了一个简单的图像扭曲效果,通过局部地移动像素点来模拟一种向中心点“吸引”的效果。这种效果可以用于图像编辑或特殊视觉效果的创建。使用时,你只需要创建 SimpleWarpEffect 的实例,并传入适当的参数,然后使用这个实例调用要扭曲的图像即可。例如:

# 假设 image 是一个 PIL Image 对象
warp_effect = SimpleWarpEffect(center=(width//2, height//2), mouse=(mouse_x, mouse_y), radius=50)
warped_image = warp_effect(image)  # 应用扭曲效果
目录
相关文章
|
机器学习/深度学习 人工智能 数据可视化
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
3021 0
【好物分享】onnx-modifier:可视化操作助力模型更改,让你不再为更改模型烦恼!
|
5月前
|
人工智能 监控 网络安全
不想上班?让“OpenClaw”替你干活!帮你24小时开工!附秒级部署OpenClaw教程
每天清晨被闹钟叫醒,拖着疲惫的身躯奔赴工位,面对堆积如山的邮件、枯燥重复的报表、永无止境的信息整理,是不是无数次在心里默念“不想上班”?我们厌倦的从来不是工作本身,而是那些机械、琐碎、毫无创造性的重复劳动——明明几分钟就能说清的需求,却要花几小时手动执行;明明可以自动完成的流程,却要日复一日浪费时间精力。
2165 9
|
11月前
|
JSON 监控 API
抖音视频详情API秘籍!轻松获取视频详情数据
抖音视频详情API是抖音开放平台的核心接口,通过视频ID可获取包括标题、播放量、点赞数、评论等50多个字段,适用于内容分析、竞品监控和广告评估等场景。接口支持HTTP GET请求,返回JSON格式数据,便于解析处理。文中还提供了使用Python调用该接口的示例代码,包含请求发送、认证、响应处理等功能,帮助开发者快速获取视频数据。
2909 5
|
机器学习/深度学习 人工智能 前端开发
【AI系统】编译器基础介绍
随着深度学习的发展,AI模型和硬件技术不断演进,开发者面临如何有效利用算力及应对AI框架迭代的挑战。AI编译器成为解决这些问题的关键技术,它帮助用户专注于上层模型开发,减少手动优化性能的成本,最大化硬件效能。本文探讨编译器基础概念,解释编译器与AI框架的关系,介绍编译器与解释器的区别,以及AOT和JIT编译方式的特点和在AI框架中的应用。通过分析Pass和中间表示IR的作用,进一步理解编译器在AI领域的核心价值。
802 5
|
编解码 算法 计算机视觉
YOLOv11改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解
YOLOv11改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解
3002 11
|
机器学习/深度学习 数据采集 人工智能
探索人工智能中的深度学习模型优化策略
探索人工智能中的深度学习模型优化策略
727 13
|
存储 前端开发 JavaScript
闲鱼唤端的背后
唤醒沉睡的你
2251 107
闲鱼唤端的背后
|
机器学习/深度学习 并行计算 PyTorch
PyTorch | 加速模型训练的妙招
PyTorch | 加速模型训练的妙招
|
数据采集 人工智能 自然语言处理
如何通过AI技术提升内容生产的效率和质量
利用AI提升内容生产效率涉及智能策划(数据分析、热点追踪)、自动化生成(文字、多媒体)、编辑优化(语法检查、事实核查)、个性化推荐、内容审核和合规性检查,以及数据分析反馈。AI通过减少人力成本、增强质量和吸引力,助力内容创新,预示着内容创作新时代的到来。
3476 3
|
API Android开发 开发者
【Android App】Vulkan实现宇宙中旋转雷达动画效果(附源码和原始视频 超详细必看)
【Android App】Vulkan实现宇宙中旋转雷达动画效果(附源码和原始视频 超详细必看)
682 1