关于transform旋转时旋转产生多余像素

现在transform的包还挺多,不过我没搜到/不会搜他们有能满足我需求的方法,所以还是摸索这个基本的torchvision版本

class RandomRotateWithPadding:
    def __init__(self, degrees, padding=0, fill=0, padding_mode='edge'):
        self.degrees = degrees
        self.padding = padding
        self.padding_mode = padding_mode
        self.fill = fill

    def __call__(self, img):
        # 计算旋转角度
        angle = random.uniform(self.degrees[0], self.degrees[1])

        # 将PIL图像转换为numpy数组
        np_img = np.array(img)

        # 计算需要的padding大小
        diagonal = int((np_img.shape[0] ** 2 + np_img.shape[1] ** 2) ** 0.5)
        padding = (diagonal - min(np_img.shape[0], np_img.shape[1])) // 2

        # 使用numpy的pad函数应用reflect填充
        np_padded = np.pad(np_img, [(padding, padding), (padding, padding), (0, 0)], mode=self.padding_mode)

        # 将填充后的numpy数组转回PIL图像
        img_padded = Image.fromarray(np_padded)

        # 旋转图像
        img_rotated = img_padded.rotate(angle, expand=False)

        # 裁剪回原始尺寸
        x0 = y0 = padding
        x1 = x0 + img.width
        y1 = y0 + img.height
        img_cropped = img_rotated.crop((x0, y0, x1, y1))

        return img_cropped


这里RandomRotateWithPadding(degrees=(-30, 30), padding_mode="edge")还是用edge还一些,可以比较平滑的延展原图的背景,其他像reflect就是单纯镜像,不行


class RandomRotateWithOpenCVPadding:
    def __init__(self, degrees, padding_mode=cv2.BORDER_REFLECT):
        self.degrees = degrees
        self.padding_mode = padding_mode

    def __call__(self, img):
        angle = random.uniform(*self.degrees)
        # 将PIL图像转换为OpenCV图像
        img_cv = np.array(img)
        img_cv = img_cv[:, :, ::-1]  # PIL到OpenCV颜色通道转换:RGB到BGR

        # 计算需要的padding大小
        diagonal = int((img_cv.shape[0]**2 + img_cv.shape[1]**2)**0.5)
        padding = (diagonal - min(img_cv.shape[0], img_cv.shape[1])) // 2

        # 使用OpenCV的copyMakeBorder应用padding
        img_padded = cv2.copyMakeBorder(img_cv, padding, padding, padding, padding, self.padding_mode)

        # 创建旋转矩阵并应用旋转
        center = (diagonal // 2, diagonal // 2)
        M = cv2.getRotationMatrix2D(center, angle, 1.0)
        img_rotated = cv2.warpAffine(img_padded, M, (diagonal, diagonal))

        # 裁剪回原始尺寸
        x0 = y0 = padding
        x1 = x0 + img.width
        y1 = y0 + img.height
        img_cropped = img_rotated[y0:y1, x0:x1]

        # 将OpenCV图像转换回PIL图像
        img_cropped = cv2.cvtColor(img_cropped, cv2.COLOR_BGR2RGB)
        img_final = Image.fromarray(img_cropped)

        return img_final

捯饬半天干脆试试cv2咋样,这里RandomRotateWithOpenCVPadding(degrees=(-30, 30), padding_mode=cv2.BORDER_REPLICATE),好像没有edge所以最好是用cv2.BORDER_REPLICATE,这是个复制边缘像素,对于背景简单的就还可以

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker mysql更新升级版本

一、环境说明 操作系统:Centos7 数据库版本:MySql 8.0.22 数据库中数据量不大,处于开发/测试环境,风险较低 二、升级原因 升级是因为测评漏洞,在进行国家三级等级保护测评过程中,漏扫发现多个MySql漏洞…

(十五)Servlet教程——Servlet文件上传

JSP和HTML标签一起使用,来允许用户把文件上传到服务器。 首先我们需要创建一个前端界面,创建上传文件表单时,需要注意以下几点: (1) 表单的method属性必须设置为POST方法, 不能使用GET方法。 (2) 表单enctype属性应该…

【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

2.2 前言 关于Unity面试题相关的所有知识点:🐱‍🏍2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理…

19 做好微服务间依赖的治理和分布式事务

在前两讲里,分别从微服务的对外接口、消息消费以及微服务自身的相关编码规范上阐述了“防备上游、做好自己”这两个准则如何落地。 在本讲里,将会讲解为什么要“怀疑下游”,以及有哪些手段可以落地此条准则。此外,还会介绍在进行…

基于SSM的个人博客系统(三)

目录 第五章 系统实现 5.1 登录模块 5.1.1 博主登录 5.2 博客管理模块: 5.2.1 博客查询 5.2.2 博客新建 5.2.3 博客修改 5.2.4 博客删除 5.3 博客类别管理模块 前面内容请移步 基于SSM的个人博客系统(二) 个人博客系统的设计…

Qt+Ubuntu20.04:打包qt

打包程序 参考 qt项目在Linux平台上面发布成可执行程序.run_qt.run不是虚拟机的配置文件-CSDN博客 Linux下Qt程序的打包发布(1)-不使用第三方工具 - 知乎 (zhihu.com) 过程 1、Release编译 先将你的程序在release下编译通过,保证下面打包的程序是你最新的。 2…

沐风老师3DMAX一键生成桌子插件TableMaker使用方法

3DMAX一键生成桌子插件TableMaker使用教程 3DMAX一键生成桌子插件TableMaker,参数化方式快速创建各种样式桌子模型。 【适用版本】 3dMax2011-2025(不仅限于此范围) 【安装方法】 3DMAX一键生成桌子插件无需安装,使用时直接拖动…

GCB | 陆地生态系统C:N:P化学计量对降水变化的响应

西北农林科技大学水保学院上官周平研究员团队在陆地生态系统C:N:P化学计量对降水变化的响应方面取得新进展,并以“C:N:P stoichiometry of plants, soils, and microorganisms: Response to altered precipitation”为题发表在国际生态环境领域著名期刊Global Chang…

SpringBoot之自定义注解参数校验

SpringBoot之自定义注解参数校验 为什么要自定义注解 我这里先引入一个例子,就比如我现在要写文章,文章也许写完正要发布,也可以是还没写完正要存草稿,前端往后端发送数据,如果前端的state不是草稿或者已发布状态&…

C语言中的趣味代码(五)

我想以此篇结束关于C语言的博客,因为在C语言拖得越久越不能给大家带来新的创作,在此我也相信大家对C语言已经有了一个新的认知。进入正题,在这一篇中我主要编一个“英语单词练习小程序”来给大家展开介绍,从测试版逐步改良&#x…

C语言(操作符)1

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

【JavaWeb】Day62.SpringBootWeb案例——基础登录功能

登录功能 需求 在登录界面中,我们可以输入用户的用户名以及密码,然后点击 "登录" 按钮就要请求服务器,服务端判断用户输入的用户名或者密码是否正确。如果正确,则返回成功结果,前端跳转至系统首页面。 接…

Python数据分析系列(一):python入门

文章目录 前言一、Python运行方式二、Python集成开发环境(IDE)三、Python开发平台—Anaconda1、下载2、安装3、使用3.1 Anaconda应用介绍3.2 配置Python库3.3 集成开发环境使用3.3.1.Spyder3.3.2 Jupyter Notebook四、Python入门概念1、入门函数:print()与input()2、python书写…

SAP PP学习笔记08 - 作业区(工作中心Work Center),作业区Customize

上一章讲了作业手顺(工艺路线Routing)。 SAP PP学习笔记07 - 作业手顺(工艺路线Routing)-CSDN博客 这一章来讲讲作业区(工作中心 Work Center)。 1,作业区(工作中心)中…

挑战一周完成Vue3项目Day3: 品牌管理+平台属性管理+SPU管理+SKU管理

一、真实接口替换mock接口 (1)替换各个环境下的服务器地址( .env.development、.env.production、.env.test ) VITE_SERVE"http://sph-api.atguigu.cn" (2) 配饰代理跨域:vite.con…

如何测试响应式网站

我们每天通过多种设备访问互联网。移动电话,台式机/笔记本电脑,平板电脑,平板电脑…我们所掌握的设备数量已经增长为天文数字。作为消费者,体验很棒。我们可以随时随地在任何设备上自由访问互联网。但对于Web开发人员,…

磁盘格式化文件恢复:一文看懂数据恢复操作

当你意识到关键的硬盘已经被格式化,而且你不能获取里面的内容时,这会是非常令人沮丧的。这种情况可能是因为硬盘被不小心格式化,或者是你在试图修正一些问题、调整文件系统或者释放存储空间时,有意进行的格式化。无论具体情况是什…

Go 语言变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。 变量可以通过变量名访问。 Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。 声明变量的一般形式是使用 var 关键字: var identifier type 可以一次声…

线程基础知识

进程是资源分配的最小单位,线程是程序执行的最小单位… 为什么使用线程 多线程之间会共享同一块地址空间和所有可用数据的能力,这是进程所不具备的线程要比进程更轻量级 ,由于线程更轻,所以它比进程(fork创建进程以执行新的任务…

Postgresql 从小白到高手 十一 :数据迁移ETL方案

文章目录 Postgresql 数据迁移ETL方案1、Pg 同类型数据库2 、Pg 和 不同数据库 Postgresql 数据迁移ETL方案 1、Pg 同类型数据库 备份 : pg_dump -U username -d dbname -f backup.sql插入数据: psql -U username -d dbname -f backup.sqlpg_restore -U username…
最新文章