camscanner(扫描全能王)功能解析与复现 - 页面增强
早就在用camscanner(扫描全能王)这个软件,感觉很不错。
主要功能:
1.页面截取校正
2.增强处理(灰度与颜色)
刚好最近工作与此相关,静心做点仿真,看看其中的操作原理,也做个demo玩玩。
关于页面的校正,网上有人做了一些介绍和仿真,大体就是边缘,直线检测,交点,homography求取,最后warp变换。这个后面有时间在看看。
我比较感兴趣它的增强处理,特别是(magic color)的处理,感觉很不错,查了些资料没有看到合适的,其中opencv 中的adaptiveThreshold()函数有其灰度化处理的影子,但彩色增强上不是,后来觉得把问题当去光照处理,得到了较为近似的结果,感觉方向是对,就是细节处理大家不一样。
后续整理好放demo,今天先记录一下。
【2018-12-18】
有人做了这个photoshop下的仿真思路
https://blog.csdn.net/pleasecallmewhy/article/details/8776998
算法以此类同,细节不一。
问题规范为图像A,B,为同一场景在不一样的光照拍摄图片,那么:
光照分布 L = A / B
如果已知 A, L ,则 B = A / L (B 为A去光照的结果)
这里L约等于 gaussFilter(A, 大核)
算是展现了图像除法的经典案例
效果比对
DEMO下载链接
https://pan.baidu.com/s/1zOPd_AQ08vF5FTbMCrAOwA
如果运行出错,请自行安装VC_RedistInstaller.exe
仿真程序
链接:https://pan.baidu.com/s/1BLkiOA4dUG9ErkEVhmgjtA
提取码:vcsm
不要再问我要 code了,简单仿真 opencv code
cv::Mat pageEnhance(cv::Mat &xin) { cv::Mat fin; int r = (int)(sqrt((float)xin.cols * xin.rows) / 32.0f) + 1; cv::GaussianBlur(xin, fin, cv::Size(r + r + 1, r + r + 1), 0.0f); int clen = xin.channels() * xin.cols; cv::Mat xout = xin.clone(); for (int j = 0; j < xout.rows; j++) { uchar *po = xout.row(j).ptr<uchar>(); uchar *pf = fin.row(j).ptr<uchar>(); for (int i = 0; i < clen; i++) { po[i] = (pf[i] == 0) ? 0 : (uchar)std::min(255.0f, 255.0f * po[i] / pf[i]); } } return xout; }