资讯动态

FairScan图像增强内幕:Multi-Scale Retinex消除光照不均的完整实现

发布时间:2026/10/23 2:02:22 来源:尧图企业网站定制
【免费下载链接】FairScanAn Android app to scan your documents — simple and respectful项目地址https://gitcode.com/gh_mirrors/fa/FairScan点击查看免费下载FairScan 是一款开源的 Android 文档扫描应用它的图像增强模块使用Multi-Scale Retinex多尺度 Retinex算法自动消除拍照时的光照不均——阴影一侧自动提亮、过曝区域自动压暗全程本地完成无需任何手动调节。这篇文章带你拆解这条增强流水线在代码里的完整实现。为什么扫描件总是一边亮一边暗用手機随手拍一张放在桌上的文档成品经常是左半边发暗、右半边过曝或者桌面纹理、阴影一起被扫了进去。上图就是 FairScan 调试资源中的一张原始拍摄照片app/src/debug/assets/uncropped/img01.jpg木桌纹理、纸张边缘阴影、不均匀顶光一个都不少。问题出在成像物理上相机记录的是反射率reflectance纸张本身的黑白× 光照illumination打光的强弱的乘积。要得到干净的文档就得把光照分量除掉只留反射率——这正是 Retinex 理论的出发点。FairScan 的图像增强流水线在哪增强不是独立的步骤而是嵌在拍照 → 裁剪矫正 → 增强 → 编码的主链路里。入口函数 extractDocument 的结尾三步透视矫正warpPerspective把检测到的文档四边形拉正缩放resizeForMaxPixels按导出质量限制像素总量增强调用 enhanceCapturedImage —— 本文主角。fun enhanceCapturedImage(img: Mat, colorMode: ColorMode, maxPixels: Long 0L): Mat { return when (colorMode) { ColorMode.COLOR - multiScaleRetinexOnL(img) // 色彩模式 ColorMode.GRAYSCALE - enhanceGrayscaleImage(img) // 灰度模式 ColorMode.BLACK_AND_WHITE - binarizeDocument(img, maxPixels) // 黑白模式 } }三种输出模式各有一条流水线但核心都是 Multi-Scale Retinex只是参数和后处理不同。上游调用方在 ImageProcessor.kt拍照时和导出 PDF 时都会走一遍保证预览和成品一致。色彩模式multiScaleRetinexOnL 的 9 个步骤色彩模式走 multiScaleRetinexOnL函数名里的 OnL 是关键只在 Lab 颜色空间的 L亮度通道上做增强A、B色度通道原样保留这样文字会被压白而彩色印章、插图的颜色不会被扭曲。第 1~2 步分离亮度通道先降到半分辨率// BGR - Lab拆出 L 通道 Imgproc.cvtColor(bgr, lab, Imgproc.COLOR_BGR2Lab) // L 转 float1 防止 log(0)然后缩小到 1/2 尺寸 val smallSize Size(lFloat.cols() / 2.0, lFloat.rows() / 2.0)为什么减半因为后面要用超大卷积核最大可达半张图的宽度在半分辨率上算能把计算量压到约 1/4——这是手机端实时性的关键取舍。第 3~4 步log 一次三个尺度估计光照Retinex 的核心公式是反射率 ≈ log(像素亮度) − log(大核模糊后的亮度)大核模糊相当于局部光照估计它抹平了文字等细节只剩光影的大趋势减掉它光照就不见了。Multi-Scale则意味着同时用多个不同大小的核、把结果加权平均——小核管局部阴影大核管全局背景稳定性远好于单一尺度。FairScan 选了三个尺度PostProcessing.kt L75-L79val kernelSizes listOf( maxDimSmall / 80.0, // 小核局部阴影 maxDimSmall / 10.0, // 中核中等范围光照 maxDimSmall / 2.0, // 大核整页背景趋势 )循环里每个尺度都执行boxFilterO(1) 速度的盒式滤波→ 做差 → 以weight 1/3累加进retinexSmall。这里有个工程细节log只对亮度求一次三次循环里模糊的都是log 域的结果避免重复取对数。第 5~7 步归一化、回放大、与原图混合归一化minMaxLoc找到极值后把 Retinex 映射到[0..1]再INTER_CUBIC放大回全分辨率重新定位乘以幅度系数amplitude 60.0再把均值拉回原始亮度meanL——保证增强后的整体明暗和原图一致不会越修越亮混合addWeighted以alpha 0.6融合即 60% 增强结果 40% 原始亮度保留原始质感避免处理痕迹过重。第 8 步百分位恢复对比度混合后的图动态范围会被压缩于是用 percentileL 基于直方图找 0.1% / 99.5% 分位点线性拉伸使深色内容压到min(pLow, pLowOrig)、亮部到 245最后 clamp 到[0..255]写回 L 通道Lab - BGR完成输出。整个函数结束时显式release()了每一个中间Mat——在内存紧张的 Android 上这是长流程图像处理的生命线。灰度模式五步流水线 向白色拉伸灰度/黑白模式共用私有函数 flattenedGrayscaleRetinex 部分换成2 个尺度maxDim/6和maxDim/50权重各 1/2并在 log 域之外多了三步针对纸面观感的处理exp()还原 百分位归一化代码注释说得很直白——对数运算会压缩亮部exp把浅灰批注、淡色文字救回来再用 p0.4%/p99 拉伸到 8bit向白色拉伸在直方图[180..255]区间找众数mode作为纸面白色的估计值直接拉伸到 255如果众数 ≥ 254 说明 Retinex 过增强常见于大面积深色区域会优雅降级为对原灰度图的简单百分位归一化双边滤波去噪bilateralFilter(9, 20.0, 10.0)平滑掉exp和拉伸放大的背景纹理与颗粒同时保留文字和线条的锐利边缘。黑白模式则在此基础上接 binarizeDocument用Sauvola 局部阈值t mean × (1 k·(std/r − 1))k0.25、r128代替全局阈值阴影区和高光区各自用局部统计量判定黑白再叠加flatFill大色块修补和fillHoles孔洞填充处理大面积涂黑导致的局部阈值漂移。效果如何验证项目自带的测试素材FairScan 把调试用的扫描素材直接放在 debug 资源里。下面两页是法国国家图书馆Gallica的旧书页被 ResumeScanScreen.kt、ExportScreen.kt 等界面用作演示文档这类页面是检验 Retinex 效果的好靶子陈旧纸张本身就不均匀还有大面积插图和细密文字——既考验阴影提亮也考验不过度放大纹理。项目根目录的evaluation/模块还提供了 DatasetEvaluator.kt 等评估器可以对数据集批量验证检测与分段质量。总结环节色彩模式灰度/黑白模式Retinex 尺度3 个/80、/10、/22 个/6、/50计算分辨率半分辨率提速全分辨率后处理混合原图 40% 百分位对比度恢复exp 还原 向白拉伸 双边滤波独有步骤Lab 分离保色度不变黑白模式追加 Sauvola 二值化FairScan 的做法可以概括为三句话Retinex 除光照、混合保底、细节后处理补观感。三个尺度盒式滤波、半分辨率计算、log 域共享、直方图驱动的参数都是为在手机上零配置跑出干净扫描件服务的工程权衡。想动手读源码从 PostProcessing.kt 出发即可图像处理的其余组件透视矫正、检测都在同目录的 DocumentDetection.kt 与 Perspective.kt 里。赞分享【免费下载链接】FairScanAn Android app to scan your documents — simple and respectful项目地址https://gitcode.com/gh_mirrors/fa/FairScan点击查看免费下载相关推荐Harpy与Swift项目集成从Objective-C到现代开发的平滑过渡终极指南Harpy与Swift项目集成从Objective C到现代开发的平滑过渡终极指南 在iOS应用开发中确保用户始终使用最新版本是提升用户体验和修复安全漏洞的移动开发开发工具深入理解PreLoader工作原理从源码角度解析Android数据预加载机制深入理解PreLoader工作原理从源码角度解析Android数据预加载机制 PreLoader是一款专为Android应用打造的页面启动速度优化利器它通过cann/asc-devkit SIMD合并排序API文档MrgSort 产品支持情况 ! npu950 id1 Ascend 950PR/Ascend 950DT支持 ! end id1 ! npu人工智能深度学习高性能计算CANN上一篇Aria2App完全指南如何打造你的移动服务器级下载管理器下一篇SMS Backup恢复功能详解从Gmail安全恢复短信创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑