【发布时间】:2015-08-23 05:10:34
【问题描述】:
【问题讨论】:
-
这很容易通过原始处理完成,并且不涉及库。你允许我发布一个独立于库的解决方案吗?
-
@Malina 好的,去吧。会很好的
【问题讨论】:
自动分区检测
您需要做的第一件事是创建背景颜色的过滤器数组。这将是包含背景中出现的颜色的数组。为此,您可以只取偏移 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 颜色时,行的所有像素(具有图像高度的大小)返回正值,则数组索引器将递增,以便我们找到最后一个字符结束的位置。
编辑 1 在 3 秒内,我对图像的颜色曲线进行了 GIMP,得到了纯色背景:
所以这分别大大简化了过滤过程。 我所做的颜色曲线魔术实际上只是一个亮度/对比度调整控件,这可能是您可以实现的最简单的颜色处理(在反转之后)。
我可能会定期编辑以澄清更多内容。这肯定会给你一个很好的练习。真正的实践。
文档:
【讨论】: