我们都知道标记为 RED (0xFFFF0000)的最简单的方法是猩红色和深红色都通过HSB / HSV颜色空间。
但是我必须在小型设备上处理大图像,因此这种操作(转换和比较阈值)需要太多的计算时间。
您知道是否可以使用RGB值执行相同的操作(仅比较此情况下的阈值)?
如果(我希望)答案是肯定的,我想知道"标准"以下颜色的阈值:
因为这些是理论上应该在图像中的唯一颜色。
感谢。
答案 0 :(得分:0)
您可以使用HSV公式或转换表从RGB和中获取HSV值 然后使用转换后的值作为阈值:
http://www.rapidtables.com/convert/color/rgb-to-hsv.htm
编辑:也许我再次失踪,但我会给出一个机会。
由于其RGB颜色空间,您可以使用上/下边界。 因此,您需要针对指定的投射值测试每个像素通道:
[Lr,Lg,Lb]< = pixel< = [Ur,Ug,Ub]
对于红色,可能是:
[128,0,0]< = pixel< = [255,0,0]
此外,您可以添加测试所有像素通道是否相等的可能性(对于某些灰度像素)。 因此,保持上/下边界的一些结构应如下所示:
struct test_color_stru
{
Byte up[3];
Byte low[3];
bool cheq;
};
您可以创建一个包含所有所需测试颜色的结构数组。 用于测试图像值的一些类C代码应如下所示:
bool match[test_color.count];
for (int i = 0; i < img.hegith; i++)
{
for (int j = 0; j < img.width; j++)
{
for (int k = 0; k < test_color.count; k++)
{
match[k] = true;
for (int n = 0; n < 3; n++)
{
match[k] &= (test_color[k].low[n] <= img.pixel.ch[n] && img.pixel.ch[n] <= test_color[k].up[n]);
if (test_color.cheq && n > 0)
match[k] &= (img.pixel.ch[n] == img.pixel.ch[n-1];
}
if (match[k])
cast_color() // or something you want to do with image pixel
}
}
}
对于一个通道值空闲(在某些u / l范围内)并且其他通道值必须相等(再次在某些u / l范围内)的情况,它不起作用。
答案 1 :(得分:0)
我认为您可以在每个RGB轴上使用50%的简单阈值,这将为您提供8种可能的结果之一。而不是运行倾向于停止处理器的if
语句,您可能会发现只需执行一些简单的数学和查找就可以更快。
所以,基本上,我们想确定Red是多于还是少于128,如果Green大于或小于128并且Blue ss多于或少于128.向右移动7个位置将给我们每个人的MSB并告诉我们。如果我们采用红色,绿色和蓝色的MSB并将它们变成3位数字,我们可以在表格中查找答案。
具体而言,计算:
index= ((R>>5)&4) | ((G>>6)&2) | ((B>>7)&1)
我们现在有一个带有以下位的8位数字:
0 0 0 0 0 R G B
如果您按如下方式预先计算静态表:
RGB[0]=Black
RGB[1]=Blue
RGB[2]=Green
RGB[3]=Cyan
RGB[4]=Red
RGB[5]=Magenta
RGB[6]=Yellow
RGB[7]=White
然后你的回答将是
RGB[index]