图像处理案例之切除扫描件周边的白边

摘要:本文主要介绍了图像处理中的一个小项目——切除扫面件周边的白边。首先提出了解决问题的算法解决方案,然后进行了代码实现,最后对这一过程中可能存在的问题进行了总结。

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、总结

在上面的代码执行过程中,如果文件的颜色和白边的颜色对比足够明显,那么边框线的识别就会容易很多。而如果对比不够明显,那么边框线就不容易识别出来,那么也就会导致问题解决的失败。因此,在识别边框线时提前对图像进行锐化滤波,那么就会有效提高识别效率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值