获得最常用和最“;不同的“;图像中的颜色
本文关键字:图像 颜色 常用 | 更新日期: 2023-09-27 17:59:13
我一直在网上浏览一种算法,该算法可以分析图像并返回最不同和最常用的颜色,但运气不佳。
例如;
如果我在RGB
、50% fully blue (0,0,255)
和25% pink (255,0,255)
中有一个25% red (255,0,0)
的位图
我希望算法返回在使用中排序的这三种(或更多,取决于可用的颜色)颜色,因此:
1. Blue
2. Red / Pink
3. Red / Pink
有人知道我该怎么做吗?也许有一些文章可以阅读等等。我从来没有像这样在C#中使用过图像。
如果我正确理解了这个问题,这可能会对你有所帮助(当然你必须根据你的需要阅读数据):
/// <summary>
/// Gets the bitmap image color statistics
/// </summary>
/// <param name="bit">The bitmap image you want to analyze</param>
/// <returns></returns>
public static List<KeyValuePair<Color, int>> GetStatistics(Bitmap bit)
{
Dictionary<Color, int> countDictionary = new Dictionary<Color, int>();
for (int wid = 0; wid < bit.Width; wid++)
{//for every column in the image
for (int he = 0; he < bit.Height; he++)
{//for every row in the image
//Get the color of the pixel reached (i.e. at the current column and row)
Color currentColor = bit.GetPixel(wid, he);
//If a record already exists for this color, set the count, otherwise just set it as 0
int currentCount = (countDictionary.ContainsKey(currentColor) ? countDictionary[currentColor] : 0);
if (currentCount == 0)
{//If this color doesnt already exists in the dictionary, add it
countDictionary.Add(currentColor, 1);
}
else
{//If it exists, increment the value and update it
countDictionary[currentColor] = currentCount + 1;
}
}
}
//order the list from most used to least used before returning
List<KeyValuePair<Color, int>> l = countDictionary.OrderByDescending(o => o.Value).ToList();
return l;
}
}
-
最常用的颜色
只要在谷歌上搜索一下,你就会发现直方图。如果你想使用色调作为单独的颜色,那么你有
256^3
颜色。因此,要么使用一些动态列表,要么忽略几个最低有效位来降低数字。还可以通过颜色的标准化来更改动态范围。- 黑色就是黑色
-
并且对于其他一切,将矢量大小更改为
Max
,例如Max = 2^5-1 = 31 normalized color = color * Max / |color|
现在的算法:
-
为的所有颜色组合创建计数器表
cnt
对于CCD_ 8,大小将是CCD_。将整张表设置为零。
int cnt[32768]; for (int i=0;i<32768;i++) cnt[i]=0;
-
浏览整个图像和每个像素的
- 标准化其颜色
- 将其转换为地址(例如
adr = (R) | (G<<5) | (B<<10)
) - 递增其计数器
cnt[adr]++;
在此之后,
cnt[]
中有直方图。所以现在按照cnt
的值对其进行索引排序,并且您已经获得了按照它们的使用排序的颜色 -
大多数不同颜色
你会如何定义它?我会使用直方图中的数据,并在其中搜索2种颜色之间的
max
距离(归一化后)d = |color1 - color2|
不需要
sqrt
它。。。如果您使用d^2
,您将获得相同的结果。忽略cnt[adr]==0
(即未使用的颜色)所在的所有条目。这仍然是O(n^2)
。。。更像~T(n*n/2)
。。。但CCD_ 20不是图像中的像素数。相反,它只是图像中使用的不同颜色的数量,远远少于。。。同样在索引后对直方图进行排序,并删除/忽略所有CCD_ 21条目甚至情人。