摘要:本文主要介绍了图像处理中的一个小项目——切除扫面件周边的白边。首先提出了解决问题的算法解决方案,然后进行了代码实现,最后对这一过程中可能存在的问题进行了总结。
1、问题描述
在进行文件扫描时,可能会存在一些白边问题,使得扫面件的质量不佳,如下图。当我们采用人工裁剪时,效率可能会比较差,因此需要设计一种解决方案来解决这一问题。
2、解决思路
在解决这一问题时,提出的方案是这样的:首先将文件进行识别,找出其边框线,用边框线构成的矩形框在原图上取图,最终得到去除边框的扫面件。
3、代码演示
1 #include<iostream> 2 #include<opencv2/opencv.hpp> 3 4 using namespace cv; 5 using namespace std; 6 7 const char *InPut = "输入图像"; 8 const char *OutPut = "边框图像"; 9 const char *finalPut = "输出图像"; 10 11 Mat src; 12 13 int ThresholdValue = 13; 14 const int maxLevel = 255; 15 16 void FindROI(int,void *) { 17 Mat srcGray,EdgeImage; 18 Rect box; 19 Mat drawing = Mat::zeros(src.size(),CV_8UC3); 20 cvtColor(src,srcGray,COLOR_BGR2GRAY); 21 Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); 22 filter2D(srcGray,srcGray,srcGray.depth(),kernel); 23 Canny(srcGray,EdgeImage,ThresholdValue,ThresholdValue*2); 24 vector<vector<Point>> contours; 25 vector<Vec4i> hierarchy; 26 findContours(EdgeImage,contours,hierarchy,RETR_CCOMP,CHAIN_APPROX_SIMPLE); 27 for (int i = 0; i < contours.size();i++) { 28 RotatedRect minRect = minAreaRect(contours[i]); 29 if (minRect.size.width>src.cols*0.75 && minRect.size.height>src.rows*0.75 && minRect.size.width < src.cols-5 && minRect.size.height<src.rows-5) { 30 Point2f pt[4]; 31 minRect.points(pt); 32 box = minRect.boundingRect(); 33 for (int i = 0; i < 4; i++) { 34 line(drawing, pt[i], pt[(i + 1) % 4], Scalar(255,255,255), 2, 8, 0); 35 } 36 } 37 } 38 imshow(OutPut,drawing); 39 Mat finalImage = src(box); 40 imshow(finalPut, finalImage); 41 return; 42 } 43 44 int main(int argc, char** argv) { 45 src = imread("C:/Users/Lzy/Desktop/img/02.jpg"); 46 if (src.empty()) { 47 cout << "could not load image..." << endl; 48 return -1; 49 } 50 namedWindow(InPut,WINDOW_AUTOSIZE); 51 imshow(InPut,src); 52 namedWindow(OutPut, WINDOW_AUTOSIZE); 53 namedWindow(finalPut, WINDOW_AUTOSIZE); 54 createTrackbar("Threshold",OutPut,&ThresholdValue,maxLevel,FindROI); //为了寻找最佳的边框线 55 FindROI(0,NULL); 56 57 waitKey(0); 58 return 0; 59 }
4、效果展示
5、总结
在上面的代码执行过程中,如果文件的颜色和白边的颜色对比足够明显,那么边框线的识别就会容易很多。而如果对比不够明显,那么边框线就不容易识别出来,那么也就会导致问题解决的失败。因此,在识别边框线时提前对图像进行锐化滤波,那么就会有效提高识别效率。