image - 图像中的颜色值有多稳定/一致?
问题描述
假设我用多个不同的库解析一个图像文件,并向库询问像素 (20, 30) 处的 RGB 值。
在什么条件下,我可以期望在库和库版本之间获得一致的结果?
直观地说,我会假设使用更简单的格式,如 PPM 或(有一些限制)BMP,我可能会期望得到一致的结果,而使用 JPEG,即使在相对简单的情况下,我也会得到所有地方的结果,而无法避免这种情况。
这让我想到了 PNG:如果我采用输入图像,将其转换为具有定义颜色深度的 PNG(例如,每通道 8 位 RGBA,所有透明度值设置为完全不透明)并且没有颜色配置文件,应该我可以期待:
所有通用库都以相同的方式解释生成的 PNG(在读取文件时产生相同的 RGB(A) 值数组)?
所有通用库都能够将所述RGB(A)值数组转换回所有通用库将以相同方式解释的PNG吗?
(显然,由于元数据、数据包的顺序等,文件字节本身可能会有所不同。我在这里只讨论像素值。此外,如果原始输入有颜色,显然初始转换步骤可能会改变图像简介等)
例如,如果您获得此示例文件:
wget https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/Sun_getting_through_fog_in_the_New_Zealand_bush%2C_Bryant_Range.jpg/500px-Sun_getting_through_fog_in_the_New_Zealand_bush%2C_Bryant_Range.jpg
然后用 Python 解码:
import PIL.Image
img = PIL.Image.open('500px-Sun_getting_through_fog_in_the_New_Zealand_bush,_Bryant_Range.jpg')
print(img.getpixel((100,100))) # prints (73, 50, 60)
你会得到与 Golang 不同的结果:
package main
import (
"fmt"
"image"
"log"
"os"
"image/color"
_ "image/jpeg"
_ "image/png"
)
func main() {
reader, err := os.Open("500px-Sun_getting_through_fog_in_the_New_Zealand_bush,_Bryant_Range.jpg")
if err != nil {
log.Fatal(err)
}
m, _, err := image.Decode(reader)
if err != nil {
log.Fatal(err)
}
c := m.At(100, 100).(color.YCbCr)
fmt.Printf("%+v\n", c)
r, g, b := color.YCbCrToRGB(c.Y, c.Cb, c.Cr)
fmt.Printf("%v %v %v\n", r, g, b) // prints 72 50 59
}
如果您在配置文件对话框中选择“保留”,GIMP 将像素 (100, 100) 解码为 (73, 50, 60),即与 PIL 相同。
解决方案
推荐阅读
- windows - 在for循环批处理脚本(windows,批处理脚本)中的路径中的findstr命令变量扩展
- pandas - Pandas 列级别每行时间戳之间的差异
- python - Snakemake - 尝试使用 global_wildcards 时出现问题(TypeError:预期的 str,得到列表)
- sapui5 - SAP Cloud Platform Deployment - neo-app.json 中的无效内容 (?)
- regex - 角度6中的嵌套验证?
- azure - Azure Cosmos DB SQL Like,准备好的语句
- excel - 出现错误 1004 时如何添加消息框
- flutter - 在列表视图中添加滚动控制器时,CustomScrollView 的浮动和捕捉行为不起作用
- java - *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed 的含义/原因是什么?
- python - 如何获取用户输入以引用与输入同名的字典名称?