全,
我有一个基本的问题,我正在努力解决这个问题。当您查看WWDC 2010中的findmyicone示例代码时,您将看到:
static const uint8_t orangeColor[] = {255, 127, 0};
uint8_t referenceColor[3];
// Remove luminance
static inline void normalize( const uint8_t colorIn[], uint8_t colorOut[] ) {
// Dot product
int sum = 0;
for (int i = 0; i < 3; i++)
sum += colorIn[i] / 3;
for (int j = 0; j < 3; j++)
colorOut[j] = (float) ((colorIn[j] / (float) sum) * 255);
}
然后它被称为:
normalize(orangeColor, referenceColor);
运行调试器时,它将BGRA:(红色255,绿色127,蓝色0)转换为(红色0,绿色255,蓝色0)。我在网上查找了亮度和点积的详细信息,但真的没有任何信息。
1-有人能指导我这个函数是做什么的吗?
2-你能在网上引导我找到一些有用的主题/入门吗?
再次感谢九巴
发布于 2012-10-12 04:16:00
他们试图做的是跟踪特定颜色的亮度变化,因此他们对颜色的亮度进行归一化。我在a color tracking example based on a GPU Gems paper from Apple中使用的片段着色器以及我的GPUImage框架中的ColorObjectTracking示例应用程序中执行了类似的操作:
vec3 normalizeColor(vec3 color)
{
return color / max(dot(color, vec3(1.0/3.0)), 0.3);
}
vec4 maskPixel(vec3 pixelColor, vec3 maskColor)
{
float d;
vec4 calculatedColor;
// Compute distance between current pixel color and reference color
d = distance(normalizeColor(pixelColor), normalizeColor(maskColor));
// If color difference is larger than threshold, return black.
calculatedColor = (d > threshold) ? vec4(0.0) : vec4(1.0);
//Multiply color by texture
return calculatedColor;
}
上面的计算通过将每个通道乘以1/3,然后对它们求和(这就是点积的作用),取三个颜色分量的平均值。然后,它将每个颜色通道除以该平均值,以得到归一化颜色。
计算该归一化颜色与目标颜色之间的距离,如果该距离在某个阈值内,则将该像素标记为该颜色。
这只是确定一种颜色与另一种颜色接近程度的一种方法。另一种方法是将RGB值转换为Y、Cr和Cb (Y、U和V)分量,然后仅取色度部分(Cr和Cb)之间的距离:
vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);
float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b;
float maskCr = 0.7132 * (colorToReplace.r - maskY);
float maskCb = 0.5647 * (colorToReplace.b - maskY);
float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b;
float Cr = 0.7132 * (textureColor.r - Y);
float Cb = 0.5647 * (textureColor.b - Y);
float blendValue = 1.0 - smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb)));
这段代码是我在色度键控着色器中使用的,它基于Apple在他们的一个示例应用程序中使用的类似计算。哪一个是最好的取决于你所面临的特定情况。
https://stackoverflow.com/questions/12825041
复制相似问题