OpenCV:根据图像的尺寸确定结构元素的大小

时间:2018-02-08 11:38:58

标签: c++ opencv image-processing

这是我第一次发帖,希望我能让大家明白我的问题。

我有一个二进制图像,其中一些文本以垂直/水平对齐方式写入。我需要在这些图像上应用形态学运算,我需要为其提供一些尺寸的结构元素。 我的问题是我需要应用不同大小的结构元素进行形态学操作。

我尝试过以下方法

  1. 在图像中的nonZero像素周围绘制一个边界矩形,并根据其高度和宽度应用条件 我的代码类似于:

    Mat Points;
    findNonZero(imgSrc, Points);
    Rect rect = boundingRect(Points);
    rectangle(imgSrc, rect.tl(), rect.br(), Scalar(255, 255, 255), 2);
    if (rect.width > rect.height){
            elementHor = getStructuringElement(MORPH_RECT, Size(45, 7));
            elementVer = getStructuringElement(MORPH_RECT, Size(7, 35));
    }
    else{
            elementHor = getStructuringElement(MORPH_RECT, Size(31, 7));
            elementVer = getStructuringElement(MORPH_RECT, Size(7, 35));
    }
    morphologyEx(imgSrc, imgSrc, CV_MOP_CLOSE, elementVer);
    morphologyEx(imgSrc, imgSrc, CV_MOP_CLOSE, elementHor);
    
  2. 绘制一个旋转的矩形,然后使用其宽度和高度执行相同的条件检查。 代码:

    std::vector<cv::Point> points;
    cv::Mat_<uchar>::iterator it = imgSrc.begin<uchar>();
    cv::Mat_<uchar>::iterator end = imgSrc.end<uchar>();
    for (; it != end; ++it)
        if (*it)
            points.push_back(it.pos()); 
    
    cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));
    if (box.size.width > box.size.height){
        elementHor = getStructuringElement(MORPH_RECT, Size(45, 7));
        elementVer = getStructuringElement(MORPH_RECT, Size(7, 35));
    }
    else{
        elementHor = getStructuringElement(MORPH_RECT, Size(31, 7)); 
        elementVer = getStructuringElement(MORPH_RECT, Size(7, 35));
    }
    morphologyEx(imgSrc, imgSrc, CV_MOP_CLOSE, elementVer);
    morphologyEx(imgSrc, imgSrc, CV_MOP_CLOSE, elementHor);
    
  3. 问题在于,在大多数情况下,水平对齐文本的高度大于宽度的矩形,反之亦然,因此应用了错误的结构大小,因此系统无法在形态学操作中加入正确的轮廓。 / p>

    请在我的代码中提出一些替代或改进以纠正相同的内容。

0 个答案:

没有答案