- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
简而言之:我无法从 JPEG 照片的 RGB 值中提取有意义的光强度,而尝试考虑 Gamma 校正或 sRGB 只会让事情变得更糟。
我正在做一个玩具项目,其中涉及处理一堆用间隔计拍摄的照片图像。基本上,我想用它们做一个延时,并进行一些修正,使剪辑更整洁。我使用佳能数码单反相机。
我需要一个函数,给定一个 JPEG 文件,计算出“平均场景亮度”。结果应该是一个简单的数字;不需要用任何绝对光度单位来表示,我只是做相对比较。因此,例如,您拍摄某个房间的照片,然后该函数返回“5.0”。然后你在照明中添加第二个灯泡,与第一个灯泡的类型完全相同,放在它旁边,然后再次拍摄。该函数现在应该为您提供“10.0”。
因此,我目前对该功能的实现结合了几个方面:ISO 速度、快门速度、光圈(从 EXIF 中提取)和平均图像亮度。 Exif 的东西显然更重要,因为在自动模式下,相机会尝试使用这样那样的设置,因此图像亮度会出现在中灰点附近。然而,ISO/快门/光圈设置的分辨率都是 1/3 级或更小,因此检测图像亮度对于“微调”很重要。
在我这样做的过程中,我得到了一些明显虚假的结果,而且我越深入挖掘,就越感到困惑。所以最后我设置了一个“几乎严肃”的实验:
测试设置:房间内简单的一面墙,用白炽灯点亮,照度相当均匀。使用两台相机比较结果:5D 50mm prime,350D 35mm prime。与墙壁的距离:约 3 米。所有照片均以 1/10 秒的快门速度拍摄。相机设置:手动、“忠实模式”(无增强、无饱和度或对比度凸起)、Tungsten WB、无自定义功能、JPEG-Fine、sRGB 色彩空间。镜头没有滤镜。照明没有改变,我只改变了 ISO 和光圈设置。这是我得到的结果:
Avg Spd ISO Aperture
1. 0.3507, 0.10, 100, f/2.8
2. 0.5382, 0.10, 200, f/2.8
3. 0.3557, 0.10, 200, f/4.0
4. 0.2709, 0.10, 200, f/5.0
5. 0.2118, 0.10, 200, f/5.6
6. 0.1718, 0.10, 200, f/6.3
7. 0.1459, 0.10, 200, f/7.1
8. 0.1112, 0.10, 200, f/8.0
9. 0.0883, 0.10, 200, f/9.0
第一列是平均像素值(直接来自 JPEG),对整个图像进行平均,转换为灰度为 (R+G+B)/3。通过将 [0..255] 范围除以 255,颜色在 [0..1] 范围内归一化。所以,在 1) 和 2) 之间,我只改变了 ISO 设置,图像应该变得两倍明亮,但平均像素值只上升了 53%(没有任何过度曝光的区域)。
2..3:光圈缩小一档,所以图像应该变亮一半,所以 1) 和 3) 一致(额外的亮度可能是由于减少了暗角)
3..5:同样,向下一档,5) 应该是 3) 的一半
5..8:相同,应该是一半(不过这基本上没问题)。
这一切都非常非常奇怪。顺便说一句,两台相机的结果是一致的,表明这不仅仅是特定型号的特殊性。
这没有应用任何 Gamma 校正。 JPEG 读取代码是用 C++ 编写的,基本上遵循 IJG 示例代码(djpeg
实用程序)。现在,JPEG 保存 Gamma 校正值,因此像素值应被视为 sRGB 色彩空间中的值(获取源像素,转换为 [0..1],并应用 sRGB->linear RGB transform 。让我们试试看:
Avg Spd ISO Aperture
1. 0.1140, 0.10, 100, f/2.8
2. 0.2746, 0.10, 200, f/2.8
3. 0.1175, 0.10, 200, f/4.0
4. 0.0682, 0.10, 200, f/5.0
5. 0.0424, 0.10, 200, f/5.6
6. 0.0287, 0.10, 200, f/6.3
7. 0.0213, 0.10, 200, f/7.1
8. 0.0133, 0.10, 200, f/8.0
9. 0.0092, 0.10, 200, f/9.0
我还尝试了“普通” Gamma 校正( Gamma = 2.2),结果与 sRGB 校正情况非常相似。
所以我非常非常不解。有人可以解释相机 JPEG 的 RGB 强度应该如何真正解释为,因为我没有想法:)
最佳答案
于是,随着我继续阅读,谜底慢慢揭开。
虽然相机的传感器在理论上能够测量线性光强度,但它显然不会这样做,而是模仿胶片的行为,胶片具有众所周知的非线性响应(例如,参见 this,图3).因此,dSLR 的响应曲线远不是线性的,而是更像这样:
因此,如果没有精确校准,从像素值中获取绝对场景亮度是不切实际的。
但是,我只想对照片进行亮度调整,而大致正确的亮度估计对我来说是个窍门,所以我继续重构我的相机 (Canon 350D) 的传递函数:
白色数据点对应于不同光圈值(f/22、f/20、f/18、f/16 等,以 1/3 级为增量)的不同曝光。与上图一样,X 轴是入射亮度的对数,而 Y 轴是像素值的线性( Gamma 校正后)。假设图形在单位正方形内,我还通过五阶多项式计算了一条近似拟合曲线:
(((((- 6.76219 * x) + 12.0459) * x - 5.8683) * x + 1.72338) * x - 0.148753) * x + 0.0105364;
对于 [0.05, 1] 中的 x
因此,如果您获得原始(“真实”)亮度,则获取像素值将如下所示:
将此转换称为 T,我的应用程序中的整个工作流现在是这样工作的:
关于c++ - 从 JPEG 图像中提取亮度的正确方法是什么( Gamma 校正等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8938861/
我正在做一个业余爱好项目,使用 Ruby、PHP 或 Java 来抓取 ASP.net 网站的内容。例如,如果网站 url“www.myaspnet.com/home.aspx”。我想从 home.a
如果我有这些字符串: mystrings <- c("X2/D2/F4", "X10/D9/F4", "X3/D22/F4",
我有以下数据集 > head(names$SAMPLE_ID) [1] "Bacteria|Proteobacteria|Gammaproteobacteria|Pseudomonadales|Mor
设置: 3个域类A,B和C。A和B在插件中。 C在依赖于此插件的应用程序中。 class A{ B b static mapping = { b fetch: 'joi
我不知道如何提取 XML 文件中的开始标记元素名称。我很接近〜意味着没有错误,我正在获取标签名称,但我正在获取标签名称加上信息。我得到的是: {http://www.publishing.org}au
我有一个字符串 x <- "Name of the Student? Michael Sneider" 我想从中提取“Michael Sneider”。 我用过: str_extract_all(x,
我有一个如下所示的文本文件: [* content I want *] [ more content ] 我想读取该文件并能够提取我想要的内容。我能做的最好的事情如下,但它会返回 [更多内容] 请注意
假设我有一个项目集合 $collection = array( 'item1' => array( 'post' => $post, 'ca
我正在寻找一种过滤文本文件的方法。我有许多文件夹名称,其中包含许多文本文件,文本文件有几个没有人员,每个人员有 10 个群集/组(我在这里只显示了 3 个)。但是每个组/簇可能包含几个原语(我在这里展
我已经编写了一个从某个网页中提取网址的代码,我面临的问题是它不会以网页上相同的方式提取网址,我的意思是如果该网址位于某些网页中法语,它不会按原样提取它。我该如何解决这个问题? import reque
如何在 C# 中提取 ZipFile?(ZipFile 是包含文件和目录) 最佳答案 为此使用工具。类似于 SharpZip .据我所知 - .NET 不支持开箱即用的 ZIP 文件。 来自 here
我有一个表达: [training_width]:lofmimics 我要提取[]之间的内容,在上面的例子中我要 training_width 我试过以下方法: QRegularExpression
我正在尝试创建一个 Bash 脚本,该脚本将从命令行给出的最后一个参数提取到一个变量中以供其他地方使用。这是我正在处理的脚本: #!/bin/bash # compact - archive and
我正在寻找一个 JavaScript 函数/正则表达式来从 URI 中提取 *.com...(在客户端完成) 它应该适用于以下情况: siphone.com = siphone.com qwr.sip
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
编辑:添加了实际的 JSON 对象和代码以供审查 我有这种格式的 JSON(只是这种层次结构,假设 JSON 正常工作) {u'kind': u'calendar#events', u'default
我已经编写了代码来使用 BeautifulSoup 提取一本书的 url 和标题来自页面。 但它并没有在 > 之间提取惊人的 super 科学故事 1930 年 4 月这本书的名字。和 标签。 如何提
使用 Java,我想提取美元符号 $ 之间的单词。 例如: String = " this is first attribute $color$. this is the second attribu
您好,我正在尝试找到一种方法来确定字符串中的常量,然后提取该常量左侧的一定数量的字符。 例如-我有一个 .txt 文件,在那个文件的某处有数字 00nnn 数字的例子是 00234 00765 ...
php读取zip文件(删除文件,提取文件,增加文件)实例 从zip压缩文件中提取文件 复制代码 代码如下: <?php /* php 从zip压缩文件
我是一名优秀的程序员,十分优秀!