我有一张彩票的图片,我想把它分成几块。基本上,图像可以被描述为具有标题通道,若干数字通道和一个脚注通道的一组“通道”。每条车道与另一条车道分开,如下所示:
lotto logo
some info
----------------
01 02 03 04 05
----------------
01 02 03 04 05
06 07 08
----------------
footer message
可以找到示例图像here。 是否可以使用opencv来检测这些行并将每个通道保存为单独的图像?
提前致谢。
答案 0 :(得分:2)
由于您知道要查找重复的长水平线,您可以使用某种纹理分析(例如Gabor Filter)来隔离这些线,然后使用线检测算法,例如{{3 }}。 OpenCV具有完成所有这些功能。
鉴于我晚上的无聊性,我决定稍微测试一下这些想法。在调整了一些gabor滤波器参数后,我能够隔离图像中的水平线:
代码:
//Tweaked parameters
cv::Size ks(101,101);
int sig = 20;
int lm = 50;
int th = 0;
cv::Mat kernel = cv::getGaborKernel(ks,sig,th,lm,0,0,CV_32F);
//using kernel transpose because theta = 90 (or pi/2)
//did not give horizontal lines.
cv::filter2D(im, im, CV_32F, kernel.t());
//Threshold to get binary image for Hough
cv::threshold( im, im, 254, 255, cv::THRESH_BINARY_INV);
从那里我只运行了通常的Hough Transform算法(过滤非常长的行)来得到这个:
代码:
im.convertTo(im,CV_8U);
std::vector<cv::Vec4i> lines;
cv::HoughLinesP(im,lines,1,CV_PI/180, 200, 800, 0);
从那里你需要做的就是识别每一行并裁剪出正确的图像区域。
如果您的所有图片看起来与您的样本完全相同,则此方法可能对您有用。它也可能不够健壮。希望它能为您提供更多想法。
答案 1 :(得分:1)