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;
}