【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame)

news2024/11/24 7:09:07

文章目录

  • 一、向量和矩阵的基本运算
  • 二、几何基元和变换
    • 1、几何基元(Geometric Primitives)
    • 2、几何变换(Geometric Transformations)
    • 2D变换编辑器
      • 0. 程序简介
        • 环境说明
        • 程序流程
      • 1. 各种变换
        • 平移变换
        • 旋转变换
        • 等比缩放变换
        • 缩放变换
        • 镜像变换
        • 剪切变换
      • 2. 按钮
        • 按钮类
        • 创建按钮
      • 3. Pygame
        • 初始化变量
        • 初始化Pygame
        • 主循环
        • 退出Pygame
      • 4. 效果展示

一、向量和矩阵的基本运算

【计算机视觉】二、图像形成:1、向量和矩阵的基本运算:线性变换与齐次坐标

二、几何基元和变换

1、几何基元(Geometric Primitives)

  几何基元是计算机图形学中最基本的图形对象,它们是构建更复杂图形的基础单元。常见的几何基元包括:

  • 点(Point): 由一对或一组坐标值表示的零维对象。
  • 线段(Line Segment): 由两个端点确定的一维对象。
  • 多边形(Polygon): 由一系列顶点连接而成的闭合平面图形,是二维对象。
  • 曲线(Curve): 由一系列控制点和方程确定的平滑曲线,如贝塞尔曲线、样条曲线等。
  • 圆(Circle): 由一个圆心和半径确定的二维闭合曲线。
  • 球体(Sphere): 由一个球心和半径确定的三维闭合曲面。

  这些基本的几何基元可以通过组合、变换等操作构建出更加复杂的图形对象,如三维模型、场景等。

2、几何变换(Geometric Transformations)

【计算机视觉】二、图像形成:2、几何基元和几何变换:2D变换

在这里插入图片描述

2D变换编辑器

0. 程序简介

  本人使用 Pygame 库实现了一个图像变换程序,提供六种不同的变换操作,分别是平移、旋转、等比缩放、缩放、镜像和剪切。可以通过点击相应的按钮选择要执行的变换操作,然后使用鼠标拖动来调整变换的参数,实时查看变换后的图像效果。

环境说明

  安装Pygame库

pip install pygame
程序流程
  1. 确保图像"image.jpg"文件与Python文件在同一目录下。

  2. 运行Python文件,将会弹出一个888x888的窗口,显示原始图像和一排按钮。

  3. 点击任意一个按钮,选择相应的变换操作。按钮及对应的变换操作如下:

    • “Translate”: 平移变换
    • “Rotate”: 旋转变换
    • “Isotropic Scale”: 等比缩放变换
    • “Scale”: 缩放变换
    • “Mirror”: 镜像变换
    • “Shear”: 剪切变换
  4. 按住鼠标左键,并拖拽鼠标,可以实时调整变换效果:

    • 平移变换: 拖拽方向和距离决定平移的偏移量。
    • 旋转变换: 拖拽的水平距离决定旋转角度。
    • 等比缩放变换: 拖拽的水平距离决定缩放比例。
    • 缩放变换: 拖拽的水平距离决定x方向缩放比例,垂直距离决定y方向缩放比例。
    • 镜像变换: 向右拖拽进行水平镜像,向左拖拽进行垂直镜像。
    • 剪切变换: 拖拽的水平距离决定x方向剪切系数,垂直距离决定y方向剪切系数。
  5. 变换后的图像将显示在原始图像的右侧。

  6. 窗口上方会显示当前选择的变换类型。

  7. 要退出程序,请关闭窗口或按下键盘上的"Esc"键。

在这里插入图片描述

1. 各种变换

平移变换
def translate(img, x, y):
    width, height = img.get_size()
    translated_img = pygame.Surface((window_width, window_height), pygame.SRCALPHA)
    translated_img.blit(img, (x, y))
    return translated_img
旋转变换
def rotate(img, angle):
    rotated_img = pygame.transform.rotate(img, angle)
    return rotated_img
等比缩放变换
def isotropic_scale(img, scale_factor):
    width, height = img.get_size()
    new_size = (int(width * scale_factor), int(height * scale_factor))
    scaled_img = pygame.transform.scale(img, new_size)
    return scaled_img
缩放变换
def scale(img, scale_x, scale_y):
    width, height = img.get_size()
    new_width = int(width * scale_x)
    new_height = int(height * scale_y)
    scaled_img = pygame.transform.scale(img, (new_width, new_height))
    return scaled_img
镜像变换
def mirror(img, mirror_type):
    if mirror_type == 'horizontal':
        mirrored_img = pygame.transform.flip(img, True, False)
    elif mirror_type == 'vertical':
        mirrored_img = pygame.transform.flip(img, False, True)
    else:
        return img
    return mirrored_img
剪切变换
def shear(img, shear_x, shear_y):
    width, height = img.get_size()
    sheared_img = pygame.Surface((width + abs(shear_x * height), height + abs(shear_y * width)))
    sheared_img.set_colorkey((0, 0, 0))
    for x in range(width):
        for y in range(height):
            sheared_img.blit(img, (x + shear_x * y, y + shear_y * x), (x, y, 1, 1))
    return sheared_img

2. 按钮

按钮类
class Button:
    def __init__(self, x, y, width, height, text, color):
        self.rect = pygame.Rect(x, y, width, height)
        self.text = text
        self.color = color

    def draw(self, surface):
        pygame.draw.rect(surface, self.color, self.rect)
        font = pygame.font.Font(None, 24)
        text = font.render(self.text, True, (255, 255, 255))
        text_rect = text.get_rect(center=self.rect.center)
        surface.blit(text, text_rect)

    def is_clicked(self, pos):
        return self.rect.collidepoint(pos)

创建按钮
buttons = [
    Button(50, 50, 150, 50, "Translate", (255, 0, 0)),
    Button(250, 50, 150, 50, "Rotate", (255, 165, 0)),
    Button(450, 50, 150, 50, "Isotropic Scale", (0, 255, 0)),
    Button(650, 50, 150, 50, "Scale", (0, 255, 255)),
    Button(50, 150, 150, 50, "Mirror", (0, 0, 255)),
    Button(250, 150, 150, 50, "Shear", (128, 0, 128))
]
  • "Translate"按钮颜色为红色 (255, 0, 0)
  • "Rotate"按钮颜色为橙色 (255, 165, 0)
  • "Isotropic Scale"按钮颜色为绿色 (0, 255, 0)
  • "Scale"按钮颜色为青色 (0, 255, 255)
  • "Mirror"按钮颜色为蓝色 (0, 0, 255)
  • "Shear"按钮颜色为紫色 (128, 0, 128)
    问:为什么没有黄色
    答:黄色太耀眼了………

3. Pygame

初始化变量
selected_transform = None
transformed_img = original_img.copy()
mouse_dragging = False
drag_start_pos = (0, 0)
drag_offset = (0, 0)
translation_offset = (0, 0)  # 平移偏移量变量
初始化Pygame
pygame.init()

# 设置窗口大小
window_width, window_height = 888, 888
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("Image Transformations")

# 加载并调整原始图像大小为256x256
original_img = pygame.image.load("image.jpg")
original_img = pygame.transform.scale(original_img, (256, 256))
主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            mouse_pos = pygame.mouse.get_pos()
            for button in buttons:
                if button.is_clicked(mouse_pos):
                    selected_transform = button.text
                    transformed_img = original_img.copy()
            if event.button == 1:  # 鼠标左键
                mouse_dragging = True
                drag_start_pos = mouse_pos
        elif event.type == pygame.MOUSEBUTTONUP:
            if event.button == 1:  # 鼠标左键
                mouse_dragging = False
        elif event.type == pygame.MOUSEMOTION:
            if mouse_dragging:
                mouse_pos = pygame.mouse.get_pos()
                drag_offset = (mouse_pos[0] - drag_start_pos[0], mouse_pos[1] - drag_start_pos[1])
                if selected_transform == "Translate":
                    translation_offset = drag_offset  # 更新平移偏移量
                    transformed_img = translate(original_img, translation_offset[0], translation_offset[1])
                elif selected_transform == "Rotate":
                    angle = drag_offset[0]
                    transformed_img = rotate(original_img, angle)
                elif selected_transform == "Isotropic Scale":
                    scale_factor = max(0.1, 1 + drag_offset[0] / 100)  # 限制缩放比例在0.1到无穷大之间
                    transformed_img = isotropic_scale(original_img, scale_factor)
                elif selected_transform == "Scale":
                    scale_x = max(0.1, 1 + drag_offset[0] / 100)  # 限制x方向缩放比例在0.1到无穷大之间
                    scale_y = max(0.1, 1 + drag_offset[1] / 100)  # 限制y方向缩放比例在0.1到无穷大之间
                    transformed_img = scale(original_img, scale_x, scale_y)
                elif selected_transform == "Mirror":
                    if drag_offset[0] > 0:
                        mirror_type = 'horizontal'
                    else:
                        mirror_type = 'vertical'
                    transformed_img = mirror(original_img, mirror_type)
                elif selected_transform == "Shear":
                    shear_x = drag_offset[0] / 100
                    shear_y = drag_offset[1] / 100
                    transformed_img = shear(original_img, shear_x, shear_y)

    # 清空窗口
    window.fill((222, 222, 222))

    # 显示原始图像
    window.blit(original_img, (50, 250))

    # 显示变换后的图像
    if transformed_img is not None:
        window.blit(transformed_img, (350, 250))

    # 显示选择的变换
    if selected_transform is not None:
        font = pygame.font.Font(None, 36)
        text = font.render(f"Selected Transform: {selected_transform}", True, (255, 255, 255))
        text_rect = text.get_rect(center=(window_width // 2, 222))
        window.blit(text, text_rect)

    # 绘制按钮
    for button in buttons:
        button.draw(window)

    # 更新显示
    pygame.display.flip()
退出Pygame
pygame.quit()

4. 效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1522613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端vue-Taro框架中使用插件 ---pinyin 将城市树形分类

1.需求 当我做一个获取城市的功能的时候 我发向后端返回的数据 和我想i选要的相差太多 这样的在手机端可以滑动 并且 快捷选中的城市列表 目前的数据是这样的,就是一个城市数组 目前这样的数组 我要想显示我的页面实现功能是不行的 需要是树形结够 所以我前端…

CI/CD实战-git工具使用 1

版本控制系统 本地版本控制系统 集中化的版本控制系统 分布式版本控制系统 git官网文档:https://git-scm.com/book/zh/v2 Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(sta…

【CTF web1】

CTF web 一、CTF web -PHP弱类型1、是否相等?2、转换规则: 二、CTF web -md5绕过1、若类型比较绕过2、null绕过3、碰撞绕过 三、习题 一、CTF web -PHP弱类型 1、是否相等? :在进行比较的时候,会先判断两种字符串的类型是否相等&…

EVENG环境安装及测试 1

文章目录 下载eve镜像导入镜像访问测试导入自定义镜像 下载eve镜像 下载地址 链接:https://pan.baidu.com/s/1NqGE34oE5qZ6TCugMymPDg 提取码:f4m1 导入镜像 安装vmware 虚拟机,文件->打开 选中上述镜像 输入虚拟机的名称和保存 路径&a…

接口幂等性问题和常见解决方案

接口幂等性问题和常见解决方案 1.什么是接口幂等性问题1.1 会产生接口幂等性的问题1.2 解决思路 2.接口幂等性的解决方案2.1 唯一索引解决方案2.2 乐观锁解决方案2.3 分布式锁解决方案2.4 Token解决方案(最优方案) 1.什么是接口幂等性问题 幂等性: 用户同一操作发起的一次或多…

无人机助力智慧农田除草新模式,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统

科技发展到今天,无人机喷洒药物已经不是一件新鲜事情了,在很多高危的工作领域中,比如高空电力设备除冰,电力设备部件传送更换等等,无人机都可以扮演非常出色的作用,前面回到老家一段时间,最近正…

Linux系统——Session ID(负载均衡如何保持会话)

目录 一、实验环境搭建 二、部署Nginx代理服务器配置 三、部署后端真是服务器Tomcat配置 四、配置Tomcat的Session ID会话保持 五、测试 此次实验是Tomcat后端服务器如何做Session ID会话保持 一、实验环境搭建 [rootlocalhost ~]#systemctl stop firewalld [rootlocalho…

CodeTop day3

class Solution {public int[] sortArray(int[] nums) {//这种方法超时【快速排序】for (int i0;i<nums.length-1;i){int minIndex i;//假设当前开始下标为最小元素下标for (int ji1;j<nums.length;j){//从i到nums。length-1区间里找到最小值下标if (nums[j]<nums[mi…

腾讯云图形验证码的PHP示例

需要准备的 1.API密钥 SecretId 及 SecretKey 两部分&#xff0c; SecretId 用于标识 API 调用者的身份&#xff0c; SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。 前往API密钥管理页面&#xff0c;即可进行获取 https://console.cloud.tencent.com/cam/ca…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:UIExtensionComponent (系统接口))

UIExtensionComponent用于支持在本页面内嵌入其他应用提供的UI。展示的内容在另外一个进程中运行&#xff0c;本应用并不参与其中的布局和渲染。 通常用于有进程隔离诉求的模块化开发场景。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0…

Linux服务器(RedHat、CentOS系)安全相关巡检shell脚本

提示&#xff1a;巡检脚本可以使用crontab定时执行&#xff0c;人工根据执行结束时间点统一收集报告文件即可。 #!/bin/bash# Define output file current_date$(date "%Y%m%d") # Gets the current date in YYYYMMDD format echo >server_security_inspection_r…

Python基础综合案例-数据可视化

一、数据可视化 - 折线图可视化 1.1、json数据格式 """ 演示JSON数据和Python字典的相互转换 """ import json # 准备列表&#xff0c;列表内每一个元素都是字典&#xff0c;将其转换为JSON data [{"name": "张大山", &quo…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Stack)

堆叠容器&#xff0c;子组件按照顺序依次入栈&#xff0c;后一个子组件覆盖前一个子组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 接口 Stack(value?: { ali…

深度学习-基于机器学习的情绪分析研究

概要 互联网技术的迅速发展使得社交平台逐渐成为热点事件中社会情感的枢纽。社会热点事件的舆论监管的其中一个重要环节就是能够准确分析民众的社会情绪。本文旨在探索可以基于文本大数据彻底分析民众对热点事件的社会情绪的模型和方法。先是从社交平台上借助文本大数据、对数据…

实战:django项目环境搭建(pycharm,virtualBox)

django项目环境搭建 一.创建虚拟环境二.创建PyCharm远程连接 一.创建虚拟环境 需要用到的软件&#xff1a;PyCharm&#xff0c;VirtualBox虚拟机。 1.打开虚拟机终端&#xff0c;创建新的虚拟环境 Book。 2.在虚拟环境中创建新的文件夹 library&#xff0c;cd命令进入该文件…

抖去推无人直播+矩阵托管+AI文案撰写一体化工具如何开发搭建

一、 开发和搭建抖去推无人直播矩阵托管AI文案撰写一体化工具需要以下步骤&#xff1a; 确定功能需求&#xff1a;确定抖去推无人直播、矩阵托管和AI文案撰写的具体功能需求&#xff0c;如直播推流、直播管理、托管服务、AI文案生成等。 技术选型&#xff1a;选择适合开发该工…

OpenCV 环境变量参考

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a; OpenCV4.9.0配置选项参考 下一篇&#xff1a;OpenCV4.9.0配置选项参考 引言&#xff1a; OpenCV是一个广泛使用的图像和视频处理开源库&#xff0c;拥有丰富的图像算法和函…

基于opencv的图像处理系统的设计与实现

概要 随着计算机技术的飞速发展&#xff0c;图像技术在各领域的研究和应用日渐深入和广泛。opencv是近年来推出的开源、免费的计算机视觉库,利用其所包含的函数可以很方便地实现数字图像处理。本文旨在对opencv进行一个快速全面简介,通过介绍图像处理的相关函数&#xff0c;使读…

npm下载慢换国内镜像地址

1 设置淘宝镜像地址 npm config set registry http://registry.npm.taobao.org 2 查看当前下载地址 npm config get registry 3 其它镜像地址列表&#xff1a; 1. 官方镜像&#xff1a;https://registry.npmjs.org/ 2. 淘宝镜像&#xff1a;https://registry.npm.taobao.o…

浏览器如何进行静态资源缓存?—— 强缓存 协商缓存

在平时使用浏览器排查问题的过程中&#xff0c;我们有时会看到浏览器网络请求中出现304状态码&#xff0c;那么是什么情况下出现304呢&#xff1f;下面是关于这一现象的解释&#xff1a; 浏览器如何进行静态资源缓存&#xff1f;—— 强缓存 & 协商缓存 状态码 304浏览器如…