【问题标题】:Find a color's pixel coordinates查找颜色的像素坐标
【发布时间】:2012-05-08 01:48:11
【问题描述】:

我正在 Visual Studio C# 中制作一个可以检测颜色的程序,然后找到具有该颜色的像素的 x、y 坐标。我做过研究,但我能找到的只是你已经给出了坐标,它会感知颜色,但这不是我想要的,我想给出颜色,它会找到坐标。有人知道怎么做吗?谢谢

【问题讨论】:

  • 你打算怎么给颜色 RGB 或只是一个颜色蓝色?
  • 最有可能是 RGB,但我不太确定它的功能是什么……这就是我要的。
  • 您在哪里可以找到这些信息?显然,您应该遍历所有 x 和 y,测试它们是否是您所寻找的颜色。

标签: c# image-processing rgb pixels argb


【解决方案1】:

您可以将图像提供给 Bitmap 对象,然后调用 getPixel(x, y) 方法来获取特定点的像素。由于 Bitmap 对象具有图像的尺寸,因此您可以遍历每个像素(YIKES!),测试与所需颜色的匹配。 getPixel() 返回一个 Color 对象,您可以使用它。这是我超级快速完成的事情。 pictureBox1 是我表单上的一个 PictureBox 元素。

Bitmap b = new Bitmap(pictureBox1.Image);
Color c = b.GetPixel(0,0);

但请记住,搜索匹配像素是最糟糕的情况 O(n),其中 n 是图像中的像素数。对于小型和中型图片,这还不算太糟糕,但对于大型图片,您可能会注意到您的程序挂起。

【讨论】:

  • 为了提高性能,您可以尝试将搜索分成多个段并搜索更小的段。
【解决方案2】:

你可以按照@kevin628 所说的做,但是添加一个for 语句,所以它会像这样搜索每个像素:

    private void GetPixels()
    {
        Bitmap b = new Bitmap(pictureBox1.Image);

        List<Color> colorList = new List<Color>
        {

        };

        for (int y = 0; y < b.Height; y++)
        {
            for (int x = 0; x < b.Width; x++)
            {
                colorList.Add(b.GetPixel(x, y));
            }
        }
    }

然后使用this image,你会得到这样的东西(不是整个这个,因为它大约有 50000 行):

颜色 [A=255, R=247, G=240, B=136]
颜色 [A=255, R=252, G=247, B=155]
颜色 [A=255, R=242, G=238, B=164]
颜色 [A=255, R=79, G=124, B=103]
颜色 [A=255, R=79, G=124, B=103]
颜色 [A=255, R=0, G=42, B=17]
颜色 [A=255, R=16, G=104, B=90]
颜色 [A=255, R=15, G=114, B=109]
颜色 [A=255, R=33, G=125, B=124]
颜色 [A=255, R=11, G=83, B=80]
颜色 [A=255, R=36, G=72, B=68]
颜色 [A=255, R=151, G=156, B=150]
颜色 [A=255, R=90, G=70, B=59]
颜色 [A=255, R=147, G=109, B=88]
颜色 [A=255, R=252, G=204, B=164]
颜色 [A=255, R=220, G=175, B=134]
颜色 [A=255, R=219, G=187, B=162]
颜色 [A=255, R=126, G=104, B=91]
颜色 [A=255, R=108, G=94, B=93]
颜色 [A=255, R=241, G=235, B=239]
颜色 [A=255, R=139, G=137, B=142]
颜色 [A=255, R=83, G=92, B=101]
颜色 [A=255, R=146, G=172, B=187]
颜色 [A=255, R=17, G=62, B=85]
颜色 [A=255, R=40, G=106, B=138]
颜色 [A=255, R=33, G=116, B=146]
颜色 [A=255, R=5, G=96, B=117]
颜色 [A=255, R=0, G=79, B=84]
颜色 [A=255, R=6, G=94, B=80]
颜色 [A=255, R=27, G=114, B=98]
颜色 [A=255, R=40, G=130, B=131]
颜色 [A=255, R=19, G=116, B=125]
颜色 [A=255, R=21, G=128, B=134]
颜色 [A=255, R=5, G=119, B=120]
颜色 [A=255, R=8, G=120, B=121]
颜色 [A=255, R=11, G=107, B=105]
颜色 [A=255, R=46, G=113, B=106]
颜色 [A=255, R=21, G=70, B=49]
颜色 [A=255, R=45, G=123, B=99]

然后要测试颜色,只需执行以下操作:

for (int i = 0; i < colorList.Count; i++)
{
    Color c = Color.Black;

    if (c == colorList[i])
    {
        //do something
    }
}

【讨论】:

    【解决方案3】:

    1) 将纹理加载为字节数组。例如,如果您的纹理是 2x2 大小, 它应该看起来像: 000111222333 在哪里: 000 - (0,0) 处的 RGB 111 - (1,0) 处的 RGB 222 - (0,1) 处的 RGB 333 - (1,1) 处的 RGB 000 或 111 表示它有 3 个字节,其中 每个字节是红色、绿色或蓝色。 一旦你这样做了,你就可以遍历所有的 x 和 y, 并检查当前位置的颜色是否与您搜索的颜色匹配。

    【讨论】:

      【解决方案4】:

      您可以使用您已经找到的方法。检查每个坐标处的每个像素以找到与用户输入的颜色相同的颜色。从 0、0 开始。然后递增 X 值,直到它位于像素行的末尾。每次 X 值位于行尾时,增加 Y 值并将 X 重置为 0。一旦获得与用户输入的颜色值相等的颜色值,最后使用的 X 和 Y 坐标在找到匹配项之前将返回给用户的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        相关资源
        最近更新 更多