并非所有的数字图像最终都只是0到255之间的像素值?


56

我对图像有一些难以置信的基本(愚蠢?)问题;特别是图像格式和像素值。

原谅我,我不是摄影师。我只是处理图像的人,对我来说,它们只是数字的行和列。

我的问题是:

如果从根本上说照片只是像素值[0,255] X RBG的3个通道,那么任何两个图像格式之间怎么可能会有差异?我的意思是,是什么使RAW与TIFF有所不同-并非所有这些值都限制在0-255之间吗?数字就是数字-难道不应该只有一种固定格式吗?还是不应该将两个具有相同高度和宽度的图像锁定为具有相同的文件大小?

此外,从数字角度来看,是什么使16位图像与32位图像不同?同样,图像只是一个整数值在0 -255之间的数组。

从这种观点继续,计算机文件系统上的图像只是一个3通道的0到255之间的整数数组,将图像压缩成有损格式(例如JPG)的意义何在?假设压缩算法将一些像素值从254更改为255或其他。所以?如何节省文件大小或对视觉质量产生影响?

我知道有很多不同的方式来存储图像数据。但是除了基本的3通道RBC图像之外,我没有其他问题。我所知道的是,如果有人递给我其中之一,那么我现在有一组数字。我没有理由知道为什么一个数字数组可能与其他从0到255的数字数组可能有所不同。我希望这是有道理的。这个问题不仅限于RAW格式!而是关于像素值的任何数组


32
我开始怀疑这种误解是否源于更高层次的工作。您正在使用matlab或其他工具读取文件吗?相信我,如果您在原始文件级别打开并阅读TIFF,PNG或JPG文件,那么在最终获得一个漂亮干净的RGB矩阵之前,您将不得不做很多事情。

2
如果OP可以提供更多上下文,这将有所帮助。例如,这与图像处理代码有关吗?
雷姆科

1
关于编辑:如果给定一个数字数组,则使用该数组。另一个数组在哪里?如果您有2个要比较的数组,那么情况就不同了。这些值可能包含足够接近的值,看起来与人眼相似。给定一个数组,经过有损编码后,解码该数组将永远不会给您原始数组,而是足够接近的数组
phuclv

3
提防那些要导入TIFF,FITS和其他未压缩图像的软件包。许多这样的软件包,包括基本的MATLAB和python工具,无论源大小如何,都会自动将数据修剪为8位。如果要避免这种情况,则必须找到专门的功能/库或使用自己的工具。
卡尔·威索夫特

2
@Monica Heddneck:已经有很多不错的答案,使您直接认识到不,图像不是简单的RGB255值的像素数组,但是我根本不明白为什么您不理解其原理。用于压缩格式。它们在那里可以将数据保存在存储中或传输中。即使所有图片都是RGB255三胞胎,压缩也将是有益的。
加博尔

Answers:


72

抱歉,但是您的基本前提是错误的:可以将图像编码为每个值8位的RBG像素数组,但是还有许多其他方法:

  • 一通道一比特/通道(纯黑白),
  • 一个具有x位/通道的通道(灰度格式,x通常为8或16,给出256或65536的值),
  • 各种基于调色板的格式(参见GIF)
  • 全彩色(至少在理论上),以及所需的任意深度,可以根据需要设置任意数量的通道。

这是针对在编辑/查看期间存储在计算机RAM中的图像。我忽略了存在的各种RAW图像格式(此处和本文的其余部分)。

对于摄影,最常见的是3个通道,每个通道具有8位,16位或32位(通常是整数,但是至少某些程序在内部使用32位浮点数工作)。通常会有第四个通道(alpha),尤其是在程序允许使用图层的情况下。在某个地方,需要存储图像阵列的尺寸。

这些不同的格式有多种原因。对于内存格式,一个重要的考虑因素是数据的大小和速度(操作一个8位通道要比4个32位通道快得多)。如今,这些功能已变得不那么重要了,但是我们对各种色彩空间进行了全面的色彩管理。其中一些(例如prophoto RGB)需要每通道至少16位,以将相邻颜色之间的差异保持足够小以避免可见的条纹。而且,随着处理变得越来越复杂,使用32位浮点数(将颜色编码为0.0到1.0之间的值,并且允许在此范围之外的中间值)具有优势。

如果您希望能够将图像存储到文件中并将其重新加载到相同的内存数据中,则每个通道至少需要使用与内存格式一样多的位,并且必须存储有关图像尺寸,位深和色彩空间。

这些图像的用户还喜欢存储一些有关图像的附加信息(标题,标题,拍摄者等)。再次有各种方式来存储此信息。

然后,有多种压缩图像数据以进行文件存储的方法。一种简单的方法是RLE(游程长度编码),当您遇到重复的像素值时,您可以在其中存储计数和像素值。其他的,例如jpeg,要复杂得多,但也要压缩得多。例如,jpeg使用余弦变换,并丢弃(较不可见的)高频信息,从而以信息丢失为代价提供了高压缩率(虽然压缩率更高,但这已经太长了)。

这已经提供了许多将信息存储在磁盘上的方法,但是无论选择哪种方式,都必须正确指定格式以允许在加载映像时进行正确的解释。

然后,例如无损压缩技术有了不断的发展,现有的格式不能总是处理。

因此,我们最终得到了各种各样的文件格式,在存储的信息的保真度,磁盘空间占用以及读取,写入和传输的速度之间进行了各种折衷(比较未压缩的TIFF的大小和质量不错的jpg) 。


看到编辑好的问题后,还有一些其他方面:

如果您处理了一个内存中映像,它将采用一个或多个数组的形式。届时,原始文件格式将不再起作用。我假设您以8位/通道处理数据。

但是您将必须知道您是否具有已处理的图像或原始图像,因为它们之间有两个重要区别:

  • 原始图像通常每个像素具有1种颜色,并且像素通常以每4个像素的正方形分别具有2个绿色,1个红色和1个蓝色像素的拜耳阵列排列。这些值与场景强度成正比(非常低和非常高的值除外)。
  • 可以将处理后的图像布置为包含3个数值的2D记录阵列,也可以布置为彩色平面(3个2D阵列,每个用于R,G,B)。此外,该值通常与场景强度成正比。更糟糕的是,像素值和场景强度之间的确切关系取决于图像所进行的处理。并且已经调整了颜色之间的平衡以对应于人眼的响应(白平衡,红色和蓝色相对于绿色被放大)。

因此,如果您获得的原始图像每个像素具有3个颜色值,则该原始图像已经进行了某种处理(至少是demosaicing或将4个原始像素简单合并为1个图像像素)。是否可接受,将取决于您的应用程序。


我对表示图像的各种方式不那么感兴趣,但是,相反,如果给了我两个数字的3通道矩阵,那么为什么其中一个与另一个有所不同?如果TIFF和RAW都是3维数组,它们之间有什么区别?
莫妮卡·赫德内克

4
也许有意思,当您说16位图像每通道16位时,我感到困惑。在计算机图形世界中,对于所有3个通道(通常为5个红色,6个,绿色,5个蓝色)的总和,16位图像是16位。我只是想在评论中指出这一点,以便看到16位颜色的人知道该术语有两种含义,这取决于使用它的人。
Cort Ammon '18

“操纵一个8位通道比4个32位通道快得多”。您不是说“操纵一个32位通道比4个8位通道快得多”吗?
l0b0

1
@MonicaHeddneck如果其中一个矩阵包含RGB数据,而另一个矩阵包含(例如)HSV数据,则可以肯定的是,两个数组的尺寸和位深度都相同,并且在渲染到显示设备时,它们看起来将是相同的(+),但存储在两个数组中的数据肯定是不同的。(+)实际上,它们看起来并不完全相同,因为888RGB和888HSV各自的色域都具有2 ^ 24个“点”,因此在两个点集之间没有一对一的映射。但是,在实践中,用肉眼很难看到差异。
dgnuff

实际上,hdr 32浮动位颜色的点不是0到1,而是0到任何东西(如果您真的要这样做的话),然后使用整数代替。像真实的光线一样,确实没有上限。但是您只会看到其中的一部分。这有很多原因,但很有用,但是如果您以3d反射为例进行起诉,那么仍然可以捕获到真正的能量,这对于诸如天空和20%的选择性之类的事情非常重要
joojaa

48

如果以照片为核心,则照片仅是像素值[0,255] X RBG的3个通道,

但是照片甚至不是 “核心”,也不是 “仅仅3个像素值通道”。计算机屏幕通常由RGB像素阵列组成,因此,如果要在计算机屏幕上显示图像,则必须在某个时候将任何图像数据映射到RGB像素阵列中,但是数据仅图像数据的特定渲染。图像中的数据可能根本不包含像素值流。为了从图像中获取像素值,您必须知道如何格式化数据。

那么任何两个图像格式之间怎么可能会有差异呢?我的意思是,是什么使RAW与TIFF有所不同-并非所有这些值都限制在0-255之间吗?

这是两个很好的例子,因为这些格式中的任何一种都不一定包含RGB值的矩形数组。

RAW根本不是单一格式,它是包含直接从图像传感器记录的数据的文件的一种统称。因此,RAW文件可能包含一系列值,这些值代表从各个传感器位置读取的电压。这些站点就像图像像素,但不是 RGB像素。为了从RAW文件中获取RGB像素,您必须在有关传感器,当时的相机设置等信息的上下文中解释该数据。换句话说,您可以在十六进制编辑器中打开RAW文件。并查看所需的所有内容,但找不到单个RGB值。

TIFF代表标记的图像文件格式,这是一种非常有趣的格式,因为它可以包含图像的许多不同表示形式。单个TIFF文件可以包含多种尺寸的“相同”图像,例如缩略图,屏幕分辨率图像和打印分辨率图像,并且还可以具有彩色和灰度版本。您知道传真机通常将数据作为TIFF文件发送吗?为了从TIFF文件中获取RGB像素,您不仅需要了解TIFF格式,还需要了解该文件中特定图像表示的格式。

数字就是数字-难道不应该只有一种固定格式吗?

。由于人们各自满足不同的需求,因此存在许多不同的图像格式。JPEG的有损压缩非常适合获取非常小的图像文件,但对必须多次编辑的图像不利。某些格式使用隔行扫描,这使得以几种不同的分辨率读取图像非常快。依此类推...每种格式都有其自身的优点和折衷组合。

还是不应该将两个具有相同高度和宽度的图像锁定为具有相同的文件大小?

不,那太可怕了。如果每个图像文件的大小都必须是基本大小width * height * 3(假定为24位彩色),那么您将浪费大量存储空间。大多数照片包含很多冗余,即同一颜色重复多次的区域。为了节省存储空间,消除冗余信息通常很有意义。例如,一种运行方式是游程长度编码或RLE。例如,如果您有一个4195个全都是白色的连续像素区域,那么将其编码为“接下来的4195个像素全部为{255,255,255}”会更有效,而不是简单地在其中存储那么多白色像素。文件。RLE实际上用于某些图像格式,但是许多格式具有更复杂的方案,可以节省更多空间,这意味着您可以在硬盘驱动器或存储卡上存储更多图像。它还可以更快地将图像发送给其他人。

从这个角度继续,计算机文件系统上的图像只是一个3通道的0到255之间的整数数组,将图像压缩成有损格式(例如JPG)的意义何在?

关键是它使文件更小。JPEG压缩通常将文件的大小减少10倍或更多。这意味着您可以在给定的存储设备上容纳更多图像,可以更快地复制它们,可以更快地打开它们,还可以更快地上载和下载它们。在较小的空间中存储同一图像(或几乎存储)将更有效地使用资源,从而降低成本。大规模地考虑一下:互联网上可用信息的很大一部分可能是图像和电影,如果不进行压缩,我们将需要更多或更大的数据中心并消耗更多的能量。

假设压缩算法将一些像素值从254更改为255或其他。所以?如何节省文件大小或对视觉质量产生影响?

考虑我上面的RLE示例。假设您有一张包含大空白墙的照片,因此照片的大部分区域都是相同的颜色,只是有一些较暗的像素散布,甚至在图像中几乎不可见。这些像素降低了压缩效果。您不能只说“接下来的500,000个像素都是{243,251,227}”,而必须对长度进行编码以编码更多的小块,因为每隔一段时间您就会遇到一个稍有不同的像素之一。如果允许压缩算法进行较小的更改,也许只将任何像素更改不超过1%或2%,那么您可以得到更高的压缩率,而无需明显地更改图像。这是一个权衡:你 放弃了原始图像中的少量信息以换取文件大小的大幅减少。确切地说,您可能会画线,因此JPEG等有损格式可以让用户选择他/她想要的压缩级别。


1
为复杂主题的清晰,全面的解释而投票!我认为我从中学到了很多。我想知道是否有一种有效的方法来进行无损压缩是对长度进行编码,但实际上又需要对图像进行第二遍处理,以在以后添加任何奇数个像素异常。诸如“从23到400是黑色”,然后是“ 302是白色”之类的东西会覆盖该一个像素。而不是23-301是黑色,302是黑色,303-400是黑色。我怀疑这实际上是至少一种压缩格式的处理方式。
Ruadhan2300 '18

1
@ Ruadhan2300-确实有。参见,例如:en.wikipedia.org/wiki/Lossless_JPEG,该方法使用一种预测每个像素颜色的方法(尽管比游程长度编码要复杂一些),然后对该预测值与实际像素值之间的差异进行编码。
朱尔斯

18

除了@remco的绝妙答案之外,我还想补充一下为什么存在(大致)相同目的的不同编解码器。

编解码器旨在:

  • 无损有损
  • 快速编码减少文件大小
  • 非对称对称编码/解码
  • 与软件兼容
  • 在不同的压缩级别/情况下几乎无损
  • 具有其他编解码器不提供​​的功能,包括:
    • 免版税
    • 支持图层
    • 支持Alpha通道(例如RGBA)/透明度
    • 提供快速的网络视图
    • 支持较高的位深度
    • 支持多种色彩空间(RGB / CMYK)
    • 支持元数据/版本控制/ ...

其中一些是互斥的。因此,我们剩下了许多编解码器。


一些例子

注意:编解码器列表既不完整,也没有提及其所有功能(或缺少这些功能)。如果事实证明该答案对某人有用,那么我可能会添加更多信息(更加准确)。

也许最常用的格式是JPEG。它是一种得到广泛支持的旧格式。它使用DCT(离散余弦变换),因此虽然在其最高质量设置下提供了很好的质量,但较低的将出现阻塞。

然后JPEG 2000取代了JPEG:它基于Wavelet-Transformation,因此虽然在较高质量设置中提供与JPEG大致相同的质量,但是在较低质量设置中提供了更好的质量(块有点模糊) )。此外,JPEG 2000还提供了感兴趣的区域(图片某一区域的高质量,其他地方的质量较低)和16位支持。(此外,还有其他事情。)不幸的是,由于它比JPEG更加昂贵的计算,并且由于某些许可问题,因此JPEG 2000不像JPEG那样得到广泛的支持。

PNG是另一种广为人知的格式-无损且支持alpha通道,但不提供对非RGB颜色空间(如CMYK)的支持。因此,它是“仅在线”格式。

然后是OpenEXR这样VFX格式。它们都围绕质量和速度进行:OpenEXR是无损的,支持高达64位,并且可以快速地进行编码/解码。它主要在VFX行业中用作中间格式。

TIFF是另一种非常受摄影师欢迎的无损格式。对于压缩,它不提供/ ZIP / RLE / LZW / JPEG。它支持最高32bit。凭借其可选择的压缩,它具有很强的适应性,但是由于其无损的特性,它更像是一种离线格式。

HEIF是最新的图像编解码器之一。它使用与HEVC / h.265相同的压缩率,因此有望提供比JPEG更好的压缩率。但是,由于它是很新的并且因为它受专利保护,因此没有像上面任何一种方法得到广泛的支持。

RAW图像实际上并非真实照片:它们更多地是原始(因此得名)传感器读数数据的容器。只有使用知道如何解释数据的软件,才能获取图片。这就是为什么诸如Lightroom / Capture One / DarkTable / ...之类的RAW转换器需要更新以支持使用已经指定的容器(例如Canon的* .CR2)的新相机的原因。这也是为什么14位RAW提供比从同一RAW导出的32位TIFF更多的编辑选项的原因。


互斥:无损与有损

我仍然不确定您真正要问的是什么,因此我认为添加关于无损与有损的小解释不会有什么害处。

无损压缩通过执行行程编码(RLE) / 霍夫曼编码 / ...来压缩数据。数据本身不会更改,而是保存在较小的程序包中。例如,以RLE为例:说说,我们的R通道比特流(从像素0,0到像素0,11)为255,255,255,255,255,215,215,235,100,000,000,000-RLE会将其编码为52552215123511003000-这要小得多,并且由于我们知道它以4位数字的形式保存,并且第一个数字是计数器,最后三个数字是值,那么我们可以重构full 255,255,255,255,255,215,215,235,100,000,000,000

另一方面,有损压缩会尝试进行比无损压缩更远的压缩。为此,有损编解码器通常会尝试删除我们无法感知的内容。举个例子来说,在YUVYCbCr真的)模式的JPEG(和几乎所有的视频编解码器)用途:Y = LuminanceCb = Chrominance BlueCr = Chrominance Red。人无法分辨出4:2:0(每个像素都有亮度值,但颜色交替保存在2x2的块中)和4:4:4(每个像素都有亮度和两个颜色通道)编码图片之间的差异。这是由于眼睛生理原因:我们看不到颜色差异,也看不到亮度差异。

在大多数情况下,这种方法效果很好,但是可以将其与MP3文件进行比较:几乎没有人可以分辨出192kbps和320kbps之间的差异,但低于64kbps时,情况很快就会变丑。同样,重新编码将进一步降低质量,因为可能会出现不需要的伪像(例如,在JPEG中,来自高质量编码的小块将被视为进一步编码中图片的细节)。


底线

如果您不关心图像格式或其功能,则可以选择其中任何一种。有了足够高的质量设置,您甚至有可能甚至看不到它们之间的差异。

但是,如果您需要任何特定功能,则可能(并且几乎可以肯定:将)有一个包含该内容的编解码器。


我将在您的编解码器属性列表中添加两件事:1.渐进式渲染(如今已不多使用,但在PNG中是一个很大的功能)2.动画(有动画PNG,JPEG,GIF ...)。
Sulthan '18年

@Sulthan我想考虑一下,尽管渐进式-正如您所说-在当今并不被认为很重要,动画也不是与摄影有关的功能。无论如何:感谢您的输入!
flolilo

2
“只有知道如何解释数据的软件才能获得图片”,这适用于任何图像格式。如果软件不知道如何解释(例如)JPEG数据,则它将无法将其显示或处理为图像。原始文件存储的数据可以从中重建图像,并且以某种方式进行结构化(尽管可能特定于相机型号)。因此,这是一种图像格式,它不是一种格式,而是“相机X的原始格式”。
n0rd

1
@ n0rd当然。但是我5D Mk III的JPEG满足(看似)与Nikon P7000或EOS M6相同的规格。.CR2真的只是说:“看着我,我是佳能相机的RAW文件!如果敢,请读我!” -这应该是我的意思,尽管您用一种更加清晰的语言表示了这一点。
flolilo

LAB和XYZ空间确实存在某些图像格式。
joojaa

10

如果以照片为核心,则照片仅是3个像素值的通道[0,255] X RBG

这是一个严重破坏的假设,您的其余问题在不脱离它的情况下根本无法回答。

我的意思是,是什么使RAW与TIFF有所不同-并非所有这些值都限制在0-255之间吗?

术语“原始”可以指两种不同的事物,“相机原始”图像或包含不带标题的原始图像数据的文件。

“原始相机”图像存储从传感器出来的原始数据。大多数现代相机传感器都具有超过8位的ADC,但它们也只能在每个位置收集一种颜色成分的强度数据。镜头可能会扭曲几何形状,ADC的强度值可能无法很好地反映出人类对强度的感知,颜色分量可能无法准确映射到显示器使用的颜色,等等。

需要复杂的映射过程(包括插值)才能将原始传感器数据转换为高质量的RGB图像,而没有正确的方法。此外,由于需要内插颜色分量,因此RGB图像最终可能会比原始数据大。

可以(通常是)在相机中完成转换,但是许多摄影师愿意保存原始数据,以便他们可以在事后调整处理。

Tiff是一种复杂的文件格式,可以存储具有各种元数据的各种不同格式的图像。实际上,尽管通常将其用于存储未压缩或无损压缩的RGB或CMYK图像。

很少使用包含无标题的原始图像数据的文件,因为在读取它们之前必须先了解它们的格式和尺寸。尽管有些图像处理工具支持它们。

此外,从数字角度来看,是什么使16位图像与32位图像不同?

不幸的是,“ n位”可能意味着两种不同的含义。这可能意味着所有颜色分量都挤入了一个位数(例如,对于16位或8位红色,红色为5位,红色为5位,蓝色为6位,绿色为6位,红色为8位,绿色为8位,蓝色为8位,而8位为8位。 (代表32位元的Alpha)或,表示每个颜色分量在每个像素位置具有n位信息。

继续这种观点,即计算机文件系统上的图像只是3通道的0到255之间的整数数组

同样,这种观点是完全错误的。

文件是一个字节序列,但是这些字节几乎永远不会“只是3通道的0到255之间的整数数组”

您可以存储这样的图像。某些工具甚至支持读取和写入此类文件,但是问题在于,这意味着您必须先了解文件,然后才能读取文件。假设您有一个大小为3000字节的文件,是否有1000个24位RGB像素?3000 8位灰度像素?3000个8位像素的调色板?颜色成分按什么顺序排列?图像是什么形状?颜色分量是按RGB还是BGR顺序排列的?除非您知道这些问题的答案,否则您将无法有意义地读取此类文件。

因此,实用的图像格式通常以一个或多个标头开始,这些标头标识文件的类型,图像的尺寸以及实际图像数据的存储方式。它们可能还包含可选的元数据。

将图像压缩为有损格式(例如JPG)有什么意义?假设压缩算法将一些像素值从254更改为255或其他。所以?如何节省文件大小或对视觉质量产生影响?

压缩算法不只是“改变值”,它们以完全不同的方式对信息进行编码,例如JPEG可以大致描述为

  • 将数据从RGB转换为YUV
  • (可选)在一个或两个维度上将色度通道的分辨率降低2倍
  • 将每个通道的数据分成8x8块。
  • 使用离散余弦变换将块转换到频域
  • 量化结果,在保留低频信息的同时降低高频信息的精度。
  • 使用可变长度编码方案(霍夫曼编码或算术编码)将结果数字编码为字节序列
  • 将这些字节以及相应的标头保存在文件中。

另一方面,无损压缩格式通常建立在通用数据压缩算法的基础上,但有时会补充特定于图像的预处理,例如PNG看起来像。

  • 将数据转换为支持的格式之一(例如,红色,绿色和蓝色分别按该顺序排列)
  • 对于图像的每一行执行“过滤”过程,有服务器过滤选项(根本不包括过滤),但是总体目的是获取特定于图像的信息,即像素很可能类似于其邻居并进行编码它可以“缩小”处理。
  • 使用“压缩”通用压缩算法压缩过滤的数据。
  • 将这些字节以及相应的标头保存在文件中。

1
这可能是最好的答案,它讨论了用于保存和压缩图像的不同文件格式,以及假设图像是一堆从0到255的数字的假设是有缺陷的
pfg

非常适合提及组件顺序。我认为像opengl 2 ish这样的事情有充分的理由要具有读取RGB顺序的不同置换器的功能。老实说,没有标准或元数据,您甚至都不知道图像的原点或方向,更不用说线条有多长了。如果即使在处理完货盘后仍加载了厄运精灵,则您的颜色应从左下角开始,按列向上,然后按行
向上

我觉得组件顺序有点像字节序。一些系统供应商选择了RGB,而另一些(明显是Windows)则选择了BGR。
彼得·格林

9

这种假设不正确的原因有很多,它们全都归结为一件事:

您实际使用的比例是多少?

这可以进一步分解:

什么是255?

“颜色”不是物理宇宙的属性。这是一种在心中产生的感觉。并且,包括“蓝色”,“绿色”和“红色”之类的内容。从0表示“完全没有蓝色”到255表示“所有蓝色!”的比例。实际上不能有255代表蓝色的柏拉图式理想,因为...在现实世界中没有如此完美的东西。因此,这是否意味着:

  • 您可以在自己面前的设备上做的最蓝色的事情?
  • 从人眼视觉系统的角度来看,它几乎可以与纯蓝色完美匹配,即使大多数屏幕和打印机/墨水/纸张组合都不能代表它?
  • 可以在各种设备上合理表示的漂亮蓝色?
  • 一种超出人类视觉范围的蓝色,但是它可以让RGB三重覆盖范围内的大多数颜色?

声音人为?不!这些实际上是真实的例子。查看每种选择的这些表示形式。弯曲区域是人类视觉色彩空间的2D切片,三角形显示了可以指定红色,绿色或蓝色的特定区域表示的区域。

首先,这是我的笔记本电脑屏幕的配置文件,可以很好地代表当前的中端设备:

ThinkPad X260

现在,这是Adobe RGB空间。请注意,这比我的屏幕可以显示的要大得多!

AdobeRGB

因此,这里是sRGB-事实标准和默认空间,通常在未指定任何内容的情况下采用。在大多数情况下,它意味着“足够好”。

RGB

最后是ProPhoto RGB,它使用虚构的颜色作为基色,以使三角形大到足以适合几乎所有人类视觉。

ProPhoto RGB

现在,我们可以加入光本身的颜色和色彩适应性,即人类视觉系统调整对环境的感知的能力。实际上,不仅仅是能力:无论您是否想要发生的事情。“纯蓝色”是否表示事物在这种白炽灯下看起来尽可能地呈蓝色?如果我们改为在阳光下拍照,价值将是多少?

因此“ 255”可能意味着很多不同的东西。

什么是0?

这很简单-您需要0的黑度是多少?它黑色的吗?如果是,但是场景中的所有实际阴影都不那么极端,您是否真的要“浪费”场景中不存在的动态范围的一堆潜在值-并且该颜色可以像颜色一样甚至不会由您有权使用的任何设备或打印机代表?

你的曲线是什么?

因此,一旦有了端点,如何从一个端点过渡到另一个端点?人类对亮度的感知绝对非线性的。在您的0-255范围内,100应该是50的两倍,还是应该更大一些?例如3和4之间的感知差异是否应该与203和204之间的感知差异相同?

如果您决定使用日志存储系统,是否应该优化该曲线以匹配人类的视觉,还是为了数据优化,还是其他?

有很多可能性,可以满足许多不同的需求。

压缩时

你问。

假设压缩算法将一些像素值从254更改为255或其他。所以?如何节省文件大小或对视觉质量产生影响?

现代压缩算法要比这复杂得多,但这提供了一个很好的例子。我将使用十六进制FF表示255和FE254,并想象我们将游程长度编码用作压缩形式。为了简单起见,我们假设黑色而不是颜色。这样,如果我们有一排数据如下所示:

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 

我们可以将其压缩为一个非常简单的

16×FF 

...这是非常明显的节省。我们基本上可以将两个字节存储16个字节(一个用于计数,两个用于数据)。但是可以说我们有:

FF FF FE FF FE FF FF FF FF FF FE FE FE FF FE FE

现在,行程编码给我们:

2×FF 1×FE 1×FF 1×FE 5×FF 3×FE 1×FF 2×FE

...这根本没有节省,实际上可能增加了文件大小。但是,如果我们将所有FE值都舍入为FF,我们将回到第一种情况,即大小显着减小,虽然对文件质量的影响很小但可能很难注意到。

当然,这是一个简单的,人为的例子,但所有的有损压缩算法可以共享这一基本特点:数据的丢失使得它更容易使用更紧凑的存储格式,有希望,没有太多感知的变化。

在位深度

此外,从数字角度来看,是什么使16位图像与32位图像不同?同样,图像只是一个整数值在0-255之间的数组。

因此,一个介于0到255之间的整数值的数组是一个八位数组。(2⁸=256。)具有三个通道,这是一个24位图像。有些格式还具有32位的透明(“ alpha”)通道。每个通道也可以使用更高的值,这通常是我们所说的“ 16位深度”。这意味着数组从0-65535(2 11 = 65536)而不是0-255。通常,在这种方案中,这基本上只是一个乘法器,其中最高值在每个标度上表示相同的事物,但是较高的位深度会带来更多可能的细微差别。(有关更多信息,请参见此答案。)还有一些特殊的文件格式,使用64位浮点(!)代替整数作为值,或者根据使用情况使用其他数据类型,但是基本概念相同。


s / 0-65536 / 0-65535 /
俄罗斯

1
@Ruslan好抓住。对不起,缓冲区溢出。:)
mattdm

FWIW也很好地解释了为什么这件礼服如此偏光
韦恩·沃纳

8

不,图像不只是0-255范围内的RGB值。即使您忽略存储格式,也有许多方法可以描述颜色。这里有些例子:

  • 红色,绿色和蓝色分量(RGB)
  • 青色,品红色,黄色和黑色成分(CMYK)
  • 色相,饱和度和亮度/值(HSL / HSV)
  • 撞击相机中一组传感器的光量
  • 撞击传感器时的光量及其方向(在光场相机中

前两个分别最常用于在监视器上显示和打印。

另外,图像不仅是像素,而且还是元数据。可能是诸如像素数的宽度,要打印的实际宽度,缩略图,甚至是拍摄图像时相机的地理位置之类的东西。


6
即使使用像RGB这样“简单”的东西,也存在不同的色彩空间。例如,一个简单的24位RGB位图可能已进行了伽马校正-如果不撤消该校正,它将显得太暗。强度分布可以是线性的,也可以是其他任何形式。Adobe RGB和sRGB都是24位RGB位图,但是对“相同”颜色的表示却非常不同。就像“没有纯文本文件之类的东西”一样,也没有“普通图像”格式。最好的选择是“此特定系统/应用程序的本机图像格式”。
Lu安

1
从未见过保存hsv / hsl数据的格式,但我见过存储LAB或XYZ数据的格式
joojaa

2
@Luaan您应该将其扩展为答案。伽玛差异是答案中似乎没有人提及的一件事。
蒂姆·塞吉因

5

您的前提是正确的:可以使用N维有限值数组来表示任何图像。我个人概括地说,使用离散几何而不是矩阵,但是本质是相同的。但这就是内容,而不是文件。

但是,文件格式不同。基本上,有几种不同的方式来表示同一张图像,例如提到的人:bmp,png,jpg等。当然,一旦对它们进行解码,同一图像的两个无损编码版本将产生相同的矩阵。
可以将其视为使用zip压缩的.txt文件。更加怪异的是,无损编码会返回与原始文本不一样的文本,但它实际上是接近文本的,几乎像文本的翻版版本。

与文本相似,假设您具有相同的文本,另存为.txt,.docx,.pdf等。如果内容相同,为什么所有文件也不完全相同?(好吧,txt没有格式,但其他人有)。

顺便说一句,看看Netpbm编码JPEG的真正区别是什么。


3

据我所知,对于RAW和TIFF格式,答案(正如其他人所说的)是它们实际上并不总是使用相同的色彩空间(例如,RAW文件每个像素可能使用更多位,因此可以存储更精细的色彩信息) 。

但是要解决您的问题的症结-有时有些图像以不同的格式存储,但是每个图像最终都表示完全相同的数字数组。

一个很好的例子是PNG文件和TIFF文件之间的压缩差异。

PNG文件使用一种特定的压缩算法。这意味着图像将不仅仅存储为每个像素的大数字列表。简化的示例:它可能存储“在此10x10像素块中,所有像素均为XYZ颜色”的内容。然后,将其存储一次,而不是将信息存储100次以上,再加上有关该信息适用区域的一些信息。

然后的问题是找回原始的数字数组(代表颜色),以便您可以显示或编辑它,或进行任何其他操作,您需要知道如何解释压缩信息的软件。

PNG文件始终使用相同的压缩算法,因此软件很容易支持所有有效的PNG文件。另一方面,某些图像的结构不适合PNG的压缩算法,因此某些PNG文件可能最终变得很大。

另一方面,TIFF文件支持许多不同的压缩算法。实际上,它甚至可以存储以不同方式压缩的图像的不同部分。并且它支持“扩展名”,因此您可以使用专有方式压缩图像。因此,也许图像的上半部分将使用与PNG相似的方法进行压缩,但这不会很好地压缩下半部分,因此下半部分将使用其他方法进行压缩。

因此,TIFF文件更加灵活-您可以使用更少的字节存储完全相同的数字数组。但是解码图像所需的软件将更加复杂,并且可能无法与您扔给它的每个TIFF文件一致地工作,例如,您可能将TIFF文件保存在一个软件中,并且无法使用其他软件打开它。仍然可以在原始版本中使用。

所以你问

但是除了基本的3通道RBC图像之外,我没有其他问题。我所知道的是,如果有人递给我其中之一,那么我现在有一组数字。我没有理由知道为什么一个数字数组可能与其他从0到255的数字数组可能有所不同。

为了将其交给您,必须有人知道如何存储图像以及如何将其转换为数字数组。(或者可能是某些软件为您执行了您不了解的翻译)。

您可以尝试将图像另存为PNG,然后再另存为TIFF或GIF,然后在十六进制查看器中对其进行查看,以了解它们分别代表不同的相同数字数组的方式。或阅读有关内部如何表示PNG文件TIFF文件的详细信息,以使您了解需要在软件中内置什么内容才能以不同方式读取相同的数字数组。


1
But to get to the crux of your question - sometimes there are images which are stored in different formats, but each ultimately represents exactly the same array of numbers.这对于无损图像可能是正确的-但如果您将低比特率HEIF图像与低比特率JPEG进行比较,那是完全错误的。
flolilo

1
@flolilolilo是的,这就是为什么我说“有时”的原因-我对这个问题的解释是,他们在问“如果我最终得到的是完全相同的颜色网格,文件之间有什么区别”。因此,我所说的是无损压缩,这是一种简化的情况,您可以使用不同的压缩方法处理来自不同文件类型的完全相同的数字网格。
LangeHaare

Raw几乎从未在每个“像素”中使用更多位,但是RAW也不描述像素,而是描述了photosite。RAW图像是来自传感器的原始传感器数据,每个特定的photosite仅具有1个通道,而没有3个通道。RGB通道是通过查看其他颜色的相邻photosite来确定的。实际上,RAW文件通常比处理RAW的未压缩图像小。
AJ Henderson

1
例如,原始16位仅使用每个“像素” 16位,但是未压缩的8位彩色BMP将使用每个像素24位,因为它需要存储红色,绿色和蓝色的8位信息。可以进一步调整RAW的原因是尚未合并颜色信息。您可以更改诸如白平衡之类的东西(白平衡会改变每种特定颜色的photoite在确定每个结果像素的颜色信息方面的影响)。
AJ Henderson

3

位图

位图(BMP)本质上就是您所描述的,它是代表像素颜色的数字数组。例如类似

1,1,1,0,1,1,1,1,1,1,1

无损压缩

现在,让我们定义一个压缩方案。在我们的压缩方案中,我们将有一组数字对。例如

3、1、1、0、7、1

现在,我要指出的第一件事是,这种压缩方案表示的像素与第一个数组相同。第一个数组具有三个1,然后是单个0,然后是七个1。这就是我们在这里代表的。此格式较短,因为它表示具有两个数字的多个像素。位图格式必须为每个像素使用一个数字。

显然,这是一张图像的简化视图(例如,只有一行)和一种压缩方案。但是希望这可以让您了解压缩方案如何更改图像格式。这就是GIF与BMP的关系。GIF使用一种称为Lempel-Ziv-Welch的压缩方案,而不是这种简单的方案。

我们在这里描述的是一种无损压缩方案。无损压缩方案的问题在于,对于某些输入,编码形式可能比原始形式更长。例如

1,0,1,0,1

编码是

1,1,1,0,1,1,1,1,0,1,1

好吧,那没用。我们输入的时间是原来的两倍。

另一种无损压缩

现在,让我们考虑一种不同的压缩方案。在这一幅图中,我们将图像表示为重叠的圆圈。对于每个圆,我们将定义一个中心,一个半径和一个颜色。

我们的第一个位图将变为

5、5、1、3、0、0

这与我们的第一种压缩方法的长度相同。

我们的第二个可能是

2,2,1,2,1,0,2,0,1

这是三个圆圈,中间居中(在计算机计数中为2,因为计算机从0开始计数)。一个圆的半径为2,颜色为1。然后添加一个圆,颜色为0,半径为1。最后,我们得到一个圆,颜色为1,半径为0。在步骤中,这将是

1,1,1,1,1
1,0,0,0,1
1,0,1,0,1

要么

2,2,1,1,0,0,3,0,0

这是相同的初始圆,但由两个点圆覆盖。分步进行

1,1,1,1,1
1,0,1,1,1
1,0,1,0,1

它们都比第一个编码版本短,但仍比原始版本长。

您可能想知道为什么我在谈论圈子而不是范围。主要原因是圆更接近实际的二维图像所使用的。

有损压缩

我们也有损耗压缩方案的概念。这些无损压缩方案可以转换回原始的位图数组。有损压缩方案可能是不可逆的。

让我们考虑一下圈子方法的有损版本。在这里,我们将使用一个简单的规则。我们不会存储任何半径小于1的圆。因此,在最后两种编码中,我们将有

2,2,1,2,1,0

2 2 1

再次转换为像素的是

1,0,0,0,1

1,1,1,1,1

第一个版本仅比原始版本长一个元素。第二个版本较短。两者都是有效的,因此该算法可以自由开发两者并选择较短的一个。

我们将具有更多限制性规则的图像描述为质量较低的图像。

这种以叠加的圆形形状表示的图像表示类似于“联合图像专家组”或JPEG格式的工作方式。它的形状是椭圆而不是圆形,但是想法很相似。它使用离散余弦变换来编码图像,而不是我们的简单化方法。

与GIF不同,JPEG实际上是表示图像的另一种方式。GIF仍然是像素。它们只是以不同的方式存储。JPEG是形状。要查看JPEG,我们然后将形状转换为像素,因为这就是屏幕的工作方式。从理论上讲,我们可以开发一种无法通过这种方式运行的屏幕。它可以产生像素而不是像素,从而更好地匹配JPEG格式。当然,该屏幕将无法显示位图。要显示BMP或GIF,我们必须将其转换为JPEG。

如果转换标准的GIF(例如300x300像素),将其转换为JPEG,然后降低画质,则其使用的基本形状应可见。许多JPEG通过从更高分辨率的图像开始避免了这些伪像。

JPEG很好地缩放,因为它们是形状而不是像素。因此,如果从8000x8000图像开始,将其转换为JPEG,然后将其显示为300x300图像,那么丢失的大部分细节还是会丢失。如果先将8000x8000位图转换为300x300位图,然后再转换为JPEG,则结果通常质量较低。

MPEG格式

我们一直在谈论静止图像。“ 运动图像专家组”或MPEG格式使用与JPEG相同的压缩方式,但它还执行其他操作。做视频的一种简单方法是发送一系列静止图像,而MPEG实际上发送一个帧,然后发送一些列出更改的帧,并以结束帧结束。因为大多数帧都与前一帧相似,所以更改列表通常小于第二张图像。

序列通常不会那么长,比如说五帧。但这有助于使流变得更小。

简化版

我已经忽略了很多。我的图像只有两种颜色(1位),没有8位图像的256种颜色,当然也没有32位图像的4,294,967,296种。即使使用8位图像,请注意,您通常可以为图像选择不同的调色板。因此,两个具有相同序列的8位位图可能表示看起来不同的图像(形状相同但颜色不同)。

我的图像是单行的,而不是二维的。大多数图像将存储特定的行大小,从而使数组成为二维。

我完全没有尝试表示实际的编码。它们比我用过的简单得多。我这样做是因为我希望能够描述本文中的编码。我不相信我可以在一个答案中对Lempel-Ziv进行更复杂的Lempel-Ziv-Welch提炼,而不必多解释。而且我对傅立叶变换还不够了解,无法对它们进行任何解释。

这是实际图像处理的简化版本。但是,我认为,出于教学目的,比更复杂的现实更容易理解,同时仍能达到要点。


3

可以说,每个像素都是0-255范围内的三个数字(红色,绿色和蓝色)。其他回答者已经开始(正确地)挑战了这个假设,但是为了简单起见,我们只说这是对的。

我记得(但遗憾的是在网上找不到)一本语言学教科书上的动画片:两个古埃及石刻匠精疲力竭地坐在一堵巨大的墙壁的底部,上面雕刻了许多行进的雕像。一个人对另一个人说:“肯定有一种更简单的写法,'法老王有十万名士兵?'”。记住这个想法。

现在,假设图像的第一行包含1800个黑色像素。如何表示?

0 0 0    0 0 0     0 0 0   ....

那么,这将需要多少存储空间?每个值是一个字节。每像素3个字节,行1800个像素,因此每行已经5400字节。因此,尺寸为1800 x 1200的图像所占的空间必须是其1200倍,即6兆字节。因此,现在让我们去做一个Google图片搜索并下载几张1800x1200图片,例如一张.png图片和一张.jpg图片。查看文件大小:6 MB?没办法,它通常是小于。当然,这是可取的事情,它可以节省所有空间并缩短下载时间。

发生什么了?关键是,即使您要存储的数字太多,也有不同的表示方式文件中的那些数字。在我的回答中,有两段是一个更有效的表示形式的示例。我写了“ 1800黑色像素”字样。那是17个字符,因此不需要占用超过17个字节,但是它完美地描述了我们认为需要5400个字节的完全相同的信息。如果您不使用英语来编码此信息,而是使用一种更专用的语言,则肯定可以做得比17个字节更好(并且还可以节省编码/解码实现的大量工作量)。因此,现在,我们已经提出了不止一种图像压缩格式:一种使用英语单词,另一种比这更有效。看到这是怎么回事?

好的,您说的是,如果一大堆相邻像素碰巧都具有相同的颜色,则该方法有效。但是,如果他们不这样做怎么办?好吧,可以肯定的是,它取决于特定图像的内容:冗余度越高,压缩信息就越容易。冗余意味着,如果您已经知道其他部分,则可以很好地预测图像的某些部分。压缩意味着仅写下重建信息所需的最低限度的最低要求。并非每个可能的图像都具有冗余,但是,尽管比我的纯黑色示例更为复杂,但任何对人眼和大脑有意义的真实图像仍将具有很多冗余。并且有许多不同的压缩方式。一些压缩方法是无损的,这意味着该信息可以重建为在数学上与原始信息相同,例如在我的黑色像素行示例中。大多数.png文件使用无损压缩方法。有些方法是有损的:重建不是完美的方法,但是错误的隐藏方式使得人眼和大脑几乎看不到它们。大多数.jpg文件是有损的。

如何识别冗余的复杂模式以及如何对它们进行有效的压缩描述的细节是高度数学的,而且是不平凡的,这就是为什么存在如此之多的格式(对应于不同的压缩策略)的原因。但是希望您能理解该原理。

上面的一些评论者已经对您的误解可能发生的地方做出了合理的猜测。在您的问题中,您似乎认为压缩只是稍微改变了像素值(当然,有损压缩方法会在适当的地方做到这一点,但这只是不想要的副作用)而没有改变信息布局。当您打开文件并查看图像内容时(例如,在Matlab中为数字数组或在Photoshop中为屏幕上的图像),您不是在查看压缩文件的内容,而是在查看重建的内容。,其布局与原始布局相同(如果未正确重新创建布局,则不会构成太大的重构)。文件打开过程已将文件中的信息解压缩为内存中完整的未压缩表示形式。如果比较两个如果使用非压缩重建,那么实际上就没有区别它们来自的两种不同图像格式(重建误差除外,如果有的话)。


1

是的,但是如何获得那些1和0却大不相同。

我将举一个例子,但它是虚假的,是为了说明更多而不是准确的。请记住,所有数字图像在某种程度上都以二进制表示。

使事情复杂化的是,有不同的渠道。CMYK,RGB,B&W,仅举几例。我们不会涉及到这一点。也有不同的阶段,例如捕获,存储和显示。我们将对此进行探讨,尽管该示例应该再次证明是不准确的。如果您需要准确的示例,则需要查阅大量的技术文档。

因此,在我们的示例中,我们将要查看黑白图像。

00067000
00067000
00567800
04056090
40056009

数字代表“黑色”的强度。相机就是这样拍摄图像的。这是一个不错的相机,所以它也是存储图像的方式。

现在它将图像存储在计算机上,但占用了大量空间,因此我们将对其进行压缩。除了将其混搭外,我们还知道大多数人无法检测到1个黑电平的差异,因此我们将对其进行平滑处理。

302730
302730
204820
*04056090
1420262019

现在这就是我们将映像存储在磁盘上的方式。它占用更少的空间,并让我们产生大量的原始图像。

现在,我们要在打印机上进行打印。打印机仅打印一级黑色,因此计算机将存储的压缩图像转换成打印机的语音。

00011000
00011000
00111100
01011010
10011001

这样可以打印出看起来很合理的图像,但是即使在示例中,您也可以看到质量极差。但这是打印机的问题。

最后,您可以在具有10级黑色的优质打印机上打印图像。与您的相机相同。因此,您可以使用存储和压缩的图像。

00077000
00077000
00888800
04056090
40066009

如您所见,该图像“更好”,但与原始图像有所不同。

在任何给定时间,您都认为这仅仅是渠道的优势。除了压缩图像之外,无论如何都必须对其进行解压缩,这对于它来说仍然是真实的。

但是,压缩格式会丢失很多“信息”。这些信息重要吗?好吧,这取决于艺术家和听众。在节省空间,处理时间,最终/存储图像的质量和需求之间要进行权衡。我用一种黑色扫描大多数文档,因为这就是我所需要的。但是,我的婚礼照片采用的是RAW RAW格式,因为我不知道何时需要对它们进行大幅重印。就是说,当我将它们(照片)传输到数码相框时,我将它们转换为JPEG以节省空间。不同的通道,不同的滤波器和不同的压缩方法都是一系列的权衡。这就像打印机三角形的数字版本。


您的第二个代码块(压缩)显示RLE,对吗?您可能应该说您要用重复计数+样本值替换样本,以便人们知道哪种压缩方式,因为如果您不希望使用RLE,则完全不明显。
彼得·科德斯

1

尽管我主要使用运动图像,但我将在图像传感和编码/压缩方面加入一些补充信息。

就其基本形式而言,显示在特定屏幕上的图像(任何图像)实际上只是一个相同的数字数组。这些数字都可能是0-255或0-65535或0-I-forgotgo-google-it。

但是,存储和传输的方法非常多,以至于信息很多,其中许多仅仅是技术的产物,它们被时间的迷of所迷惑。

另外,我在这里没有看到的其他任何人都提到过一个细节,那就是来自数码相机的真正RAW图像传感器数据很可能是呈拜耳模式的RGrGbB或类似的东西,至少需要一点点处理才能制成对Mk.1人类的眼球没有任何意义。即使将其转换为DSLR保存的RAW格式,也没有机会得到它,因为在将其转换为RGB或YUV像素的好网格(深度为8、16、32或千亿位)之前,它是无用的。

我研究过的东西出于某种原因在内部使用YUV,我认为编解码器更容易处理它,因为人类感知亮度的灵敏度比颜色高得多。

对于一些睡前阅读,请参阅“帧图像格式”部分:http : //focus.ti.com/lit/ug/sprufg8b/sprufg8b.pdf

无论如何...回到您最初的问题,关于未压缩图像文件(例如TIFF / RAW / IFF / PNG)之间的区别。

通常,存在这些原因的原因是,许多月前,每台计算机/操作系统/打印机制造商都提出了自己的一套稍微不同的要求,以某种方式存储/发送图像。

因此,正如该线程中的其他人所讨论的,RAW是通用名称,它表示不同数码相机保存的几种不同东西,它们使用的是相机制造商认为重要的任何数据负载,具体取决于其相机将来可能具有的功能。因此,尽管主图片数据位可能非常相似,但围绕它的“打包”描述了图像和所有相机设置等,因此,不同的制造商将无法理解一个文件。

传统上,这样可以使您(或更可能是专业摄影师)使用其专有的(有时是昂贵的)软件来处理这些质量更高的图像,否则,您可能会开始使用其他人的昂贵软件。另外,也许Adobe Photoshop希望支持其格式,所以他们可以向Adobe $$$收取该信息的费用,以便更多的专业摄影师购买PS并购买该相机品牌的照相机,因为PS现在支持它。舒适!

RAW还存储有关如何将特定数据束转换回人类可见图片的信息,只需简单地对数据进行所有必要的调整即可使图像看起来“正确”。

TIFF是一种早期的图像格式,除其他外,还用于将图形数据发送到打印机(当具有图形功能的打印机开始可以负担得起时)。这是相当基本的,因此很容易在打印机内部的小型廉价微处理器上进行处理。

IFF(是的,就是这样)是我在Amiga计算机上使用的类似格式,我相信它们是由它们或一种流行的绘画包发明的。但是,我在这里以它为例,因为尽管它像其他图像一样存储位图图像数据,但它支持未压缩或RLE数据,位深范围从1位单色到8位256色(但一个3x8位RGB调色板供每种颜色选择),以及称为Halftone和Hold-And-Modify的特殊模式,可以提供比该时代其他机器所能管理的更多的颜色。哦,它也支持动画(例如GIF),因此IFF文件可以存储任意数量的帧,帧之间的延迟可变,并且每个帧都有自己的调色板。因此,与TIFF文件相比,IFF将包括额外的数据来处理所有这些问题。

PNG是另一种无损图像格式,再次存储位图数据,但支持一些时髦的功能,例如8位alpha通道,可在整个图像上使用可变的透明度(在网页上很有用),因此图像数据的“有效载荷”看起来也非常相似但是它周围的包装器是不同的,并且有效负载可能包含RGBA,而不仅仅是每个像素的RGB数据。

因此,这里描述了4种不同的图像文件格式-您可以在这4种图像中的任何一种中存储一只猫的全彩高清图片样本,并且看起来完全一样,屏幕上的每个像素都具有EXACT SAME值,并且没有4个文件之间的质量差异...,但4个文件的大小,布局可能会有所不同,并且软件加载和处理起来会更容易或更难。

希望有帮助!


0

只是以为我会在这里收到应该首先回答该问题的信息。

图像中的像素不以字节为单位存储-除非图像是单色的,即仅黑白。

如果具有真彩色图像,则每个像素用16位或2个字节表示-作为一个值。如果您具有32位图像,则每个像素需要32位或4个字节,再次作为单个值。

有趣的是,计算机中的图像和声音文件以及所有其他数据类型都可以归结为1和0。只有通过以正确大小的块来解释它们,才能从它们中提取含义。

例如,图像,Word文档和mp3文件都具有相同的基本数据内容(一堆字节),并且它们中的任何一个都可以解释为其他类型之一-您可以将word doc解释为声音文件,您会听到一些声音,但这不是音乐。您可以肯定地将声音文件解释为图像,并且它可以显示某些内容,但它并不是一个整体图像。

因此,总而言之,计算机只知道比特-比特是1或0。所有图像,声音,文档,电影,视频,录音,游戏,电话,短信和其他标记为数字的东西都具有相同的精确度。内容-一堆1和0。1和0变成图像,声音和文档以及其他所有内容,因为读取它们的代码知道要成组读取这些位并进行相应处理。

这就是为什么我们会有16位和32位图像以及16位和24位音频文件之类的原因。您用于像素或声音样本的位数越多,表达力就越强-16位只能定义64k种唯一颜色,而32位可以定义超过400万种唯一颜色。单色图像每个像素使用1位-启用或禁用。

对于音频文件,每个样本使用的位数越多,录音的细节就越细腻。


0

我还没有读完整个主题,但在我看来,很多人都忘记了矢量图像格式。这些不是像素阵列,因为像素的概念甚至都不以这种格式存在。由渲染器决定如何在屏幕或任何其他介质上生成图像。

即使不提及色域,压缩,位大小和通道格式,也存在一组完全不同于像素图的文件格式。然而,矢量格式在表示某些类型的图像(通常由计算机而非照相机产生)上也“更好”。


1
这是一个摄影网站,由于数码相机记录的是像素阵列而不是矢量,所以在这种情况下,我不会说它像“正常情况”那样“令人遗忘”。
mattdm

0

之前已经很详细地回答了这个问题。但是,尽管答案中提出了很多理论,但我还是觉得有些基本主题(通常与计算机编程相关)需要进一步阐明。我必须声明我是一名软件工程师。阅读问题后,我意识到对产生此问题的基本编程数据类型有完全的误解。

这里的第一个问题是:

此外,从数字角度来看,是什么使16位图像与32位图像不同?同样,图像只是一个整数值在0 -255之间的数组。

如前所述:不,不是。 图像不仅是0到255之间的整数数组。实际上,它可能是一个0到65535值的单一或多维数组,一个0到4294967295的数组,甚至是一个位数组(一个位可以容纳0或1个值,仅此而已),这些软件可以根据各种编码规则将图像文件读取为整数。

如前所述,为了进一步理解这一点,我认为有必要对基本编程数据类型进行讨论。我将尽力解释它们,以便任何人都理解将整数值存储在计算机文件中所涉及的问题。

在计算机编程中,我们使用一些基本的原始数据类型将值写入文件,将它们从文件中读取到计算机内存中,使用各种特定的编程语言数据类型来操纵这些值,最后将它们保存回文件中。计算机编程中的整数不仅是整数。有各种各样的整数,取决于我们使用的编程语言以及每个整数需要多少内存。通常,在大多数编程语言中,我们具有以下数据类型(以及操作它们的方式):

  • BIT-持有0或1
  • UINT8-8位无符号整数-它们可以保存[0到255]间隔之间的值。
  • INT8-8位带符号整数-它们可以保存[-126至127]间隔之间的值。
  • UINT16-16位无符号整数-它们可以保存[0到65535]间隔之间的值。
  • INT16-16位无符号整数-它们可以保存[−32768至32767]间隔之间的值。
  • UINT32-32位无符号整数-它们可以保存[0到4294967295]间隔之间的值。
  • INT32-32位无符号整数-它们可以保存[−2147483648至2147483647]间隔之间的值。
  • 或以更复杂的格式组合所有这些数据类型。例如,一个UINT16(16 BIT)保留3个不同的值,前4个BIT保留0至127之间的值,下一个BIT保留0或1,依此类推。

此外,程序员从文件读取或写入整数数据类型时还必须处理一些事情。耐力。字节顺序是指将字节(我们表中的UINT8)存储在内存或文件中时按顺序排列为较大数值的顺序。字节序在计算机科学中是令人感兴趣的,因为通常使用两种冲突且不兼容的格式:值可以大端或小端格式表示,具体取决于从大端开始是按位还是字节还是其他组件排序(最重要位)或小端(最低有效位)。简单地说,您可以存储一个像这样的值0000000011011111或...这样的1101111100000000取决于您选择的字节序或字节序。您可以自由选择适合您目的的任何订单。设计图像文件格式时,您没有制定其他规则。

请注意,在计算机编程中,整数正在使用或多或少的空间,取决于该值。就像您需要更多的纸来写255255255一样,您需要更多的BIT来写更大的值。然后,当您想读取该值时,您必须确切了解编写该值时创建的规则。否则,您将无法弄清楚我们如何仅读取整数值在0 -255之间的数组,因为您根本不知道这些数字的存储位置以及如何存储这些数字,因为您有这么多选择(BIT,UINT8 ,UINT16,UINT32或所有这些计算机数据类型的组合)。别忘了Endianness。如果您不知道数据是使用大端顺序还是小端顺序写入的,那么您将无法读取正确的值。

因此,永远不会只是一个整数值在0到255之间的数组。其中一些是UINT16的数组(16位图像),有些是UINT32的数组(32位图像),其他是UINT8的数组(8位图像)。一些非常有创造力的计算机程序员甚至可以使用带符号的类型,这些类型可以与INT8数组一起使用,这意味着-126到127之间的值数组。

实际上,当您读取图像文件时,遇到的第一个数据通常是一些表示图像宽度和高度的BIT。这些不只是一些0-255的值。这些也是程序员选择的一些数据类型。一些程序员会认为16位BIT足以存储65535像素的最大图像宽度,因为他们正在设计一种用于游戏的图像格式来保留一些小按钮图像。其他一些程序员可能在此处使用32bit值,使您可以存储宽度和高度高达4294967295的图像。一些疯狂的NASA程序员甚至可以使用64bit来存储高达18446744073709551615615像素的巨大银河照片。如果您不了解规则,则无法在调用它们时读取这些“值”。因为您不知道它们在映像文件中的开始位置和结束位置。因此,您最终得到了一堆BIT,您对此一无所知。

这就是为什么宇宙充满了许多不同的图像格式的原因。因为没有标准的解决方案将一些整数值写入文件。程序员的选择完全基于许多因素,例如您正在使用的机器的Endianess,用于设计原始文件格式实现的编程语言以及许多其他因素,例如图像格式的目的(如前所述)。其他答案)。

黑白图像的一种实用的简单文件格式,仅包含一个值166以表示4x2像素的图像:

图像(1-黑色像素,0-白色像素):

1010 
0110

该文件格式使用每个PIXEL 1 BIT(存储为一个8位整数值166(10100110))。就这样。没有使用0-255值的数组,而是存储了8个不同的0或1值作为值166。

如果对每个像素使用0-255值的数组*对于RGB使用3次,则最终得到的图像将大24倍。例如,在高性能3D游戏引擎中使用此图像时,此文件格式仅节省了保存图像所需磁盘空间的24倍,或将图像读取并保存到计算机RAM所需的计算机内存减少了24倍。用它在屏幕上画一些东西(使成千上万的尘埃飞扬的纹理可能是一个不错的选择:)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.