使用OpenCV拆分图像

时间:2013-11-16 19:37:29

标签: opencv image-processing

我有一张彩票的图片,我想把它分成几块。基本上,图像可以被描述为具有标题通道,若干数字通道和一个脚注通道的一组“通道”。每条车道与另一条车道分开,如下所示:

lotto logo
some info
----------------
01 02 03 04 05
----------------
01 02 03 04 05
06 07 08
----------------
footer message

可以找到示例图像here。 是否可以使用opencv来检测这些行并将每个通道保存为单独的图像?

提前致谢。

2 个答案:

答案 0 :(得分:2)

由于您知道要查找重复的长水平线,您可以使用某种纹理分析(例如Gabor Filter)来隔离这些线,然后使用线检测算法,例如{{3 }}。 OpenCV具有完成所有这些功能。

鉴于我晚上的无聊性,我决定稍微测试一下这些想法。在调整了一些gabor滤波器参数后,我能够隔离图像中的水平线:

IsolatedLines

代码:

    //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算法(过滤非常长的行)来得到这个:

Detected Lines

代码:

im.convertTo(im,CV_8U);
std::vector<cv::Vec4i> lines;
cv::HoughLinesP(im,lines,1,CV_PI/180, 200, 800, 0);

从那里你需要做的就是识别每一行并裁剪出正确的图像区域。

如果您的所有图片看起来与您的样本完全相同,则此方法可能对您有用。它也可能不够健壮。希望它能为您提供更多想法。

答案 1 :(得分:1)

当然,这是可能的。

第一步要求您检测点线,为此您可以使用以下算法:

This post提供了有关这些方法的简要说明,您可以在网上找到有关如何使用它们的几个示例。

找到点线的位置后,您可以执行3次crop操作,将3个感兴趣区域(ROI)提取到新图像中。

祝你好运。