我想设计一个程序,可以帮助我评估5种预定义的颜色中,哪一种更类似于可变颜色,以及百分比。问题是,我不知道如何一步一步地手动完成。所以想出一个程序就更难了。
更多细节:颜色来自不同颜色的管与凝胶的照片。我有5个不同颜色的管子,每个都代表5个级别中的1个。我想拍摄其他样本的照片,并在计算机上通过比较颜色来评估该样本属于哪个级别,我也想知道近似值的百分比。我想要一个这样的程序:http://www.colortools.net/color_matcher.html
如果你能告诉我要采取什么步骤,即使这些是我需要手动思考和做的事情。这将是非常有用的。
发布于 2012-01-26 20:33:02
这只是我第一次想到的一个想法(如果愚蠢的话,很抱歉)。颜色的三个分量可以假设为点的三维坐标,然后您可以计算点之间的距离。
F.E.
Point1 has R1 G1 B1
Point2 has R2 G2 B2
颜色之间的距离是
d=sqrt((r2-r1)^2+(g2-g1)^2+(b2-b1)^2)
百分比为
p=d/sqrt((255)^2+(255)^2+(255)^2)
发布于 2012-02-01 03:19:01
实际上,几个月前我也走过同样的路。这个问题没有完美的答案(被here问了几次),但有一个比sqrt(r-r)等答案更复杂,更容易用RGB直接实现,而不是转移到所有种类的交替色彩空间。我找到了这个公式here,它是相当复杂的真实formula的低成本近似值(通过CIE,这是颜色的W3C,因为这是一个未完成的探索,你可以在那里找到更旧和更简单的色差方程)。祝好运。
编辑:对于后人,以下是相关的C代码:
typedef struct {
unsigned char r, g, b;
} RGB;
double ColourDistance(RGB e1, RGB e2)
{
long rmean = ( (long)e1.r + (long)e2.r ) / 2;
long r = (long)e1.r - (long)e2.r;
long g = (long)e1.g - (long)e2.g;
long b = (long)e1.b - (long)e2.b;
return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
发布于 2012-01-26 20:28:57
如果您有两个Color
对象c1
和c2
,则可以将c1
的每个RGB值与c2
的RGB值进行比较。
int diffRed = Math.abs(c1.getRed() - c2.getRed());
int diffGreen = Math.abs(c1.getGreen() - c2.getGreen());
int diffBlue = Math.abs(c1.getBlue() - c2.getBlue());
这些值可以除以差值饱和度(255),就可以得到两者之间的差值。
float pctDiffRed = (float)diffRed / 255;
float pctDiffGreen = (float)diffGreen / 255;
float pctDiffBlue = (float)diffBlue / 255;
然后你就可以找到平均色差的百分比了。
(pctDiffRed + pctDiffGreen + pctDiffBlue) / 3 * 100
这会给出c1
和c2
之间的百分比差异。
https://stackoverflow.com/questions/9018016
复制相似问题