答案 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索引器将增加,以便我们在最后一个角色结束
修改1 3秒钟我GIMPed图像的颜色曲线,产生一个简单的背景:
因此,这分别简化了过滤过程。 我所做的颜色曲线实际上只是一个亮度/对比度调整控件,这可能是你可以实现的最简单的颜色处理(在反转之后)。
我可能会定期编辑以澄清更多内容。这肯定会给你一个很好的实践。真实的做法。
文档: