早就在用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, 大核)
算是展现了图像除法的经典案例
效果比对
如果运行出错,请自行安装VC_RedistInstaller.exe
仿真程序
不要再问我要 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*pf = fin.row(j).ptr();for (int i = 0; i < clen; i++)
{
po[i]= (pf[i] == 0) ? 0 : (uchar)std::min(255.0f, 255.0f * po[i] /pf[i]);
}
}returnxout;
}