图像中颜色的二值化
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 种颜色中的一种(黑色、红色、绿色、蓝色、青色、洋红色、黄色、或白色)。
【讨论】:
以上是关于图像中颜色的二值化的主要内容,如果未能解决你的问题,请参考以下文章