如何将像素的RGB值转换为单色值?
如何将像素的RGB值转换为单色值?
我在颜色常见问题解答中找到了一个可能的解决方案。 CIE XYZ系统的亮度分量Y在一个通道中捕捉到人类感知的大部分颜色。因此,使用这些系数:
mono = (0.2125 * color.r) + (0.7154 * color.g) + (0.0721 * color.b);
Y = pow(color.r, 2.2) * 0.2126 + pow(color.g, 2.2) * 0.7152 + pow(color.b, 2.2) * 0.0722;
是使其快速、简单地工作的方法。 - Myndex这篇 MSDN 文章 使用了 (0.299 * color.R + 0.587 * color.G + 0.114 * color.B);
这篇维基百科文章 使用了 (0.3* color.R + 0.59 * color.G + 0.11 * color.B);
如前所述,从RGB三元组进行灰度翻译(请注意单色图像不需为灰度)取决于个人喜好。
例如,您可以采用欺骗性的方法,只提取蓝色分量,将红色和绿色部分丢弃,并在它们的位置上复制蓝色值。另一种简单且通常可行的解决方案是取RGB三元组的平均值,并在所有三个组件中使用该值。
事实上,Photoshop专业的非常昂贵的灰度/单色转换插件市场的存在,说明转换的复杂程度可以随意选择。
(R+G+B) / 3 ....
就可以解决问题,而且速度相当快(尤其是在嵌入式系统上工作时)。 - Shlomi Hassid原始彩色图片。
使用k-means聚类算法转换为单色图像后这是如何工作的?
收集整个图像的所有像素值。对于一个宽度为W像素,高度为H像素的图像,您将获得W*H个颜色值。现在,使用k-means算法创建2个簇(或箱子),并将颜色放入相应的“箱子”中。这2个簇代表黑白色调。
Youtube视频演示使用k-means进行图像分割? https://www.youtube.com/watch?v=yR7k19YBqiw
此方法的挑战
k-means聚类算法容易受到异常值的影响。一些随机像素的颜色与其余像素的RGB距离相差很大,可能会轻易地扭曲质心以产生意外结果。
// Andy's Easy Greyscale in one line.
// Send it sR sG sB channels as 8 bit ints, and
// it returns three channels sRgrey sGgrey sBgrey
// as 8 bit ints that display glorious grey.
sRgrey = sGgrey = sBgrey = Math.min(Math.pow((Math.pow(sR/255.0,2.2)*0.2126+Math.pow(sG/255.0,2.2)*0.7152+Math.pow(sB/255.0,2.2)*0.0722),0.454545)*255),255);
就是这样。除非你需要解析十六进制字符串....