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

这篇具有很好参考价值的文章主要介绍了【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

二、几何基元和变换

1、几何基元(Geometric Primitives)

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

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

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

2、几何变换(Geometric Transformations)

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

【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame),计算机视觉,pygame,计算机视觉,python,cv,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"键。

【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame),计算机视觉,pygame,计算机视觉,python,cv,2D变换,人工智能,矩阵

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. 效果展示

【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame),计算机视觉,pygame,计算机视觉,python,cv,2D变换,人工智能,矩阵
【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame),计算机视觉,pygame,计算机视觉,python,cv,2D变换,人工智能,矩阵
【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame),计算机视觉,pygame,计算机视觉,python,cv,2D变换,人工智能,矩阵
【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame),计算机视觉,pygame,计算机视觉,python,cv,2D变换,人工智能,矩阵
【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame),计算机视觉,pygame,计算机视觉,python,cv,2D变换,人工智能,矩阵
【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame),计算机视觉,pygame,计算机视觉,python,cv,2D变换,人工智能,矩阵文章来源地址https://www.toymoban.com/news/detail-842524.html

到了这里,关于【计算机视觉】二、图像形成——实验:2D变换编辑(Pygame)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉】图像增强----图像的傅立叶变换

    个人简介:  📦个人主页:赵四司机 🏆学习方向:JAVA后端开发  ⏰往期文章:SpringBoot项目整合微信支付 🔔博主推荐网站:牛客网 刷题|面试|找工作神器 📣种一棵树最好的时间是十年前,其次是现在! 💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。 目录 一:

    2024年02月04日
    浏览(23)
  • 计算机视觉-图像的傅里叶变换

    😊😊😊 欢迎来到本博客 😊😊😊 本次博客内容将继续讲解关于OpenCV的相关知识 🎉 作者简介 : ⭐️⭐️⭐️ 目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法。然后正在学习深度

    2023年04月08日
    浏览(27)
  • 计算机视觉 | 基于二值图像数字矩阵的距离变换算法

    Hi,大家好,我是半亩花海。 本实验基于 OpenCV 实现了二值图像数字矩阵的距离变换算法。首先生成一个 480x480 的黑色背景图像(定义黑色为0,白色为1),在其中随机选择了三个白色像素点作为距离变换的原点,利用 OpenCV 中 distanceTransform 等相关函数计算并输出这些原点到其

    2024年04月11日
    浏览(30)
  • 计算机视觉实验五——图像分割

    了解图割操作,实现用户交互式分割,通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域,实现分割。 采用聚类法实现图像的分割(K-means方法)。 ①图片准备 博主选择了一张 前景与背景区分明显 的图片,和一张 前景与背景区分不明显 的

    2024年04月15日
    浏览(38)
  • 计算机视觉实验:图像处理综合-路沿检测

    目录 实验步骤与过程 1. 路沿检测方法设计 2. 路沿检测方法实现 2.1 视频图像提取 2.2 图像预处理 2.3 兴趣区域提取 2.4 边缘检测 ​​​​​​​2.5 Hough变换 ​​​​​​​2.6 线条过滤与图像输出 3. 路沿检测结果展示 4. 其他路沿检测方法 实验结论或体会 实验内容: 针对

    2024年02月14日
    浏览(34)
  • 计算机视觉——实验一:图像直方图均衡

    实验目的: 1.熟悉图像的表示及基本元素、通道操作; 2.掌握基本灰度图像变换方法; 3.掌握OpenCV计算机视觉库; 实验要求: 1. 实验提交文件为实验报告和相关程序代码,以压缩包的形式提交,命名规则为“学号数字+姓名+Task1”,如2023154099张三Task1; 2. 所有素材和参考

    2024年01月21日
    浏览(41)
  • 计算机图形学基础:2D/3D坐标变换(Transformation)

    本文讲解了2D变换和3D变换式如何用矩阵表示的 如何将线性和非线性变换进行一个统一表示形式 三维物体在二维空间上的映射 表示向量添加了一维,分别表示单位距离和平移不变形的方向 旋转默认都是以(0, 0)为中心

    2023年04月08日
    浏览(29)
  • 线性变换与计算机视觉的发展

    计算机视觉(Computer Vision)是一门研究如何让计算机理解和解析人类视觉系统所处的环境的科学。它涉及到许多领域,包括图像处理、模式识别、机器学习等。线性变换(Linear Transform)是计算机视觉中的一个基本概念,它可以用来处理图像和其他多维数据。 线性变换是一种将一个

    2024年02月22日
    浏览(35)
  • 计算机视觉--距离变换算法的实战应用

    前言: Hello大家好,我是Dream。 计算机视觉CV是人工智能一个非常重要的领域 。 在本次的距离变换任务中,我们将使用 D4距离度量方法 来对图像进行处理。通过这次实验,我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计算机视觉和图像处理有了更深入的

    2024年02月15日
    浏览(37)
  • 从2D到3D,计算机视觉的ChatGPT何时到来?

    ChatGPT 及其改进型 GPT4通过一个单一模型解决了几乎所有与文本相关的任务,彻底改变了 NLP 领域。然而,这样的一个模型在计算机视觉方面并不存在,特别是对于3D视觉。本文首先从模型的角度简要介绍了深度学习在文本、图像和3D领域的进展。此外,本文还从数据的角度进一

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包