【问题标题】:Finding maximum amount of approximately same number c#找到大约相同数字的最大数量c#
【发布时间】:2016-03-27 06:24:40
【问题描述】:

我正在从位图图像中获取 RGB 颜色列表。现在我想分开 ma​​ximum 'approximate' 相同的数字。

245, 230,230 235, 230, 230 应该被认为是相同的(最大差异为 5)。

我成功地提取了相同的数字,并且显然也知道如何找到一个数字中的最大值,但无法弄清楚如何告诉算法将 10-30 的差异视为相同的数字。

这是我的代码:

for (int x = 0; x < bmp.Width; x++)
{
   for (int y = 0; y < bmp.Height; y++)
   {
      if (y < bmp.Height && y > 0)
      {
         c = bmp.GetPixel(x, y);
         if (db.Contains(c.R.ToString() + " " + c.G.ToString() + " " + c.B.ToString()) == false)
         {
            if (i == 0)
            {                   
               db.Add(c.R.ToString() + " " + c.G.ToString() + " " + c.B.ToString());
            }
         }
         else
            i++;
      }
   }
}

foreach (string dbs in db)
   richTextBox1.Text = richTextBox1.Text + dbs+Environment.NewLine;

//same amount of numbers not written above are:
richTextBox1.Text = richTextBox1.Text + i.ToString()+ Environment.NewLine;

【问题讨论】:

  • 为什么要转成字符串?如果你没有把它转换成字符串,你可以比较它的 RGB 值。
  • 你能举出更多可以被认为相同或不同的数字的例子吗?
  • 它不仅仅是关于 RGB 或字符串或其他什么......只是如何将近似值视为单个值!
  • 245, 230,230 和 235, 230, 230,相差 10 对吗?如果我错了,请纠正我。
  • 这可能会导致一个大问题。例如 (245, 230, 230) 等于 (215, 230, 230),(215, 230, 230) 也等于 (185, 230, 230),但 (245, 230, 230) 不是等于 (185, 230, 230)。你如何解决这个逻辑问题?

标签: c# algorithm sorting bitmap


【解决方案1】:

看来你需要一些像这个伪代码这样的公式:

bSameColors(pixel a, pixel b, uint threshold) = 
  (Max(Abs(a.R - b.R), Max(Abs(a.G - b.G), Abs(a.B - b.B))) < threshold)

但是如果要进行一些颜色聚类,可以考虑与聚类的平均颜色值进行比较

【讨论】:

    【解决方案2】:

    物体之间的距离可以通过多种方式计算:

  • euclid 距离 sqrt( (r1-r2)^2 + (g1-g2)^2 +(b1-b2)^2 ) 将是描述接近度的方式 (^ == pow )。小于 10 的差异将是一个半径为 10 的球体,它将包围第二个点。

  • 曼哈顿距离abs(r1-r2) + abs(b1-b2) + abs(g1-g2)。这将是绕曼哈顿行驶,并采用网格系统,即任何方向不超过 10 个街区。

  • 如果只是单个组件很重要,那么它们是相同的,如果:abs(r1-r2) &lt; 10 AND abs(g1-g2) &lt; 10 AND abs(b1-b2) &lt; 10

  • 对于颜色,相似颜色最好在替代颜色空间中定义(例如wikipedia lab colour space

    这些已针对人眼进行了调整,这些空间的接近值将计算为相似的 LAB/XYZ 值。对于 RGB,一些“相似”的值看起来完全不同。

  • 【讨论】:

      【解决方案3】:

      对于图像中的每个像素,计算与其 RGB 颜色值“接近”(或“大致相同”)的像素数。然后找到具有最大“接近”像素数的像素。

      复杂度 O(n^2) 其中 n 是图像中的像素总数 (n=w*h)

      【讨论】:

        猜你喜欢
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        相关资源
        最近更新 更多