【计算机视觉】二、图像形成——实验: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://xiahunao.cn/news/2869073.html

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

相关文章

[第二章]二分与前缀和

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

谷歌Gemma大模型本地部署以及线上访问流程

1.谷歌开发出强大的 AI 模型 Gemma,该模型可以在笔记本电脑和台式机上运行,这真是太棒了!开源的 Gemma 模型将使研究人员和开发人员能够更轻松地访问和利用其功能,从而为人工智能领域带来更多创新。【【【【本地安装】】】 下载安…

设计模式在芯片验证中的应用——装饰器

一、装饰器模式 装饰器模式(Decorator)是一种结构化软件设计模式,它提供了一种通过向类对象添加行为来修改类对象的方法,而不会影响同一类的其它对象行为。该模式允许在不修改抽象类的情况下添加类功能。它从本质上允许基类代码对不可预见的修改具有前瞻…

算法导论第十章练习参考答案(18) - 10.1-10.4

Exercise 10.1-1 Exercise 10.1-2 我们将栈命名为T和R。首先,设置T.top 0和R.top n 1。实际上,栈T使用数组的第一部分,栈R使用数组的最后一部分。在栈T中,top是T中最右边的元素。在栈R中,top是R中最左边的元素。 E…

超越 GPT4,科大讯飞,再出王炸!

哈喽,大家好! 去年,科大讯飞星火大模型上线,给大家推荐了一波,演示了其强大的功能,不少小伙伴都立马申请体验了一把,也有私信说非常强大,工作效率提高不少,支持国产大模…

Java代码基础算法练习-判断字符串是否为回文-2024.03.16

任务描述: 回文串是指一个正读和反读都一样的字符串,比如“level”或者“noon”等。要求输入 一个字符串,判断此字符串是否为回文。(注:设字符串长度小于20) 任务要求: package suanfa;import…

一文全面了解向量数据库

1. 什么是向量数据库?** 首先,我们需要理解什么是向量? 向量是基于不同特征或属性来描述对象的数据表示。每个向量代表一个单独的数据点,例如一个词或一张图片,由描述其许多特性的值的集合组成。这些变量有时被称为“…

3.2_5 内存映射文件

文章目录 3.2_5 内存映射文件(一)传统的文件访问方式(二)内存映射文件(Memory-Mapped Files) 总结 3.2_5 内存映射文件 (一)传统的文件访问方式 磁盘的存储是以块为单位的&#xff0…

2024年腾讯云4核8G12M服务器可容纳多大访问量?

腾讯云轻量4核8G12M服务器配置446元一年,646元12个月,腾讯云轻量应用服务器具有100%CPU性能,系统盘为180GB SSD盘,12M带宽下载速度1536KB/秒,月流量2000GB,折合每天66.6GB流量,超出月流量包的流…

【JVM】GCRoot

GC root原理 通过对枚举GCroot对象做引用可达性分析,即从GC root对象开始,向下搜索,形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用,没有形成引用链,那么该对象等待GC回收。 可以作为GC Roots的对…

Jacobian matrix雅可比矩阵

参考链接 https://www.youtube.com/watch?vwUF-lyyWpUc&listPLEZWS2fT1672lJI7FT5OXHJU6cTgkSzV2&index6

python二级备考(2)-简单应用题

第1套 使用turtle库的turtle. right()函数和turtle.fd()函数绘制一个菱形,边长为200像素,4个内角度数为2个60度和2个120度 键盘输入一组人员的姓名、性别、年龄等信息,信息间采用空格分隔,每人一行,空行回车结束录入&a…

电子供应链的未来:电子元器件采购商城的洞察

电子供应链的未来将受到数字化技术、智能化制造和全球化贸易等趋势的深刻影响。在这一背景下,电子元器件采购商城将发挥越来越重要的作用,并提供以下洞察: 数字化转型: 电子元器件采购商城将更加注重数字化转型,通过引…

使用数字人SadTalker创建免费AI主播

很有趣的GitHub项目SadTalker,它能够将一张图片跟一段音频合成一段视频,看起来毫无违和感,如果不仔细看,甚至很难辨别真假,预计未来某一天,一大波网红即将失业。 虽然这个项目目前的主要研究方向还是基于c…

【软考高项】七、信息技术发展之存储、数据库、信息安全

1、存储知识点 存储类型分:封闭式(小型机)和开放式(服务器) 其中开放式又分内置和外挂存储(直连DAS、网格FAS(NAS/SAN)) 2、数据库知识点 数据结构模型: …

2核4G云服务器能支持多少人同时访问?性能测评来了

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?5M带宽下载速度峰值可达640KB/秒,阿腾云以搭建网站为例,假设优化后平均大小为60KB,则5M带宽可支撑10个用户同时在1秒内打开网站,并发数为10,经阿腾云测试&a…

Java中为什么只有值传递?

Java中为什么只有值传递? 对于对象参数而言,实际参数传递给形式参数的只是一个内存地址,让形式参数也指向实际参数所指向的地址,传递的值的内容是对象的引用。 为什么会是这样?让我慢慢为你讲解。 对于Java的传递类…

引领国产洗碗机全面反超,是时候重新认识方太了

文 | 智能相对论 作者 | 佘凯文 2024AWE如期而至,方太作为全球领先的高端厨电专业制造商与创新引领者参与其中,并在开幕当天召开了以“Hi-tech,Hi life”为主题的2024春季新品发布会。 发布会上,方太公布了由国家工业信息安全发…

实验室管理系统 |基于springboot框架+ Mysql+JSP技术+Tomcat的实验室管理系统 设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 用户后台功能模块 用户后台管理 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunw…

【01】htmlcssgit

01-前端干货-html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全…