【问题标题】:Comparing Bitmap objects with different colors比较不同颜色的位图对象
【发布时间】:2020-02-26 21:58:44
【问题描述】:

我有一个手写调查的位图对象(见下面的调查图片),其中包含各种复选框。我正在使用一种算法来比较空白、未标记复选框的位图与同一复选框(可能会或可能不会被标记)的位图,以确定复选框是否已被标记。这段代码基本上遍历位图上的每个复选框位置,并使用bm.GetPixel(x, y).GetBrightness() < 0.5f逐像素扫描,生成复选框的哈希并将其存储在列表中。然后,我会将空白复选框的哈希值与传入复选框的哈希值(有一定容差)进行比较,以确定它是否被标记。

现在我的问题是,如果复选框用黑色笔标记,这将非常有效。如果使用任何其他颜色的笔(红色、蓝色等)来标记这些复选框,那么bm.GetPixel(x, y).GetBrightness() < 0.5f 将无法识别像素的变化。谁能告诉我我可以更改哪些内容以包含其他颜色标记?

        foreach (KeyValuePair<string, CheckboxData> element in b1.CheckboxLocations)
        {

            int startX = element.Value.startX;
            int endX = element.Value.endX;
            int startY = element.Value.startY;
            int endY = element.Value.endY;

            List<bool> lResult = new List<bool>();

                for (int y = startY; y < endY; y++)
                {
                    for (int x = startX; x < endX; x++)
                    {
                        lResult.Add(bm.GetPixel(x, y).GetBrightness() < 0.5f);
                    }
                }

            int numMarked = 0;
            foreach(bool b in lResult)
            {
                if(b == true)
                {
                    numMarked++;
                }
            }

            Console.WriteLine($"Box Name: {element.Key}\nNumber of Pixels Marked: {numMarked}\n");

        }

【问题讨论】:

  • 问题是“为什么”它不能识别彩色像素。也许你的门槛太高了。试试 0.3
  • 感谢您的回复。我已经尝试过了,当我用红笔测试它时,标记的像素数仍然没有变化。也试过 0.2 和 0.1
  • 将图像转换为灰度,然后将其锐化,以便于识别。例如stackoverflow.com/questions/2265910/…stackoverflow.com/questions/903632/…

标签: c# asp.net ocr omr


【解决方案1】:

尝试查看位图对象的 R、G 和 B 属性。然后,您可以根据唯一阈值单独检查每种颜色。像下面这样的东西可能更有用:

lResult.Add(bm.GetPixel(x, y).R < 128 || bm.GetPixel(x, y).G < 128 || bm.GetPixel(x, y).B < 128);

【讨论】:

  • 出于好奇,
  • R、G、B属性的数据类型是byte,意思是256个值。 128 是其中的一半,相当于您与 0.5f 的比较,假设值范围在 0 和 1 之间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多