RGB24转RGB256的算法问题

stidio_zhougang 2007-11-11 12:31:53
已经构造了一个调色板,256个颜色
现在要将m*n大小的图形转换为真彩色(RGB24),计算过程大概如下

extern RGBQUAD rgbClrs[256];
UINT WINAPI GetNearestIndex(COLORREF color)
{
UINT index = 0;

int i, diff = 0x7fffffff;
int r,g,b;

for( i = 0; i < 256 && diff ; i++)
{
r = rgbClrs[i].rgbRed - GetRValue(color);
g = rgbClrs[i].rgbGreen - GetGValue(color);
b = rgbClrs[i].rgbBlue - GetBValue(color);

r = r*r + g*g + b*b;

if( r < diff ) { index = i; diff = r; }
}
return index;
}

以上是微软源代码中:GetNearestPaletteIndex的实现(改了一下,以前是传入HPALETTE);
当然r*r + g*g + b*b可以换为 abs(r) + abs(g) + abs(b),效果一样

然后就是遍历m*n这个块,找出所有点的Index,BUT....,太慢太慢太慢了~

转换一个1280*1024的位图,有时候需要转换5~6秒;各位XDJM有什么好算法?
...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
stidio_zhougang 2007-11-28
  • 打赏
  • 举报
回复
呵呵,上上周,我一兄弟(大牛)来我家吃饭,我让他帮我设计了一个算法,解决了这个问题;这两天太忙,就没上来结帖回复
这个巨快无比,并且最大内存占用在全灰阶图的情况下为256*256+256*256+256*256;
大概思路是将RGB,的分量都按照不同统计出来,分为R_Array = {R1, R2, R3..} G_Array = {G1, G2, G3...}...,这些分量记住自己对应索引
然后查表,最后置表,当表中颜色都出现时,就得到了最佳值,当然可能会出现几个,这时候才进行修正就可以了

现在就算对1600*1200的图片,并且每个图片都不同,进行运算,在我机器上(P4,2.8G)也不会超过120ms,已经满足了:)
Tiger_Zhao 2007-11-13
  • 打赏
  • 举报
回复
英雄所见略同。:)
其实交流的多了,就会发现大家的思路总是很接近的;也可以说坏的算法可以有好多,好的算法总是只要那么几种。
tailzhou 2007-11-13
  • 打赏
  • 举报
回复
晕,Tiger_Zhao 已说过了;
tailzhou 2007-11-13
  • 打赏
  • 举报
回复
将24真彩当成整个空间
将256调色板的颜色当成空间中的点;

那么将整个空间分割成多个的小区域,这样每个小区域只需要判断256个中的少数点几个就可以了;
Tiger_Zhao 2007-11-13
  • 打赏
  • 举报
回复
如果是将调色板转换为真彩色,那么直接将调色板的色号作为字典的关键字是可行的。
仔细看了你的代码是要将真彩色转换为调色版色号,直接用真彩色作为字典的关键字的确不行。
不知道你的调色板按照何种规律创建的,如果以r、g、b做为坐标值,真彩色的空间为256*256*256的正方体,那么你的调色板上对应的颜色点必定尽量均匀地分布在该正方体中。如果恰当地将大正方体使得分割成l*l*l块,那么每个块中所有点的最接近调色板颜色点只能有限的几个点。改用分治法,创建一个l*l*l的hashtable,每个元素都是几个调色板色号的集合(一个色号可以出现在多个集合中),那么对一个真彩色的值进行最近判断的颜色数就从256下降到个位数了。
Tiger_Zhao 2007-11-12
  • 打赏
  • 举报
回复
调色板中一个256个颜色,对这256个RGB24预选求得RGB256,图片中的点只要查表就可以了。
stidio_zhougang 2007-11-12
  • 打赏
  • 举报
回复
TO:Tiger_Zhao
好兄弟呀,就你理我~
空间换时间的方法我当初也想过,当初就是想到如果N值较大,空间占用的问题
兄弟有相类似的优化算法不?
Tiger_Zhao 2007-11-12
  • 打赏
  • 举报
回复
无论你原图多大,其颜色数总有一个定值N,将这N种颜色做成字典可以快速查找RGB256。
如果N比较小,一次性构建整个字典,如果N比较大,可以边查找边添加,无论如何调用转换函数的次数不超过N次。
stidio_zhougang 2007-11-12
  • 打赏
  • 举报
回复
不行呀,我现在只能用固定调色板,想了几天了,就是想不出一个精妙的方法来~

33,008

社区成员

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

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