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

文章目录

  • 一、向量和矩阵的基本运算
  • 二、几何基元和变换
    • 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 imgreturn 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 = textself.color = colordef 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 = Falseelif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()for button in buttons:if button.is_clicked(mouse_pos):selected_transform = button.texttransformed_img = original_img.copy()if event.button == 1:  # 鼠标左键mouse_dragging = Truedrag_start_pos = mouse_poselif event.type == pygame.MOUSEBUTTONUP:if event.button == 1:  # 鼠标左键mouse_dragging = Falseelif 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] / 100shear_y = drag_offset[1] / 100transformed_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.rhkb.cn/news/277214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PHP的数字化档案管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的数字化档案管理系统 一 介绍 此数字化档案管理系统基于原生PHP,MVC架构开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 php(mvc)mysqlbootstrapphpstudyvscode 二 功能 …

SwiftUI的Alert使用方式

SwiftUI的Alert使用方式 记录一下SwiftUI的Alert使用方式,比较简单直接上代码 import SwiftUIstruct AlertBootCamp: View {State var showAlert falsevar body: some View {Button {showAlert.toggle()} label: {Text("alert show")}/// 单按钮 // …

python知识点总结(一)

这里写目录标题 一、什么是WSGI,uwsgi,uWSGI1、WSGI2、uWSGI3、uwsgi 二、python中为什么没有函数重载?三、Python中如何跨模块共享全局变量?四、内存泄露是什么?如何避免?五、谈谈lambda函数作用?六、写一个函数实现字符串反转,尽可能写出你知道的所…

面试官:volatile如何保证可见性的,具体如何实现?

写在开头 在之前的几篇博文中,我们都提到了 volatile 关键字,这个单词中文释义为:不稳定的,易挥发的,在Java中代表变量修饰符,用来修饰会被不同线程访问和修改的变量,对于方法,代码…

电脑自带dll修复在哪里打开呢?马上教会你

由于各种原因,电脑可能会出现一些问题,其中之一就是dll文件丢失。Dll文件是动态链接库文件,它们包含了许多程序运行所需的函数和资源。当这些文件丢失或损坏时,可能会导致程序无法正常运行或出现错误提示。本文将介绍电脑dll文件丢…

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下 1. ForeverStrongCheng/OpenCV-tutorials2. Fork -> ForeverStrongCheng/R2CNN_Faster-RCNN_TensorflowReferences 访问仓库页面,点击 Fork 按钮创建自己的仓库。 Fork 是将 GitHub 的某个特定仓库复制到自己…

C语言内存函数详解

文章目录 前言一、memcpy函数(内存拷贝函数)二、memmove重叠拷贝函数三.memset内存设置函数四.memcmp内存比较函数总结 前言 我们之前按学习了C语言标准库中提供了一系列的字符和字符串库函数,接下来我们就学习一下关于内存相关的一些函数。…

LeetCode 面试经典150题 26.删除有序数组中的重复项

题目: 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量…

AVCE - AV Evasion Craft Online 更新 8 种加载方式 - 过 WD 等

免责声明:本工具仅供安全研究和教学目的使用,用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任,且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规,并理解并同意本声明…

【Linux-网络编程】

Linux-网络编程 ■ 网络结构■ C/S结构■ B/S结构 ■ 网络模型■ OSI七层模型■ TCP/IP四层模型 ■ TCP■ TCP通信流程■ TCP三次握手■ TCP四次挥手 ■ 套接字:socket 主机IP 主机上的进程(端口号)■ TCP传输文件 ■ 网络结构 ■ C/S结构…

基于java+springboot开发的计算机毕业设计网文论坛管理系统设计与实现【附源码】

基于javaspringboot开发的计算机毕业设计网文论坛管理系统设计与实现【附源码】 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联…

JavaScript 基础知识

一、初识 JavaScript 1、JS 初体验 JS 有3种书写位置&#xff0c;分别为行内、内部和外部。 示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

深入了解 大语言模型(LLM)微调方法

引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起到了非常关键的作用&#xff0c;它提升了模型的生成效率和适应性&#xff0c;使其能够在多样化的应用场景中发挥更大的价值。 那么&…

pta上的几个例题

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

Git学习记录

目录 Git Git介绍 版本控制 版本控制工具 集中式版本控制工具 分布式版本控制工具 Git工作机制 ​编辑 Git和代码托管中心 Git安装 Git常用命令 设置用户签名 初始化本地库 查看本地库状态 添加到暂存区 提交到本地库 修改文件 历史版本 查看历史版本 版本…

【系统架构师】-第3章-信息系统基础知识

1、信息系统的基本功能 输入&#xff1a;决定于系统所要达到的目的及系统的能力和信息环境的许可存储&#xff1a;存储各种信息资料和数据的能力处理&#xff1a;数据处理工具&#xff0c;利用OLAP、DM&#xff08;数据挖掘&#xff09;技术输出&#xff1a;保证最终实现最佳的…

SQLiteC/C++接口详细介绍之sqlite3类(八)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;七&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;八&#xff09;&#xff08;暂未发表&#xff09; 24.sqlite3_cr…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 2、线条平滑曲面但有间隔

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata imp…

微服务:Bot代码执行

每次要多传一个bot_id 判网关的时候判127.0.0.1所以最好改localhost 创建SpringCloud的子项目 BotRunningSystem 在BotRunningSystem项目中添加依赖&#xff1a; joor-java-8 可动态编译Java代码 2. 修改前端&#xff0c;传入对Bot的选择操作 package com.kob.botrunningsy…

【QT】文件流操作(QTextStream/QDataStream)

文本流/数据流&#xff08;二级制格式&#xff09; 文本流 &#xff08;依赖平台&#xff0c;不同平台可能乱码&#xff09;涉及文件编码 #include <QTextStream>操作的都是基础数据类型&#xff1a;int float string //Image Qpoint QRect就不可以操作 需要下面的 …