作者:鸭大楚春秋 老师:曾老师
参考:https://blog.51cto.com/boytnt/1686307
提取好照片的名片部分之后
我发现使用轮廓的办法会很影响名片的倾斜校正,需要改进。
下一步是版面分析,要把不同的版块分割好,包括文字块,图像块等等
过程简要来说就是二值化,两次腐蚀,寻找轮廓,筛选轮廓,寻找轮廓的最小外接矩形
重点是getStructuringElement,文字是横着的,所以结构元素(即内核)要长大于宽,列数大于行数
经过多次尝试,列数=4*行数比较合适
int element_size = 1;
int s = element_size * 2 + 1;//必须是奇数
Mat structureElement = getStructuringElement(MORPH_RECT, Size(4*s, s), Point(-1, -1));
erode(binPic, binPic, structureElement);
erode(binPic, binPic, structureElement);
结果
block.jpg block2.jpg block3.jpg block16.jpg block18.jpg
截取矩形的标准值得说说,长和宽必须大于20,矩形面积不得大于总面积的30%
vector<Rect> boundRect(contours.size());
for (int i = 0; i < contours.size(); i++)
{
boundRect[i] = boundingRect(Mat(contours[i]));
if(boundRect[i].height>20&& boundRect[i].width>20&&boundRect[i].width*1.0/boundRect[i].height>0.2&&boundRect[i].width* boundRect[i].height<0.3*srcPic.cols*srcPic.rows)
{
stringstream ss;
String res;
ss << i;
ss >> res;
String divisionRes="block3/division"+res+".jpg";
Mat finalResult = srcPic(boundRect[i]);
imwrite(divisionRes, finalResult);
}
}
resultTest3.jpg
分割结果
final.png
几个结果图
division49.jpg division50.jpg division51.jpg division52.jpg
网友评论