type
Post
status
Published
slug
2022/12/07/wiki-os-dev-org-dithering
summary
抖动是修改图像中各种像素的颜色以更好地再现源图像的过程。当在无法呈现所有所需颜色的显示器上显示图像时,通常会使用它。
tags
osdev
category
osdev
icon
password
Property
Dec 10, 2022 01:33 AM
created days
抖动是修改图像中各种像素的颜色以更好地再现源图像的过程。当在无法呈现所有所需颜色的显示器上显示图像时,通常会使用它。抖动通常与颜色量化过程一起使用,建议在继续阅读本文之前了解该主题。
维基百科关于抖动的文章非常好,并给出了每种抖动方法的可视化示例。本文提供了一个略有不同的观点,并着重于可能对操作系统开发人员有用的元素。
请注意,抖动和抗锯齿是相反的功能。抖动使用空间分辨率来弥补颜色的不足。抗锯齿使用颜色来弥补空间分辨率的不足。

1 误差扩散

用于光栅(基于像素)显示器的最有效的抖动技术原理是误差扩散,也就是说,它们为像素计算最接近的可显示颜色(通过颜色量化),然后计算该像素应该是什么和现在是什么之间的差异。然后将该计算出的差异(“误差”)分配给相邻像素,并在对它们进行量化时将其考虑在内。误差可以在多个像素上累积,直到变得足够重要以改变量化的结果。

1.1 基本形式

误差扩散的基本形式是将第一个像素的误差应用到右边的下一个像素。这样做的好处是非常容易实现,因为代码只需要跟踪一个像素值的误差,但是会生成相当粗糙的结果。
在伪代码中,这可以实现如下:
Define E as the carried error For Each Source Pixel As P Define Colour C as { P.R - E.R, P.G - E.G, P.B - E.B } Calculate the Nearest colour to C as NC using the Colour Quantiser Display the pixel as NC on the screen Set E to be ( NC.R - C.R, NC.G - C.G, NC.B - C.B } Next
因为我们从一个像素中获取误差并将其完全应用于右侧的像素,所以我们可以使用以下矩阵内核(另一种形式)表示它:
0
0
1
矩阵中心的零表示当前像素,右边的一表示整个误差(误差的 1 倍)应用于右边的像素。
这是表达误差扩散抖动的标准方式。所有误差扩散算法都将像这样显示,当前像素位于中心,其周围的分数表示误差要扩散到哪些像素。还要注意的是,中心上方或紧邻中心左侧的任何像素都将为零,因为所有算法都认为这些像素已被绘制。这意味着抖动可以按顺序应用于像素。

1.2 Floyd–Steinberg Dithering(弗洛伊德-斯坦伯格抖动)

这是一种更有效和更常见的抖动算法。它从第一个像素中提取误差,并使用以下内核将其分配给四个相邻像素:
0
0
0
0
0
7/16
3/16
5/16
1/16
和以前一样,中心的零表示正在处理的像素,下方和右侧的分数表示误差被累积到相应像素中的比例。如上所述,误差仅扩散到右侧或下方的像素,因此可以将例程顺序应用于图像。
这种方法非常有效,可以在少到只有 8 种颜色的显示器上呈现高色彩图像。
该算法的实现比基本形式稍微复杂一些,这是因为例程需要存储两行误差值才能正确计算每个像素的有效颜色。根据应用程序,抖动过程可以修改源图像本身中更靠前的像素,以避免必须单独存储扩散的误差数据。

2 其他抖动类型

除了误差扩散,还有其他可用的抖动类型,其中一些更适合光栅(基于像素)屏幕以外的媒体。这些被认为超出了本文的范围。有关详细信息,请参阅维基百科文章。

3 外部链接

 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
wiki.osdev.org 系列之 - CRC32wiki.osdev.org 系列之 - Page Frame Allocation

  • Waline
  • Utterance