当我发现Mathematica提供True
以下代码时,我感到很惊讶(在 32 位 Windows XP 和Mathematica 8.0.1上):
Rasterize[Graphics[{RGBColor[0, 0, 0], Disk[]}]] ===
Rasterize[Graphics[{RGBColor[0, 0, 1/257], Disk[]}]]
Mathematica 渲染和导出为不同颜色的 RGB 颜色值的最小差异是多少?它依赖于机器吗?
当我发现Mathematica提供True
以下代码时,我感到很惊讶(在 32 位 Windows XP 和Mathematica 8.0.1上):
Rasterize[Graphics[{RGBColor[0, 0, 0], Disk[]}]] ===
Rasterize[Graphics[{RGBColor[0, 0, 1/257], Disk[]}]]
Mathematica 渲染和导出为不同颜色的 RGB 颜色值的最小差异是多少?它依赖于机器吗?
我相信这种行为取决于机器,但我不知道它究竟是如何依赖于操作系统的。在我的机器上,它True
仅在分母为511
.
n = 257;
While[(Rasterize[Graphics[{RGBColor[0, 0, 0], Disk[]}]] ===
Rasterize[Graphics[{RGBColor[0, 0, 1/n], Disk[]}]]) != True,
n++];
Print@n
Out[1]=511
两个图像之间存在差异n<511
p1 = ImageData@Rasterize[Graphics[{RGBColor[0, 0, 0], Disk[]}]];
p2 = ImageData@Rasterize[Graphics[{RGBColor[0, 0, 1/257], Disk[]}]];
ArrayPlot[p1 - p2]
这种差异自始至终都是恒定的,n=510
并且等于1/255
。
Max[p2 - p1] === N[1/255]
Out[1]=True
看起来像Rasterize
将每个像素的 RGB 通道四舍五入到最接近的 8 位值(最接近的1/256
)。
image = Image[{{{0, 0, .2/256}, {0, 0, .7/256}, {0, 0, 1.2/256}, {0,
0, 1.7/256}}}, ImageSize -> 4]
ImageData@image
Rasterize@image
ImageData@Rasterize@image
因此,光栅化成不同颜色的最小差异应该在 0.000000000000000000000000000 左右...
这里的有罪派对是光栅化,它会降低颜色精度。获取帮助ImageType[]
以查看 Mathematica 确实可以识别其他位深度,但 Rasterize[] 会破坏 Byte 之外的任何内容。