【问题标题】:How can I tell a RGB color is basically BLUE? in c#我怎么知道 RGB 颜色基本上是蓝色的?在c#中
【发布时间】:2011-09-18 00:39:21
【问题描述】:

我有一组天空图像,有些有云,有些没有。

有些是湛蓝的天空,有些是多云的,有些是白云和灰色的混浊。

如何确定特定的 RGB 值或多或少是蓝色的?

任何深浅不一的蓝色都是“蓝色”——浅蓝色、深蓝色、海军蓝、天蓝色——这些都是蓝色。

我想将图像中的颜色减少到 16 种。然后我想制作白色、银色、灰色、蓝色和“其他所有颜色”的直方图。

我如何从 RGB 值中知道什么是蓝色或银色、白色或灰色,还是别的什么?

【问题讨论】:

  • 在 C# 中比较颜色很容易。确定“基本上是蓝色的”是困难的部分。

标签: c# colors rgb


【解决方案1】:

RGB 并不是处理这类事情的最佳色彩空间。诸如HSV (also known as HSB) 之类的颜色空间为给定颜色提供了更直观和更具描述性的模型。

所以,为了得到你现在的样子,你可以使用给定颜色的色调。如果您正在处理System.Drawing.Color 结构,您可以使用GetHue() 方法,它返回以度为单位的色调值。给定如下所示的色调轮,您可以为您将接受的蓝色值定义上限和下限(以度为单位)。

一般来说,图像处理和色彩理论绝非易事。我建议您找到满足您要求的最简单的方法。这对您来说可能已经足够了,也可能不够。如果没有,那么也许您可以为我缩小问题范围。

还要意识到,您仍然需要为亮度和饱和度组件设置一些阈值,以确保您实际上不是在处理黑色、白色或灰色。

【讨论】:

  • 我有一个 Photoshop 副本,与 c# Color.GetBrightness() 和 Color.GetSaturation 相比,我从 Photoshop HSB 颜色选择器对话框中获得了不同的值。我想我需要找到一个从 Photoshop 到 c# HSB 的转换例程
【解决方案2】:

如果红色和绿色值接近相同,并且蓝色值大于红色和绿色值,则颜色将在蓝色范围内。如果所有三个值大致相同,则您会得到某种灰色版本,如果它们都接近最大值,则颜色将看起来为白色。不可能比这更精确 - 您只需查看颜色选择器并确定哪个区域对您来说看起来“蓝色”。

【讨论】:

  • 谢谢 - 我一直在看图片,现在可以看到你所说的趋势。我很感激你花时间回复我。欢呼
  • “不可能”?使用不同的颜色空间,即使用颜色的色调而不是 RGB。远非不可能。
  • @Ed S.:看色调肯定会让事情变得更容易,这对 OP 来说是一个很好的建议(+1),但是对于 OP 来说,色调的“基本蓝色”范围是多少?我说它“不可能更精确”只是因为这个问题并不更精确。我注意到您给出的答案确实没有比我更接近解决问题。具体来说,OP 正在寻求从“白色”、“银色”和“灰色”中辨别“蓝色”,因此饱和度和价值开始发挥作用。无论您选择 RGB 还是 HSV,您仍在查看所有三个组件。
  • 确实如此。如果问题需要多个简单的阈值,那么 OP 将需要使用更复杂的方法来查找两种颜色之间的“距离”,其中纯蓝色作为参考颜色。
【解决方案3】:

也许可以为您想要的 16 种颜色中的每一种颜色构建一个 RGB 值的表,然后将每个像素的 RGB 值与表中的每个值进行比较。 要进行比较,请进行 R1-R2 G1-G2 B1-B2 之类的减法运算,然后将差异相加并将其转换为差异较小的颜色。

相关问题:Compare RGB colors in c#

【讨论】:

猜你喜欢
  • 2018-12-31
  • 2021-01-16
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 2020-10-14
相关资源
最近更新 更多