小编pas*_*cal的帖子

如何自动确定对比度最高的RGBA图像的背景颜色?

背景

我有一堆 RGBA 图像。想象一下我想要显示的图标、徽标或类似图像。这些图像可以是任何颜色。另请注意,图像为 RGBA,因此它们具有第四个 Alpha 通道以实现透明度。

并发症

最初,我将所有图像显示在白色背景上。然而,有时整个图像或部分图像是白色的,因此这些区域对用户来说看起来是空的。

问题是图像不是全白或全黑的。可能有多种颜色和颜色渐变。而且,由于 RGBA 图像的工作方式,像素并不总是都是一种颜色并且都是不透明的。即使图像仅在中心显示纯黑色图标,黑色图标的边缘也可能存在过渡区域,其中像素具有一定的透明度或更偏灰色。

问题

假设,对于每个图像,我可以选择黑色、灰色或白色背景。如何通过算法确定三种背景颜色选项中哪一种最适合任何单个 RGBA 图像?

我所说的“最佳”是指图像的任何区域都不应错误地显示为空,并且图像和背景之间可以实现最高对比度。

例子

在下面的玩具示例中,我要显示的图标周围有一个白色圆圈。所以我不能使用白色作为背景色。我需要选择灰色或黑色。黑色是最好的,因为它可以最大限度地提高对比度。

玩具示例1

在第二个玩具示例中,事情稍微复杂一些,因为不同颜色的多个区域直接接触图像的透明区域。黑色背景似乎具有最高的对比度,但它不再是微不足道的。

玩具示例1

想法

  • 不透明区域的内部并不重要。背景颜色不会影响可见性。
  • 完全透明区域的内部部分并不重要。没有什么是看不见的。
  • 我可能需要在不透明和透明之间的这些过渡区域中找到那些像素。然后确定这些的颜色。

这看起来效率极低。由于大多数图标、徽标等都是针对明亮或黑暗背景设计的,因此在不透明和透明之间的过渡区域中仅采样几个像素是否就足够了?

我觉得我正在重新发明轮子,之前一定有人找到了解决这个问题的方法。

Stackoverflow 上的现有问题

  • 我发现有关确定给定背景颜色的最佳字体颜色的现有问题。然而我的问题是不同的。我看到的问题只是处理最大化两种简单 RGB 颜色之间的对比度。

附加示例3

请注意该徽标周围有一条细白线。这意味着最佳背景颜色可能应该是黑色。

在此输入图像描述

可以使用的示例

这里有十几个左右的 RGBA 图像可供使用。我不拥有版权——这只是为了说明问题。 谷歌云端硬盘链接

马克·塞切尔编辑

我已经添加了所有示例图像,从左到右如下:

  • 在棋盘上显示透明区域
  • 在黑色背景
  • 在灰色的背景
  • 在白色背景
  • 仅提取 alpha 通道

在此输入图像描述

python graphics opencv image-processing computer-vision

4
推荐指数
1
解决办法
1611
查看次数