这是我第一次发帖,希望我能让大家明白我的问题。
我有一个二进制图像,其中一些文本以垂直/水平对齐方式写入。我需要在这些图像上应用形态学运算,我需要为其提供一些尺寸的结构元素。 我的问题是我需要应用不同大小的结构元素进行形态学操作。
我尝试过以下方法
在图像中的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);
绘制一个旋转的矩形,然后使用其宽度和高度执行相同的条件检查。 代码:
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);
问题在于,在大多数情况下,水平对齐文本的高度大于宽度的矩形,反之亦然,因此应用了错误的结构大小,因此系统无法在形态学操作中加入正确的轮廓。 / p>
请在我的代码中提出一些替代或改进以纠正相同的内容。