主要内容

减少图像中的颜色数量

在具有24位彩色显示器的系统上,真彩色图像最多可以显示16,777,216(即224)颜色。在具有较低屏幕位深的系统上,由于MATLAB,真实彩色图像仍然显示得相当好®自动使用颜色近似和抖动如果需要。颜色近似是在无法找到直接匹配的颜色时,软件选择替代颜色的过程。

但是,如果它们具有大量颜色,则索引图像可能会导致问题。通常,由于以下原因,您应该将索引图像限制为256种颜色:

  • 在具有8位显示的系统上,超过256色的索引图像需要抖动或映射,因此可能无法很好地显示。

  • 在某些平台上,颜色贴图不能超过256个条目。

  • 如果索引的图像有超过256种颜色,MATLAB不能将图像数据存储在uint8数组,但通常使用类的数组相反,使图像的存储大小更大(每个像素使用64位)。

  • 大多数图像文件格式将索引图像限制为256色。如果写入的索引图像颜色超过256色(使用imwrite)对于不支持超过256种颜色的格式,您将收到一个错误。金宝app

减少图像中颜色数量的方法包括:

使用颜色近似减少真彩色图像的颜色

要减少图像中的颜色数量,请使用rgb2ind函数。这个函数将真彩色图像转换为索引图像,减少了处理过程中的颜色数量。rgb2ind提供了以下方法来近似原始图像中的颜色:

结果图像的质量取决于您使用的近似方法,输入图像中的颜色范围,以及您是否使用抖动。请注意,不同的方法为不同的图像工作更好。看使用抖动减少颜色有关抖动的描述以及如何启用或禁用它。

量化

减少图像中颜色的数量涉及量化. 功能rgb2ind使用量化作为其颜色还原算法的一部分。rgb2ind金宝app支持两种量化方法:均匀量子化最小方差量子化

在图像量化的讨论中的一个重要术语是RGB颜色多维数据集.RGB颜色立方体是为特定数据类型定义的所有颜色的三维数组。因为RGB图像在MATLAB中可以是类型的uint8,uint16,存在三种可能的颜色立方体定义。例如,如果RGB图像属于uint8,为每个颜色平面(红色,蓝色和绿色)定义了256个值,总共将有2个24(或16,777,216)颜色由颜色立方体定义。这种颜色立方体对所有颜色的立方体相同uint8RGB图像,无论它们实际使用哪种颜色。

这个uint8,uint16, 和颜色立方体都具有相同的颜色。换句话说,最亮的红色uint8RGB图像显示与图像中最亮的红色相同RGB图像。差异是RGB Color Cube具有更多的红色色调(以及更多颜色的更多色调)。下图显示了一个RGB颜色立方体uint8的形象。

RGB Color Cube for uint8 Images

量化涉及将RGB颜色立方体划分为多个较小的框,然后将每个框中的所有颜色映射到该区域的颜色值中心从那个盒子里拿出来。

均匀量化和最小方差量化在分割RGB颜色立方体的方法上有所不同。通过统一量化,颜色立方体被切成大小相同的盒子(更小的立方体)。通过最小方差量化,颜色立方体被切割成不同大小的盒子(不一定是立方体);盒子的大小取决于颜色在图像中的分布。

均匀量化。要执行均匀量化,请调用rgb2ind并指定一个宽容. 公差决定了RGB颜色立方体划分到的立方体形状框的大小。公差设置的允许范围为[0,1]。例如,如果指定的公差为0.1,则盒边为RGB颜色立方体长度的十分之一,盒的最大总数为

n =(楼层(1 / tol)+1)^ 3

下面的命令执行公差为0.1的统一量化。

rgb = imread(“peppers.png”);[x,地图] = RGB2IND(RGB,0.1);

下图说明了均匀量化uint8的形象。为清晰起见,该图显示了颜色立方体的一个二维切片(或彩色平面),其中红色=0,绿色和蓝色范围从0到255。实际的像素值由x的中心表示。

在RGB颜色立方体的切片上均匀量化

划分颜色立方体后,将抛出所有空盒子。因此,只使用其中一个框用于为颜色图产生颜色。如前所述,可以预测由均匀量化创建的颜色图的最大长度,但颜色图可以小于预测,因为rgb2ind删除输入图像中未出现的任何颜色。

最小方差量化。要执行最小方差量化,调用rgb2ind并指定输出图像颜色映射中的最大颜色数。您指定的数字决定了RGB颜色立方体被划分成的盒的数量。这些命令使用最小方差量化来创建一个索引的185颜色的图像。

rgb = imread(“peppers.png”);[x,地图] = RGB2IND(RGB,185);

最小方差量化的工作原理是基于像素值之间的方差将像素关联到组中。例如,一组蓝色像素可能会被分组在一起,因为它们与组的中心像素有很小的差异。

在最小方差量化中,分割颜色立方体的框大小不同,不一定填充颜色立方体。如果颜色立方体的某些区域没有像素,则这些区域中没有方框。

在设置框的数量时,N,供…使用rgb2ind,放置由算法确定,因为它分析图像中的颜色数据。一旦图像被分成N最佳定位盒子,每个盒子内的像素被映射到盒子中心的像素值,如均匀量化。

生成的颜色贴图通常具有指定的条目数。这是因为颜色立方体被分割,因此每个区域至少包含一种显示在输入图像中的颜色。如果输入图像使用的颜色少于指定的数量,则输出颜色贴图的颜色将少于N颜色,输出​​图像将包含输入图像的所有颜色。

下图显示了与上图相同的彩色立方体的二维切片(显示了均匀量化)。使用最小方差量化创建了11个方框。

RGB颜色立方体切片上的最小方差量化

对于给定数量的颜色,最小方差量化产生的结果比均匀量化更好,因为它考虑了实际数据。最小方差量化将更多颜色的彩色映射条目分配给输入图像中经常出现的颜色。它分配了更少的颜色表现出来的颜色。结果,颜色的准确性高于均匀量化。例如,如果输入图像具有许多绿色和少量红色色调,则在输出颜色图中会有比红色更多的绿色。注意,用于最小方差量化的计算需要比均匀量化的更长时间。

彩色地图映射

如果指定要使用的实际颜色地图,rgb2ind用途彩色地图映射(而不是量化)以找到最佳匹配RGB图像中颜色的指定颜色映射中的颜色。如果需要创建使用固定颜色映射的图像,此方法非常有用。例如,如果要在8位显示屏上显示多个索引图像,则可以通过将它们全部映射到相同的颜色图来避免颜色问题。如果指定的颜色图具有与RGB图像中的颜色相似的颜色,则彩色地图映射产生良好的近似值。如果颜色映射与RGB图像中的颜色没有类似的颜色,则此方法会产生差的结果。

该示例说明将两个图像映射到相同的颜色图。使用MATLAB函数在飞行中创建用于两个图像的颜色映射彩色立方体,它将创建包含指定颜色数的RGB颜色贴图(彩色立方体总是为给定数量的颜色创建相同的颜色映射。)由于颜色映射包含了整个RGB颜色立方体的所有颜色,输出图像可以合理地近似于输入图像。

RGB1=imread('秋天.tif'); RGB2=imread(“peppers.png”); X1=rgb2ind(RGB1,彩色立方体(128));X2=rgb2ind(RGB2,colorcube(128));

功能imshow也有助于显示多个索引图像。有关详细信息,请参阅在同一图形中单独显示图像或参考页面imshow

使用imapprox减少索引图像的颜色

使用imapprox当您需要减少索引图像中的颜色数时。imapprox是基于rgb2ind并使用相同的近似方法。本质上,imapprox第一个电话ind2rgb将图像转换为RGB格式,然后调用rgb2ind返回具有较少颜色的新索引图像。

例如,这些命令创建了一个版本图像有64种颜色,而不是原来的128种颜色。

负载[Y,newmap]=imapprox(X,map,64);imshow(Y,新地图)

结果图像的质量取决于您使用的近似方法,输入图像中的颜色范围,以及您是否使用抖动。请注意,不同的方法为不同的图像工作更好。看使用抖动减少颜色有关抖动的描述以及如何启用或禁用它。

使用抖动减少颜色

当你使用rgb2ind要么imapprox为了减少图像中的颜色数量,生成的图像可能会比原始图像差,因为某些颜色会丢失。rgb2indimapprox两者都表现出色抖动增加输出图像中的明显颜色数。抖动更改邻域中像素的颜色,以便每个邻域中的平均颜色近似于原始RGB颜色。

对于抖动工作的一个例子,考虑一个包含大量橙色像素的图像,在色标中没有精确匹配。要创建此橙色阴影的外观,抖动将从颜色贴图中选择颜色组合,这些颜色组合作为六像素组,近似于所需的橙色阴影。从远处看,像素似乎是正确的阴影,但如果你仔细观察图像,你可以看到其他阴影的混合。为了说明抖动,以下示例加载24位truecolor图像,然后使用rgb2ind创建一个只有8种颜色的索引图像。第一个例子没有使用抖动,第二个例子使用了抖动。

读图像并显示它。

rgb = imread ('洋葱.png'); imshow(rgb)

图中包含一个坐标轴。轴包含一个image类型的对象。

创建具有八种颜色且不抖动的索引图像。

[X_no_抖动,map]=rgb2ind(rgb,8,“nodither”);imshow (X_no_dither地图)

图中包含一个坐标轴。轴包含一个image类型的对象。

创建一个索引图像使用八种颜色与抖动。注意抖动图像有更多的明显颜色,但看起来有点模糊。没有抖动的图像有更少的明显颜色,但与抖动的图像相比有更好的空间分辨率。在没有抖动的情况下进行色彩还原的一个风险是,新图像可能包含错误的轮廓。

[X_dither,地图]= rgb2ind (rgb 8“抖动”);imshow (X_dither地图)

图中包含一个坐标轴。轴包含一个image类型的对象。