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)  # 应用扭曲效果
目录
相关文章
|
测试技术 Linux 网络安全
【Docker项目实战】使用Docker部署astro个人仪表板
【4月更文挑战第9天】使用Docker部署astro个人仪表板
480 1
|
数据安全/隐私保护
3分钟部署 雾锁王国(Enshrouded) 联机服务
通过计算巢快速部署雾锁王国(Enshrouded)联机服务
3分钟部署 雾锁王国(Enshrouded) 联机服务
|
移动开发 前端开发 JavaScript
基于Vue的音乐播放器的设计与实现(论文+源码)_kaic
基于Vue的音乐播放器的设计与实现(论文+源码)_kaic
|
机器学习/深度学习 人工智能 前端开发
【AI系统】编译器基础介绍
随着深度学习的发展,AI模型和硬件技术不断演进,开发者面临如何有效利用算力及应对AI框架迭代的挑战。AI编译器成为解决这些问题的关键技术,它帮助用户专注于上层模型开发,减少手动优化性能的成本,最大化硬件效能。本文探讨编译器基础概念,解释编译器与AI框架的关系,介绍编译器与解释器的区别,以及AOT和JIT编译方式的特点和在AI框架中的应用。通过分析Pass和中间表示IR的作用,进一步理解编译器在AI领域的核心价值。
362 5
|
前端开发 C++ iOS开发
几款主流好用的markdown编辑器介绍
几款主流好用的markdown编辑器介绍
931 1
|
JSON JavaScript 前端开发
TypeScript(十五)配置相关(命令行配置)
TypeScript(十五)配置相关(命令行配置)
228 4
|
数据采集 人工智能 自然语言处理
如何通过AI技术提升内容生产的效率和质量
利用AI提升内容生产效率涉及智能策划(数据分析、热点追踪)、自动化生成(文字、多媒体)、编辑优化(语法检查、事实核查)、个性化推荐、内容审核和合规性检查,以及数据分析反馈。AI通过减少人力成本、增强质量和吸引力,助力内容创新,预示着内容创作新时代的到来。
3159 3
|
JavaScript Ubuntu Linux
Linux系统之部署PPTist在线演示文稿应用
【6月更文挑战第12天】Linux系统之部署PPTist在线演示文稿应用
445 1
|
弹性计算
阿里云服务器采用AMD CPU处理器ECS实例规格大全
阿里云有AMD服务器吗?有的,阿里云百科分享阿里云服务器ECS实例采用AMD处理器的规格大全
804 0
阿里云服务器采用AMD CPU处理器ECS实例规格大全