从图像中提取较小的图像

时间:2015-06-08 16:10:47

标签: c image opencv captcha

我开始学习openCV并对此有疑问。

我的目标是识别验证码 首先,我必须预处理图像。

有一个验证码的例子  here

所以问题是如何从图像中裁剪符号并将其放入2D数组(位图)。

1 个答案:

答案 0 :(得分:2)

自动分区检测

您需要做的第一件事是创建背景颜色的过滤器数组。这将是包含背景中出现的颜色的数组。为此,您可以采用偏移20x20区域或将其保留为用户选项,具体取决于您的项目立场。

typedef unsigned char Pixel [3];
typedef *Pixel PixelArray;

// Function to return offset byte of x/y coordinate
int bmp_get_offset (int width, int x, int y)
{
    int w = width;
    const int channels = 3;
    const int bpp = 8;
    const int single = (channels * bmpp) / 8;
    const int offset = 54;
    int rowsize = w * single;
    int pixAddress;

    if(rowsize % 4 != 0) rowsize += 4 - (rowsize % 4);
    pixAddress = offset + yp * rowsize + xp * single;

    return pixAddress;
}

// Function to return specific area (pseudo-code)
PixelArray bmp_get_area (FILE * bmp, int x, int y, int w, int h)
{
    PixelArray buffer = buffer_new(bmp); // sets image into a memory-allocated buffer
    PixelArray area [h * w];
    const int src_width  = *((int*)&buffer[(0x12)]);

    for(int iWidth = 0; iWidth < w; iWidth++)
        for(int iHeight = 0; iHeight < h; iHeight++)
            area[iHeight * src_width + iWidth] = buffer[bmp_get_offset(src_width, x + iWidth, y + iHeight)];

    return area;
}

嗯,它没有那么多伪代码。

现在你有了过滤器,你可以限制外部像素。 现在您需要的是垂直光栅扫描。或者只是垂直扫描。 覆盖整个验证码图像。 如果垂直线的每个像素与已经获得的area中的某些颜色匹配,则将另外检查垂直线的每个像素。 如果线条的所有像素(具有图像高度的大小)在检查像素是否接近或匹配area颜色时返回正数,则aray索引器将增加,以便我们在最后一个角色结束 enter image description here

修改1 3秒钟我GIMPed图像的颜色曲线,产生一个简单的背景: enter image description here

因此,这分别简化了过滤过程。 我所做的颜色曲线实际上只是一个亮度/对比度调整控件,这可能是你可以实现的最简单的颜色处理(在反转之后)。

我可能会定期编辑以澄清更多内容。这肯定会给你一个很好的实践。真实的做法。

文档:

  • BMP File Format(您可以使用足够的信息开始使用位图。最重要的是位图结构,它是BMPINFOHEADER和DIBHEADER的组合)。
  • Tesseract OCR(替代方案将为您完成所有事情。但是,如果您使用最简单的解决方案解决问题,它将无法让您成为更好的程序员)