图像中颜色的二值化

Posted

技术标签:

【中文标题】图像中颜色的二值化【英文标题】:binarization of colours in images 【发布时间】:2014-01-29 13:33:21 【问题描述】:

我正在从基于像素的线图中提取图元,并希望通过颜色进行选择。因此在下面

我希望提取“蓝色”、“绿色”和“黑色”基元。 (我准备尝试重建被另一种颜色的图元分割的图元)。

但是,“蓝色”添加了不同数量的白色(类似于黑色的灰度)。因此,最常见的颜色(为简单起见四舍五入为 12 位)及其计数可能是

000   881 // black
88f   1089 // white-blue
fff   70475 // white

但在低频下还有其他程度的白度

// other white-blue 
99f   207

// other grey
ddd   196

我相信作者在许多图表中只使用了非常有限数量的纯色(例如 3-6 种),并且各种渲染工具都会添加白色。 IOW颜色可以用(0 =< x =< 1)表示

000 + x(FFF)
00F + x(FF0) // blue
0F0 + x(F0F) // green

但是,不要求使用原色,并且该集合可以是任意颜色的任意数量的白色。

如何重建(小)一组不同的颜色?如果可能的话,我可以选择这些区域,转换为灰色,并以正常方式进行二值化。

我更喜欢 Java 源代码,但我怀疑任何代码都足够了;

我已经阅读了两个有用的 SO 问题

"Rounding" colour values to the nearest of a small set of colours

HCL color to RGB and backward

它使用 H-C-L 并且可能是一种前进的方式,尽管它们没有直接满足我的要求。

【问题讨论】:

【参考方案1】:

您可以尝试使用region growing。我认为它应该很好地满足您的需求。只需更改相同颜色的阈值即可。我认为它在这里应该可以很好地工作,因为作为对象连接的任何两种颜色之间似乎存在很大差异。

【讨论】:

它可能有用(而且我确实已经种植了区域)但是蓝色中白色的数量有很多变化 - 我真的很想将蓝色二值化为一个独特的操作跨度> 您是否能够将您绝对不想要的所有像素(例如所有全白像素)阈值化?您可以尝试对整个图像上的所有非白色像素进行动态聚类。这会将所有相似的颜色组合在一起,并且应该会自动工作,而无需确定阈值。 我们不能依赖块中的颜色。它可以更细粒度 - 例如抗锯齿字符 即使像素随机分布,kmeans 或聚类方法也可以工作。您甚至可能不必对白色和黑色数据进行阈值处理。您知道要分割出多少种颜色或哪些颜色吗? 没有。我知道可能不多,但我不知道它们是什么。没有美白很容易 - 只需编译一套。但由于它们可能会有所不同,我需要知道如何【参考方案2】:

如果您的直觉是正确的(所有像素都是某种颜色和纯白色的线性混合),在 RGB 立方体中,所有颜色都将在源自白色角的线段上对齐。 p>

如果您为每种不同的颜色选择一个代表像素(尽可能远离白色,以提高准确性),您可以通过找到由该像素、白色和代表形成的最佳对齐方式来识别任何其他像素的颜色像素。

通过计算所形成角度的余弦来测试对齐(使用 3D 向量,余弦是范数乘积上的点积;放弃符号)。理论上余弦应该正好是 1,但由于数值误差它可以更小,所以只考虑使余弦最大化的代表颜色。

特别注意白色像素(到白色角落的距离较短),否则它们将被随机分配到一些代表颜色。

【讨论】:

谢谢。我已经意识到,如果不了解抗锯齿算法,可能就没有确切的答案。我认为白色被添加到基色中,但 H 和 S 都可以变化【参考方案3】:

根据所涉及颜色的数量及其相似性,R、G 和 B 值的简单阈值会迅速将所有颜色减少到 8 种颜色中的一种(黑色、红色、绿色、蓝色、青色、洋红色、黄色、或白色)。

【讨论】:

以上是关于图像中颜色的二值化的主要内容,如果未能解决你的问题,请参考以下文章

二值化

图像的二值化处理的阈值是指啥?求vc下的代码实现!?

如何用C语言实现对图像的二值化?

图像灰度化、二值化理解

解释一下啥是二值化?

OpenCV python图像预处理:二值化 && 滤波操作