zoukankan      html  css  js  c++  java
  • 图像处理案例之切除扫描件周边的白边

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

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

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

  • 相关阅读:
    poj3126--Prime Path(广搜)
    iOS中 imageNamed方法 非常多图片占用大量内存问题
    容器+AOP实现动态部署(四)
    SpringBoot整合redis哨兵主从服务
    LINUX安装REDIS集群
    软件安装
    如何优雅地用Redis实现分布式锁
    Redis面试总结
    OAuth2.0 知多少(好)
    一张图搞定OAuth2.0
  • 原文地址:https://www.cnblogs.com/lzy820260594/p/11726647.html
Copyright © 2011-2022 走看看