C#扫描某个块的图像

时间:2011-07-21 03:58:53

标签: c# image pixel

我有一张照片:

尺寸为1000x1000白色,带有随机黑点。 (它可能包含黑色正方形(大小为50x50))

有没有一种简单的方法可以知道图片是否包含黑色正方形(尺寸为50x50)?我想扫描图片的每个像素,如果找到一个黑色像素,扫描他旁边的那个,直到我得到一个50x50的方格,或者直到我得到一个白色像素并继续扫描。但它必须扫描超过一百万像素(如果他没有找到方块)。

这基本上就是代码(不需要完成它,正如我之前所说的,扫描它需要花费太多时间。如果整个图片是白色的话会有百万次,而根据黑色像素的数量会更多。)

        for (int i = 0; i < pic.Width; i++)
        {
            for (int j = 0; j < pic.Height; j++)
            {
                if (pic.GetPixel(i, j) == Color.Black)
                {
                    //Search for the entire square at that area
                }
            }
        }

是的,时间很重要(这就是为什么我不想让像素超过一百万次)。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

Boyer-Moore string searching algorithm一样,如果您正在查看的项目不是您要查找的项目的一部分,则可以跳过您要查找的内容的全部大小。在您的情况下,您可以检查给定像素是否为黑色。如果不是,您可以向前跳过50像素。如果是,你有一个小盒子来寻找你的黑色方块。

在这种情况下,您可能不需要任何复杂的东西。我猜你的算法太慢了,因为你要调用GetPixel函数一百万次,而 是慢的部分。如果您可以将像素放入2D数组中,那么您的算法可能会非常快,不需要重写。

假设您正在使用System.Drawing.Bitmap检查LockBits documentation,以查看包含将位图复制到1D阵列以进行超快速访问的小样本。

答案 1 :(得分:2)

如果您只是寻找特定尺寸的正方形,那么您可以通过仅扫描像素的每50行(或列)来优化这一点,从而大幅减少工作量。

理论上,您只需要检查每50x50块中1个像素的黑/白。如果它是黑色的,那么你尝试从那里传播,如果它是白色然后只是跳到下一个块:显然这个块中有一个白色像素,所以这里没有黑盒子。在此之后,您已经将工作量削减到原来的1/2500,现在只需要检查400像素。

通常,最好的优化,特别是在第一次设计算法时,就是减少完成工作而不是更有效地完成工作。尝试考虑创造性的方法,将输入减少到更易于管理的大小。

答案 2 :(得分:1)

查看AForge.net框架套件。它具有Blob和模式搜索的成像库。您也可以搜索形状。免费。

您可以在http://www.aforgenet.com/framework/

找到它

以下是列出功能的链接

http://www.aforgenet.com/framework/features

修改

以下是形状检查的示例。我在原型中使用了Aforge,它对我有用。

http://www.aforgenet.com/articles/shape_checker/