2022-07-29 08:41:34 +00:00
|
|
|
|
/*
|
|
|
|
|
* ====================================================
|
|
|
|
|
|
|
|
|
|
* 功能:自动裁剪、纠偏、除黑底
|
|
|
|
|
* 作者:刘丁绿
|
|
|
|
|
* 生成时间_020/4/21
|
|
|
|
|
* 最近修改时间:2020/4/21 v1.0
|
|
|
|
|
2020/7/22 v1.1 增加获取图像有效区域轮廓的接口maxContour(用于配合一体机的“跳过空白页”算法,PC端暂时无需使用_
|
|
|
|
|
2020/10/16 v1.2 修复自动裁剪尺寸精度丢失的BUG;提高除黑底缩进精度
|
|
|
|
|
2020/10/28 v1.2.1 修复凹凸多边形填充背景的逻辑BUG
|
|
|
|
|
2020/10/28 v1.2.2 修复图像处理必定会缩小尺寸的BUG
|
|
|
|
|
2020/10/29 v1.2.3 避免无谓的纠偏(0°纠偏_
|
|
|
|
|
2020/11/30 v1.3.0 增加功能,可识别文稿颜色进行填充黑底
|
|
|
|
|
2021/06/18 v1.3.1 调整默认noise
|
|
|
|
|
2021/07/01 v1.3.2 修复 无裁切情况下,自适应颜色除黑底不生效的BUG
|
|
|
|
|
2021/07/08 v1.3.3 完善流程。当无法定位内容时,且为固定幅面裁切,则返回按照固定幅面进行裁切的结果
|
|
|
|
|
2021/07/08 v1.3.4 调整参数,让消除背景噪声不对纵向像素造成影响
|
|
|
|
|
2021/07/09 v1.3.5 增加normalCrop机制,当m_isCrop m_isDesaskew m_isFillBlank均为false时可选用,实现传统裁切
|
|
|
|
|
2021/07/13 v1.3.6 调整normalCrop逻辑,当normalCrop为true时,m_isCrop m_isDesaskew m_isFillBlank失效
|
|
|
|
|
2021/07/19 v1.3.7 调整仿射变换模式为INTER_LINEAR
|
|
|
|
|
2021/07/22 v1.3.8 修复第二次寻边,找不到外界轮廓会导致崩溃的BUG
|
|
|
|
|
2021/08/02 v1.3.9 精细化除黑底算法,可以应对只有条纹内容的黑色图像
|
|
|
|
|
2021/10/08 v1.3.10 优化算法,用腐蚀代替绘制实现缩进,提高整体算法效率
|
|
|
|
|
2021/10/19 v1.3.11 解决一些极端情况,例如纸张自然0角度,纸张定格在图像顶部的处理
|
|
|
|
|
2021/10/19 v1.3.12 微调裁切纠偏像素精度
|
|
|
|
|
2022/04/24 v1.4 重构算法,增加除色散功能
|
|
|
|
|
2022/05/03 v1.4.1 完善逻辑
|
|
|
|
|
2022/06/09 v1.4.2 修复获取文稿底色时,threshold值,设为固定值0.5
|
|
|
|
|
* 版本号:v1.4.2
|
|
|
|
|
|
|
|
|
|
* ====================================================
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef IMAGE_APPLY_AUTO_CROP_H
|
|
|
|
|
#define IMAGE_APPLY_AUTO_CROP_H
|
|
|
|
|
|
|
|
|
|
#include "ImageApply.h"
|
|
|
|
|
|
|
|
|
|
class GIMGPROC_LIBRARY_API CImageApplyAutoCrop : public CImageApply
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
CImageApplyAutoCrop();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* isCrop [in]:自动幅面裁剪使能,true自动裁剪,false为固定裁剿
|
|
|
|
|
* isDesaskew [in]:自动纠偏使能,true自动纠偏,false为不纠偏
|
|
|
|
|
* isFillBlank [in]:黑底填充使能,true为填充,false为不填充
|
|
|
|
|
* fixedSize [in]:固定幅面尺寸,当isCrop为false时生效,结果尺寸按fixedSize大小输出,单位像紿
|
|
|
|
|
* isConvex [in]:黑底填充时的填充方式,true为凸多边形填充,false为凹多边形填充,默认true
|
|
|
|
|
* isFillColor [in]:黑底填充时采用自适应色彩填充,false为白色填充,true为自适应文稿底色填充,默认false
|
|
|
|
|
* threshold [in]:二值化阈值,取值范囿0, 255),默访0
|
|
|
|
|
* noise [in]:除噪像素,能够消除noise宽度的背景竖条纹干扰,默访
|
|
|
|
|
* indent [in]:轮廓缩进,裁剪、纠偏或者黑底填充时,对探索到的纸张轮廓进行缩进indent像素,默访
|
|
|
|
|
* normalCrop [in]:为true时,m_isCrop m_isDesaskew m_isFillBlank失效,固定裁切采用最传统的裁切方式,默认false
|
|
|
|
|
* dispersion [in]:为true时,除色散;false时不除色散。默认为true
|
|
|
|
|
*/
|
|
|
|
|
CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFillBlank, const cv::Size& fixedSize, bool isConvex = true,
|
|
|
|
|
bool isFillColor = false, double threshold = 40, int noise = 8, int indent = 5, bool normalCrop = false, bool dispersion = true);
|
|
|
|
|
|
|
|
|
|
virtual ~CImageApplyAutoCrop();
|
|
|
|
|
|
|
|
|
|
virtual void apply(cv::Mat& pDib, int side);
|
|
|
|
|
|
|
|
|
|
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
|
|
|
|
|
|
|
|
|
|
bool isAutoCrop() { return m_isCrop; }
|
|
|
|
|
|
|
|
|
|
bool isFillBlank() { return m_isFillBlank; }
|
|
|
|
|
|
|
|
|
|
bool isDesaskew() { return m_isDesaskew; }
|
|
|
|
|
|
|
|
|
|
bool isConvexHull() { return m_isConvexHull; }
|
|
|
|
|
|
|
|
|
|
cv::RotatedRect getROI() { return m_rect; }
|
|
|
|
|
|
|
|
|
|
double threshold() { return m_threshold; }
|
|
|
|
|
|
|
|
|
|
int noise() { return m_noise; }
|
|
|
|
|
|
|
|
|
|
int indent() { return m_indent; }
|
|
|
|
|
|
|
|
|
|
cv::Size fixedSize() { return m_fixedSize; }
|
|
|
|
|
|
|
|
|
|
const std::vector<cv::Point>& maxContour() { return m_maxContour; }
|
|
|
|
|
|
|
|
|
|
void setAutoCrop(bool enabled) { m_isCrop = enabled; }
|
|
|
|
|
|
|
|
|
|
void setFillBlank(bool enabled) { m_isFillBlank = enabled; }
|
|
|
|
|
|
|
|
|
|
void setDesaskew(bool enabled) { m_isDesaskew = enabled; }
|
|
|
|
|
|
|
|
|
|
void setConvexHull(bool convex) { m_isConvexHull = convex; }
|
|
|
|
|
|
|
|
|
|
void setThreshold(double value) { m_threshold = value; }
|
|
|
|
|
|
|
|
|
|
void setNoise(int value) { m_noise = value; }
|
|
|
|
|
|
|
|
|
|
void setIndent(int value) { m_indent = value; }
|
|
|
|
|
|
|
|
|
|
void setFixedSize(cv::Size size) { m_fixedSize = size; }
|
|
|
|
|
|
|
|
|
|
void setDispersion(bool enable) { m_isDispersion = enable; }
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
bool m_isCrop;
|
|
|
|
|
bool m_isDesaskew;
|
|
|
|
|
bool m_isFillBlank;
|
|
|
|
|
bool m_isConvexHull;
|
|
|
|
|
bool m_isFillColor;
|
|
|
|
|
bool m_isDispersion;
|
|
|
|
|
|
|
|
|
|
double m_threshold;
|
|
|
|
|
int m_noise;
|
|
|
|
|
int m_indent;
|
|
|
|
|
bool m_normalCrop; //为true且m_isCrop m_isDesaskew m_isFillBlank均为false时生效,固定裁切采用最传统的裁切方弿
|
|
|
|
|
cv::Size m_fixedSize;
|
|
|
|
|
cv::RotatedRect m_rect;
|
|
|
|
|
std::vector<cv::RotatedRect> m_rects;
|
|
|
|
|
std::vector<cv::Point> m_maxContour;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void autoCrop_desaskew_fillBlank(const cv::Mat& src, cv::Mat& dst, bool isAutoCrop, bool isDesaskew, bool isFillBlank, int dWidth, int dHeight,
|
|
|
|
|
bool isConvex = true, bool isColorBlank = false, double threshold = 40, int noise = 8, int indent = 5, bool isNormalCrop = false, bool dispersion = true);
|
|
|
|
|
#endif // !IMAGE_APPLY_AUTO_CROP_H
|