颜色匹配算法求解!!!(急)

yb_yb 2002-04-08 06:43:47
我这里有一个标准的256色颜色表,我想给出一个任意的RGB结构的数据,怎样求出与之匹配的索引?
方法有:1近似法
2抖动法
...全文
210 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT_worker 2002-04-12
  • 打赏
  • 举报
回复
不知道你是否看懂了我的思路。
可能你没有看懂,我这里介绍一下我的思路的背景吧。
在做GIS系统的时候,一个比较重要的功能就是空间查询。说得明白一点:
假设系统中有n个对象(n非常大)每个对象都看成一个矩形。假如在平面上选取一个点要求快速查找出所有包含这个点的矩形(算法复杂度为O(log(n))。
要实现快速查找的功能就必须建立空间索引。各个GIS生产商都有它们的R树索引。这里最简单(可能也是最烂)的索引就是4叉树索引。
你的颜色匹配要求就是3维的点索引。而我的索引设计就是在4叉树索引的基础上改进出来的。因为你的数据太少了(才256)索引效果可能不明显,但是精心安排索引还是可以保证的是比简单的 遍历一遍所有数据 要快8倍
yb_yb 2002-04-10
  • 打赏
  • 举报
回复
这是我用的颜色表,它是先是16色,再灰度级,再是一般的颜色定义。怎么样才能找到一种好的方法实现颜色匹配。


U8 ColorTable[256][3]=
{
{ 0, 0, 0},{ 0, 0,168},{ 0,168, 0},{ 0,168,168},
{168, 0, 0},{168, 0,168},{168, 84, 0},{168,168,168},
{ 84, 84, 84},{ 84, 84,255},{ 84,255, 84},{ 84,255,255},
{255, 84, 84},{255, 84,255},{255,255, 84},{255,255,255},


{ 12, 12, 12},{ 25, 25, 25},{ 38, 38, 38},{ 52, 52, 52},
{ 66, 66, 66},{ 97, 97, 97},{114,114,114},{128,128,128},
{150,150,150},{192,192,192},{210,210,210},{232,232,232},


{ 0, 0, 77},{ 0, 0,255},{ 0, 19, 0},{ 0, 19, 77},
{ 0, 19,162},{ 0, 19,255},{ 0, 39, 0},{ 0, 39, 77},
{ 0, 39,162},{ 0, 39,255},{ 0, 62, 0},{ 0, 62, 77},
{ 0, 62,162},{ 0, 62,255},{ 0, 87, 0},{ 0, 87, 77},
{ 0, 87,162},{ 0, 87,255},{ 0,115, 0},{ 0,115, 77},
{ 0,115,162},{ 0,115,255},{ 0,145, 0},{ 0,145, 77},
{ 0,145,162},{ 0,145,255},{ 0,178, 0},{ 0,178, 77},
{ 0,178,255},{ 0,215, 0},{ 0,215, 77},{ 0,215,162},
{ 0,215,255},{ 0,255, 0},{ 0,255, 77},{ 0,255,162},
{ 0,255,255},


{ 42, 0, 0},{ 42, 0, 77},{ 42, 0,162},
{ 42, 0,255},{ 42, 19, 0},{ 42, 19, 77},{ 42, 19,162},
{ 42, 19,255},{ 42, 39, 77},{ 42, 39,162},{ 42, 39,255},
{ 42, 62, 0},{ 42, 62, 77},{ 42, 62,162},{ 42, 62,255},
{ 42, 87, 0},{ 42, 87, 77},{ 42, 87,162},{ 42, 87,255},
{ 42,115, 0},{ 42,115, 77},{ 42,115,162},{ 42,115,255},
{ 42,145, 0},{ 42,145, 77},{ 42,145,162},{ 42,145,255},
{ 42,178, 0},{ 42,178, 77},{ 42,178,162},{ 42,178,255},
{ 42,215, 0},{ 42,215, 77},{ 42,215,162},{ 42,215,255},
{ 42,255, 0},{ 42,255, 77},{ 42,255,162},{ 42,255,255},


{ 88, 0, 0},{ 88, 0, 77},{ 88, 0,162},{ 88, 0,255},
{ 88, 19, 0},{ 88, 19, 77},{ 88, 19,162},{ 88, 19,255},
{ 88, 39, 0},{ 88, 39, 77},{ 88, 39,162},{ 88, 39,255},
{ 88, 62, 0},{ 88, 62, 77},{ 88, 62,162},{ 88, 62,255},
{ 88, 87, 0},{ 88, 87,162},{ 88,115, 0},{ 88,115, 77},
{ 88,115,162},{ 88,115,255},{ 88,145, 0},{ 88,145, 77},
{ 88,145,162},{ 88,145,255},{ 88,178, 0},{ 88,178, 77},
{ 88,178,162},{ 88,178,255},{ 88,215, 0},{ 88,215, 77},
{ 88,215,162},{ 88,215,255},{ 88,255, 0},{ 88,255,162},


{138, 0, 0},{138, 0, 77},{138, 0,162},{138, 0,255},
{138, 19, 0},{138, 19, 77},{138, 19,162},{138, 19,255},
{138, 39, 0},{138, 39, 77},{138, 39,162},{138, 39,255},
{138, 62, 0},{138, 62, 77},{138, 62,162},{138, 62,255},
{138, 87, 0},{138, 87, 77},{138, 87,162},{138, 87,255},
{138,115, 0},{138,115, 77},{138,115,162},{138,115,255},
{138,145, 0},{138,145, 77},{138,145,162},{138,145,255},
{138,178, 0},{138,178, 77},{138,178,162},{138,178,255},
{138,215, 0},{138,215, 77},{138,215,162},{138,215,255},
{138,255, 0},{138,255, 77},{138,255,162},{138,255,255},


{194, 0, 0},{194, 0, 77},{194, 0,162},{194, 0,255},
{194, 19, 0},{194, 19, 77},{194, 19,162},{194, 19,255},
{194, 39, 0},{194, 39, 77},{194, 39,162},{194, 39,255},
{194, 62, 0},{194, 62, 77},{194, 62,162},{194, 62,255},
{194, 87, 0},{194, 87, 77},{194, 87,162},{194, 87,255},
{194,115, 0},{194,115, 77},{194,115,162},{194,115,255},
{194,145, 0},{194,145, 77},{194,145,162},{194,145,255},
{194,178, 0},{194,178, 77},{194,178,162},{194,178,255},
{194,215, 0},{194,215, 77},{194,215,162},{194,215,255},
{194,255, 0},{194,255, 77},{194,255,162},{194,255,255},


{255, 0, 0},{255, 0, 77},{255, 0,162},{255, 0,255},
{255, 19, 0},{255, 19, 77},{255, 19,162},{255, 19,255},
{255, 39, 0},{255, 39, 77},{255, 39,162},{255, 39,255},
{255, 62, 0},{255, 62, 77},{255, 62,162},{255, 62,255},
{255, 87, 0},{255, 87,162},{255,115, 0},{255,115, 77},
{255,115,162},{255,115,255},{255,145, 0},{255,145, 77},
{255,145,162},{255,145,255},{255,178, 0},{255,178, 77},
{255,178,162},{255,178,255},{255,215, 0},{255,215, 77},
{255,215,162},{255,215,255},{255,255, 0},{255,255,162},
};
IT_worker 2002-04-10
  • 打赏
  • 举报
回复
我想你可以给你的256标准色做一个索引。我设计一个索引如下,不知道能否用得着。
为了讨论方便假设RGB的取值范围都为[0,1];
那么将标准色中所有R<2/3的颜色放入子索引a中,所有R>1/3的颜色放入子索引b中。注意a,b中可能有颜色相同。
假如现在有一种颜色rgb其中r<1/2那么我们到a中找到与它最近的颜色。如果最近颜色与他的距离<2/3-r那么我们可以断定b中不会找到距离更近的颜色了。如果不幸找到的最近距离>2/3-r那么只好到b中找距离最近的颜色了,二者取其小的。
说明:我的距离定义为:max( |r1-r2|,|g1-g2|,|b1-b2| )
我前面说的在a中找最近颜色是指过一遍所有a中的颜色。如果a中的颜色还是太多,那么就要将a继续分成2块,不过这次不能在R这维分了。
总之通过分块的方法缩小过一遍颜色的个数。
为什么:
为什么我按[0,2/3],[1/3,1]这种方式而不是[0,1/2],[1/2,1]这种方式分块呢?应为我考虑当x接近于1/2的时候第二种分块方式在很大概率上要去查找两个块,这就损失了索引的意义。
yb_yb 2002-04-09
  • 打赏
  • 举报
回复
cplusc(5i海洋)你的这种算法我也想到了,但是每次执行时运算量太大,知道我是用单片机中的,要是经常对颜色操作,效率不高。还有就是不能找到每种颜色的渐变色。谢谢你给的帮助。我会给分的。

不知道那们还有更好一点的办法,最好能用抖动算法。那样就没有主颜色差之说了。
cplusc 2002-04-08
  • 打赏
  • 举报
回复
我也不知道这是什么算法, 效果还可以, 时间太紧,没加注视

typedef struct RGBTag
{
int R,G,B
};

RGBTag Pal[256];

int FindNearest( int R,G,B)
{
int D=999999, P, Best;
int i;

for (i = 0; i < 255; i++)
{
P = ( R-Pal[i].R) *( R-Pal[i].R) + ( G-Pal[i].G) *( G-Pal[i].G) + ( B-Pal[i].B) *( B-Pal[i].B)
if ( P < D )
{
D = P;
Best = i;
}
}
return(Best);
}
youwill 2002-04-08
  • 打赏
  • 举报
回复
256色, not many colors, 给出与之匹配Table , scan table every time.
挺拔的劲松 2002-04-08
  • 打赏
  • 举报
回复
gz

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧