图像处理方向信息

前言

Exif 规范 定义了方向标签,用于指示相机相对于所捕获场景的方向。相机可以使用该标签通过方向传感器自动指示方向,也可以让用户通过菜单开关手动指示方向,而无需实际转换图像数据本身。

在图像处理过程中,若是原图文件包含了方向 Orientation 信息,会导致输出的图片在方向上有些许偏差。一般我们需要在处理图像之前将方向信息去掉,并将图像处理成正确的展示形式。

Orientation说明

拍摄图像时相机相对于场景的方向。“第 0 行”和“第 0 列”与视觉位置的关系如下所示。

第 0 行第 0 列描述
1顶部左边0度:正确方向,无需调整
2顶部右边水平翻转
3底部右边180度旋转
4底部左边水平翻转+180度旋转 (垂直翻转)
5左边顶部水平翻转+顺时针270度
6右边顶部顺时针270度
7右边底部水平翻转+顺时针90度
8左边底部顺时针90度

图例说明:
在这里插入图片描述

如何查看

系统自带的 preview 的显示检查器可直接查看:

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

通过命令行工具

Mac可以安装 brew install exiftool 后使用 exiftool 工具进行查看:
在这里插入图片描述

处理方式

既然知道了方向定义的含义,就按照相反的方式就行处理即可。

自己通过 Pillow 库实现了一个简单的方法:

from PIL import Imagedef reset_image_rotate(im: Image) -> Image:# 0x0112 EXIF tags: Orientation ,see PIL.ExifTags.TAGSorientation_code = im.getexif().get_ifd(0x0112)if orientation_code == 2:im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)elif orientation_code == 3:im = im.transpose(Image.Transpose.ROTATE_180)elif orientation_code == 4:im = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)elif orientation_code == 5:im = im.transpose(Image.Transpose.TRANSPOSE)  # 矩阵转置elif orientation_code == 6:im = im.transpose(Image.Transpose.ROTATE_270)  # 逆时针270度elif orientation_code == 7:im = im.transpose(Image.Transpose.TRANSVERSE)elif orientation_code == 8:im = im.transpose(Image.Transpose.ROTATE_90)  # 逆时针90度return im

注意:后来查看Pillow官方文档时发现,库中已提供了现成的方法。

from PIL import ImageOpsimg = ImageOps.exif_transpose(img)

源码如下:

def exif_transpose(image):"""If an image has an EXIF Orientation tag, return a new image that istransposed accordingly. Otherwise, return a copy of the image.:param image: The image to transpose.:return: An image."""exif = image.getexif()orientation = exif.get(0x0112)method = {2: Image.FLIP_LEFT_RIGHT,3: Image.ROTATE_180,4: Image.FLIP_TOP_BOTTOM,5: Image.TRANSPOSE,6: Image.ROTATE_270,7: Image.TRANSVERSE,8: Image.ROTATE_90,}.get(orientation)if method is not None:transposed_image = image.transpose(method)transposed_exif = transposed_image.getexif()if 0x0112 in transposed_exif:del transposed_exif[0x0112]if "exif" in transposed_image.info:transposed_image.info["exif"] = transposed_exif.tobytes()elif "Raw profile type exif" in transposed_image.info:transposed_image.info["Raw profile type exif"] = transposed_exif.tobytes().hex()elif "XML:com.adobe.xmp" in transposed_image.info:transposed_image.info["XML:com.adobe.xmp"] = re.sub(r'tiff:Orientation="([0-9])"',"",transposed_image.info["XML:com.adobe.xmp"],)return transposed_imagereturn image.copy()

参考

  • Exif Orientation Tag (Feb 17 2002)
  • PIL.ImageOps.exif_transpose

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

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

相关文章

Layui弹框中设置输入框自动获取焦点无效/Layui设置Input框自动获取焦点无效,怎么办?

1、问题概述? 有时候为了用户体验,期望当弹框打开的时候,指定的输入框能自动的获取焦点,用户就可以直接输入了。提升了用户体验。但有时候设置的时候没有效果。 2、正常的设置自动获取焦点方式 【input框设置方式】 使用关键字autofocus <input type="text&quo…

Zemax中FFT PSF和惠更斯PSF的区别?

在Zemax“分析”选项卡中&#xff0c;有PSF&#xff08;“点扩散函数”&#xff09;图&#xff0c;主要包括如下两种计算方式&#xff1a; 1. FFT PSF&#xff0c;快速傅里叶变换&#xff08;fast fourier transform&#xff0c;FFT&#xff09; 该方法可以看做是以下点扩散函…

ffmpeg将一个视频中的音频合并到另一个视频

ffmpeg -i input1.mp4 -i input2.mp4 -map 1:v -map 0:a -c:v copy -c:a aac -strict experimental output.mp4解释如下&#xff1a; -i input1.mp4&#xff1a;指定第一个输入文件input1.mp4&#xff0c;这是你要提取音频的文件。-i input2.mp4&#xff1a;指定第二个输入文件…

概率论中,积分和再求导的计算方法

为了求解级数 1 2 2 q 3 2 q 2 … 1 2^2q 3^2q^2 \ldots 122q32q2… 的和&#xff0c;可以使用积分再求导的方法。我们考虑如下步骤&#xff1a; 1. 定义函数并进行积分 我们先定义一个函数 S ( q ) S(q) S(q)&#xff1a; S ( q ) ∑ n 1 ∞ n 2 q n − 1 S(q) \…

心链14-----项目功能完善补坑+自动跳转登录页 + 重复加入队伍问题(分布式锁) 并发请求问题解决 + 项目部署上线

心链 — 伙伴匹配系统 一、todo 1、强制登录&#xff0c;自动跳转到登录页 解决&#xff1a;axios 全局配置响应拦截、并且添加重定向 1.在myAxios里配置响应拦截 这里我们要改变history 模式的实现&#xff0c;在main.ts里修改 当登录成功后&#xff0c;重定向到个人用户页…

Cyber Weekly #10

赛博新闻 1、最强开源大模型面世&#xff1a;阿里发布Qwen2 6月7日凌晨&#xff0c;阿里巴巴通义千问团队发布了Qwen2系列开源模型。该系列模型包括5个尺寸的预训练和指令微调模型&#xff1a;Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。据Qwen官方博客…

Vitis HLS 学习笔记--循环边界包含变量

目录 1. 简介 2. 分析与详解 2.1 未优化 2.2 LOOP_TRIPCOUNT 优化指令 2.3 重写变量循环边界 3. 总结 1. 简介 在硬件设计中&#xff0c;循环的迭代次数通常需要是固定的&#xff0c;因为这有助于资源的预分配和时序分析。 循环边界包含变量意味着循环的迭代次数不是固…

Java进阶_抽象类与方法

抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 抽象类除了不能实例化对象之…

ESP32-C3模组上跑通NVS(6)

接前一篇文章:ESP32-C3模组上跑通NVS(5) 本文内容参考: 非易失性存储库 - ESP32 - — ESP-IDF 编程指南 latest 文档 ESP

【MySQL】探索 MySQL 中的 WITH 关键字:使用公共表表达式(CTE)简化查询

我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 &#x1f3b5; 牛奶咖啡《从你的全世界路过》 探索 MySQL 中的 WITH 关键字&#xff1a;使用公共表表达式&#xff08;CTE&#xff09;简化…

按键精灵安装有乱码并且不能启动的解决办法

在国外购了电脑&#xff0c;系统是英文版 Windows 11&#xff0c;按键精灵死活都装不上去&#xff0c;打开exe的安装文件后出现乱码&#xff0c;安装完了后还是乱码&#xff0c;并且启动不了&#xff0c;以下是解决办法&#xff1a; 进入控制面板&#xff0c;并且点 Region&am…

MATLAB算法实战应用案例精讲-【数模应用】逐步回归分析(附MATLAB、R语言和python代码实现)

目录 前言 几个高频面试题目 逐步回归分析和多元线性回归的区别 知识储备 多元线性回归 模型选择 (Model Selection) 算法原理 什么是逐步回归分析 实现策略 向前选择 向后剔除 逐步回归 特征选择与逐步回归分析 2.1特征工程 2.2原始特征的问题 2.3降维与特征选…

汇编:结构体

在32位汇编中&#xff0c;结构体&#xff08;structures&#xff09;用于组织和管理复杂的数据类型&#xff0c;结构体可以包含多个不同类型的数据项&#xff08;成员&#xff09;&#xff1b;在MASM&#xff08;Microsoft Macro Assembler&#xff09;中&#xff0c;使用结构体…

CentOS安装Node.js以及JSDOM跳坑记

笔者在一台 CentOS 7.9 的服务器上使用常规的安装命令&#xff1a;sudo yum install node 来安装 Node.js&#xff0c;到最后系统提示&#xff1a; Error: Package: 2:nodejs-20.14.0-1nodesource.x86_64 (nodesource-nodejs) Requires: libstdc.so.6(GLIBCXX_3.4.20)(64bit) …

vite获取所有环境变量(env)

0.环境变量文件 API_URL8888888 VITE_API_URL99999991.定义环境变量 默认情况下&#xff0c;vite只获取以VITE_为前缀的环境变量。 为了防止意外地将一些环境变量泄漏到客户端&#xff0c;只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码 但如果你觉得你是进击的巨人…

VUE + nodejs实战

BVDN搭建 D: cd nodejs ::npm install bootstrap ::npm install jquery ::npm install popper.js ::npm install vue npm install vue-router pauseapp.html <!DOCTYPE html> <!DOCTYPE html> <html> <head><!--bootstrap--><link rel"…

vue面试题一

一、请解释Vue.js是什么&#xff1f; Vue.js 是一个构建用户界面的渐进式框架。它的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;也便于与第三方库或已有项目整合。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 以下是 Vue.js 的一…

MySQL 5.7详细下载安装配置教程(MySQL 5.7安装包)_mysql5.7的安装教程

记录MySQL 5.7 的下载安装教程&#xff0c;并提供了Mysql 安装包 &#xff0c;以下是详细下载安装过程。 一、下载Mysql安装包 网盘下载&#xff1a; 下载MySQL 5.7安装包&#xff0c;网盘下载地址&#xff1a;点击此处直接下载 官网下载&#xff1a; 进入官网&#xff0c…

为什么选择Python作为AI开发语言

为什么Python适合AI 在当前的科技浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最热门的话题之一。无论是自动驾驶、智能推荐还是自然语言处理&#xff0c;AI都在不断改变我们的生活。而在这场技术革命中&#xff0c;Python作为主要的编程语言之一&#xff0c;…

python-win10跑通chattts笔记(亲测可跑)0.8.010

python-win10跑通chattts笔记-亲测可跑 背景项目地址安装过程使用技巧参考链接背景 克隆了项目中的代码,在无conda环境下使用pip安装了依赖,最后报错cl: 命令行 error D8021 :无效的数值参数“/Wno-register” error: command C:\,最后通过使用conda解决了,以此记录下 项…