解决方案必须是通用的(使用不同的字体和颜色)并且稳定。

输入数据是具有X,Y坐标的点,输出数据是矩形或更复杂的形状,其中包含单词或短语。

具有输入点(红色)和输出矩形(蓝色)的图像

现在,我使用带有hocr选项的整个图像的tesseract识别,然后从输出html中提取所有矩形,最后找到最接近点的reactangle。 代码如下所示。 但是由于整个图像识别效率低下。

当然,由于字体大小不同且无用的单词识别效果相同,因此可能无法识别全部图像,而只能识别部分图像,但这也不是一个明确的解决方案。

UPDATE

public class WordRecognizerTesseractHocr
{
    const string HelperFileName = "temp";

    public string NextVariant()
    {
        Bitmap.Save(HelperFileName + ".png", ImageFormat.Png);
        var startInfo = new ProcessStartInfo("tesseract.exe", HelperFileName + ".png temp hocr");
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        var process = Process.Start(startInfo);
        process.WaitForExit();

        var result = GetNearestWord(File.ReadAllText(HelperFileName + ".html"), Position);

        return result;
    }

    public string GetNearestWord(string tesseractHtml, Point position)
    {
        var xml = XDocument.Parse(tesseractHtml);

        RectsWords = new Dictionary<Rectangle, string>();

        var ocr_words = xml.Descendants("span").Where(element => element.Attribute("class").Value == "ocr_word").ToList();
        foreach (var ocr_word in ocr_words)
        {
            var strs = ocr_word.Attribute("title").Value.Split(' ');
            int left = int.Parse(strs[1]);
            int top = int.Parse(strs[2]);
            int width = int.Parse(strs[3]) - left + 1;
            int height = int.Parse(strs[4]) - top + 1;
            RectsWords.Add(new Rectangle(left, top, width, height), ocr_word.Value);
        }

        var nearestWords = RectsWords.OrderBy(rectWord => Distance(position, rectWord.Key));

        return nearestWords.Count() != 0 ? nearestWords.First().Value : string.Empty;
    }

    public static double Distance(Point pos, Rectangle rect)
    {
        if (pos.X < rect.Left)
        {
            if (pos.Y < rect.Top)
                return Math.Sqrt((rect.X - pos.X) * (rect.X - pos.X) + (rect.Top - pos.Y) * (rect.Top - pos.Y));
            else if (pos.Y < rect.Top + rect.Height)
                return rect.Left - pos.X;
            else
                return Math.Sqrt((rect.X - pos.X) * (rect.X - pos.X) + 
                    (rect.Top + rect.Height - 1 - pos.Y) * (rect.Top + rect.Height - 1 - pos.Y));
        }
        else if (pos.X < rect.Left + rect.Width)
        {
            if (pos.Y < rect.Top)
                return rect.Top - pos.Y;
            else if (pos.Y < rect.Top + rect.Height)
                return 0;
            else
                return pos.Y - (rect.Top + rect.Height - 1);
        }
        else
        {
            if (pos.Y < rect.Top)
                return Math.Sqrt((rect.X + rect.Width - 1 - pos.X) * (rect.X + rect.Width - 1 - pos.X) + 
                    (rect.Top - pos.Y) * (rect.Top - pos.Y));
            else if (pos.Y < rect.Top + rect.Height)
                return pos.X - (rect.Left + rect.Width - 1);
            else
                return Math.Sqrt((rect.X + rect.Width - 1 - pos.X) * (rect.X + rect.Width - 1 - pos.X) +
                    (rect.Top + rect.Height - 1 - pos.Y) * (rect.Top + rect.Height - 1 - pos.Y));
        }
    }

    public IDictionary<Rectangle, string> RectsWords
    {
        get;
        protected set;
    }
}

#1楼 票数:1

这可能有效。 它应该很快,但是很容易被噪音伤害。

首先获取文本的去歪斜图像,采用最容易使用的任何格式。

接下来,在x,y中得到您关心的点。

从y坐标开始,向上和向下查看完整的行,直到看到几个完全空的行。 这些将标记您指定点的文本行的顶部和底部。 这些是y中的矩形字的边界。

对x重复相同的操作,但要查找列以获取x中单词矩形的边界。

现在您应该有整个单词的界限,并且可以轻松地从中得到单词。

  ask by Ivan Kochurkin translate from so

未解决问题?本站智能推荐:

1回复

图像处理 剪切与图案不同的区域

你好, 我想区分第一张图片和第二张图片, 我想从图像中删除数字。 我得到了像素之间的差异,但结果是: 但我想要的是: 可以像这样剪切图像吗? 这是我所做的: 我直接得到了一点差异,但它没有给我我想要的东西,我尝试了中值模糊和类似的东西来做第 4 张图像,但我无法像第
7回复

什么是用于裁剪图像以避免空白区域或空白区域的好算法或库?

我有一大堆插图图像,我想裁剪到较小的预览尺寸。 问题是我想裁剪它们以显示插图的“有趣”部分(即避免空白区域)。 图像通常具有平坦的颜色或背景的细微渐变。 它们大多是矢量风格的艺术品,具有相当不同的形 以下是一些示例: 链接 ;-) 我一直在考虑使用某种带有滑动窗口的图像
2回复

按多边形区域裁剪图像

我想按多边形区域裁剪图像,但找不到任何可以制作它的库。 OpenCV 对于这个小东西来说太大了。 JJIL [在此处输入链接描述] 仅裁剪矩形区域。 也许您对我如何实现它有任何想法? 感谢帮助! FOR Nidhi:尝试这样的事情,如果不起作用 - 为路径创建另一个画布,然后从中获取位图
2回复

分离图像的组件并将其保存为新图像

我有一个黑白图像,如下所示: 我想分离此图像的白色组件,然后将它们保存为单独的图像。 此图像有四个白色部分。 我想将它们分开并保存四张新图像; 每个都包含图像的白色部分。 为此,我编写了以下代码: 问题 此代码分隔白色部分并保存它们,但保存在新图像中的白色部
2回复

Matlab:用推拉窗裁剪图像?

有人知道如何在Matlab中使用滑动窗口裁剪图像吗? 例如,我有1000x500像素的图像,我想从这个50x50像素的图像块中裁剪...当然我必须处理不均匀的分割,但是没有必要具有相同大小的块。
1回复

使用Python自动裁剪图像

我正在尝试编写一个脚本来协助我的行业项目,但是我无法使此代码正常工作。 应该做的是将所有图像都放在目录中对其进行裁剪,每个图像的裁剪都相同,然后导出裁剪后的图像。
1回复

自动裁剪许多大图像文件

我有两千个大(20mb)图像文件。 每个文件具有相同的高度,宽度和分辨率。 这些文件目前是JPG,尽管它们还有其他格式。 对于每个图像,我需要从较大的文件中提取6个裁剪的图像,每个图像都在较大的文件中完全相同的位置。 我想提供我需要提取的区域的坐标(或者我需要裁剪每个较大的图像)
2回复

在Matlab中裁剪和转换图像

我正在尝试裁剪图像但不是使用矩形(如imcrop() ),而是使用具有四个角的多边形。 我经常搜索并发现我需要执行单应性以将裁剪的多边形重新调整为矩形。 所以我用imcrop()来选择图像中的多边形: 我怎么能用这两件事来裁剪出一个四角形多边形的区域呢?