获得最常用和最“;不同的“;图像中的颜色

本文关键字:图像 颜色 常用 | 更新日期: 2023-09-27 17:59:13

我一直在网上浏览一种算法,该算法可以分析图像并返回最不同和最常用的颜色,但运气不佳。

例如;

如果我在RGB50% 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;
    }
}
  1. 最常用的颜色

    只要在谷歌上搜索一下,你就会发现直方图。如果你想使用色调作为单独的颜色,那么你有256^3颜色。因此,要么使用一些动态列表,要么忽略几个最低有效位来降低数字。还可以通过颜色的标准化来更改动态范围。

    • 黑色就是黑色
    • 并且对于其他一切,将矢量大小更改为Max,例如

      Max = 2^5-1 = 31
      normalized color = color * Max / |color|
      

    现在的算法:

    1. 为的所有颜色组合创建计数器表cnt

      对于CCD_ 8,大小将是CCD_。将整张表设置为零。

      int cnt[32768];
      for (int i=0;i<32768;i++) cnt[i]=0;
      
    2. 浏览整个图像和每个像素的

      • 标准化其颜色
      • 将其转换为地址(例如adr = (R) | (G<<5) | (B<<10)
      • 递增其计数器cnt[adr]++;

    在此之后,cnt[]中有直方图。所以现在按照cnt的值对其进行索引排序,并且您已经获得了按照它们的使用排序的颜色

  2. 大多数不同颜色

    你会如何定义它?我会使用直方图中的数据,并在其中搜索2种颜色之间的max距离(归一化后)

    d = |color1 - color2|
    

    不需要sqrt它。。。如果您使用d^2,您将获得相同的结果。忽略cnt[adr]==0(即未使用的颜色)所在的所有条目。这仍然是O(n^2)。。。更像~T(n*n/2)。。。但CCD_ 20不是图像中的像素数。相反,它只是图像中使用的不同颜色的数量,远远少于。。。同样在索引后对直方图进行排序,并删除/忽略所有CCD_ 21条目甚至情人。