【问题标题】:Getting Hue from every pixel in an Image从图像中的每个像素获取色调
【发布时间】:2012-05-07 02:57:39
【问题描述】:

我正在尝试获取图像每个像素的色调或“H”,然后更改具有特定色调的像素的颜色。我正在尝试更改色调 >= 210 和

这是我的代码:

// 'i' is the image
// 'b' is the bitmap of the image
float y;
for (int a = 0; a < i.Height; a++) 
{ 
    for (int c = 0; c < i.Width; c++) 
    { 
        y = b.GetPixel(c, a).GetHue(); 
        if (y >= 210 && y <= 260) 
            { 
                b.SetPixel(c, a, Color.Black); 
            } 
    } 
}

唯一的问题是它不会拾取任何蓝色,范围是 210 - 260。我很确定我这样做是正确的,但我一定不是,因为它不起作用。

如果你能解决这个问题,请在这里发帖,谢谢!

编辑:我在 SetPixel 上设置了一个断点,它被调用了很多次,所以现在我将检查我是否正确保存了图片。

编辑 2:我想通了!我没有保存图片。

【问题讨论】:

  • 您应该使用调试器:找出未检测到哪个像素,设置断点并查看为什么它没有通过您的测试。
  • 我可以对这个范围有点怀疑,至少用纯蓝色 (225) 测试一下。更可能的问题是保存结果的代码。
  • 是的,照 Vlad 说的做,在b.SetPixel(c, a, Color.Black); 上设置一个断点,看看它是否会被调用。顺便说一句,xy 可能是坐标 acfloat y 的更好名称,可能是 float hue,更具可读性。

标签: c# image image-processing colors


【解决方案1】:

这对我很有用。在下面的代码中,我有一个名为 imgViwer 的带有 PictureBox 的 Windows 窗体。然后点击我执行代码的按钮:

private void HueFilter()
{
  float y;
  Bitmap i = (Bitmap)imgViwer.Image;

  for (int a = 0; a < i.Height; a++)
  {
      for (int c = 0; c < i.Width; c++)
      {                   
          y = i.GetPixel(c, a).GetHue();
          if (y >= 210 && y <= 260)
          {
              i.SetPixel(c, a, Color.Black);
          }
      }
  }

  imgViwer.Image = i;
}

在您的情况下,您有一个名为 b 的输出图像,应将其分配回 PictureBox 以进行刷新。

【讨论】:

    【解决方案2】:

    使用,LockBits 方法,卢克!

    或者,我认为,最好使用图形上下文。

    【讨论】:

    • +1 是的,您会看到 LockBits 的性能大幅提升
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 2013-07-21
    • 2019-07-27
    • 2014-12-06
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多