C#扫描特定 block 的图像

标签 c# image pixel

我有一张照片:

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

有没有一种简单的方法可以知道图片是否包含黑色方 block (尺寸 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
                }
            }
        }

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

最佳答案

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

不过,在这种情况下,您可能不需要这么复杂的东西。我猜如果您的算法太慢,那是因为您调用了 GetPixel 函数一百万次,而是最慢的部分。如果您可以将像素放入二维数组,您的算法可能会运行得足够快,不需要重写。

假设您使用的是 System.Drawing.Bitmap 查看 LockBits documentation查看一个小示例,其中包括将位图复制到一维数组以实现超快速访问。

关于C#扫描特定 block 的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6771110/

相关文章:

c# - Windows 窗体应用程序数据库

c# - 将 JSON 的一部分替换为其他(使用字符串 token )

c++ - OpenCV : algorithm for simple image rotation and reduction

android - 如何向 Canvas/paintText 添加自动换行符

python - 在 ubuntu 上使用 pyodbc 在 SQL Server 上插入图像字段

floating-point - 从 Julia 中的像素检索 RGB 矢量

java - 边界框无法正常工作 -/withkinect

c# - 如何使用 servicestack 序列化程序将默认内容类型设置为 Json

c# - 循环创建 MS Word 内容控件

colors - 从 Kinect 深度流获取像素颜色