我有一张照片:
尺寸为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
}
}
}
是的,时间很重要(这就是为什么我不想让像素超过一百万次)。有什么想法吗?
答案 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,它对我有用。