如何优化OpenCV图像滤镜以实现高质量扫描文档效果
文档扫描滤镜优化实现方案
你之前的两种实现效果不佳的核心原因是没有做对比度预处理,且二值化参数设置不合理,同时缺少后续的噪点过滤步骤。下面是优化后的完整实现代码:
val mat = Mat() Utils.bitmapToMat(bitmap, mat) // 转换为灰度图 val grayMat = Mat() Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_RGBA2GRAY) // 对比度归一化,拉满文字和背景的区分度 val contrastMat = Mat() Core.normalize(grayMat, contrastMat, 0.0, 255.0, Core.NORM_MINMAX, CvType.CV_8UC1) // 高斯模糊降噪,避免后续阈值判断出现杂点 val blurMat = Mat() Imgproc.GaussianBlur(contrastMat, blurMat, Size(3.0, 3.0), 0.0) // 自适应二值化,调整参数平衡文字保留和背景过滤效果 val thresholdMat = Mat() Imgproc.adaptiveThreshold( blurMat, thresholdMat, 255.0, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 21, // 块大小需为奇数,数值越大适配不均匀光照能力越强 10.0 // 偏移量,数值越大背景越干净,过小会导致文字丢失 ) // 形态学开运算,去除背景细碎噪点同时保留文字轮廓 val kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, Size(2.0, 2.0)) val resultMat = Mat() Imgproc.morphologyEx(thresholdMat, resultMat, Imgproc.MORPH_OPEN, kernel) // 生成结果Bitmap val result = Bitmap.createBitmap(resultMat.cols(), resultMat.rows(), Bitmap.Config.ARGB_8888) Utils.matToBitmap(resultMat, result) // 回收所有Mat对象避免内存泄漏 mat.release() grayMat.release() contrastMat.release() blurMat.release() thresholdMat.release() kernel.release() resultMat.release()
参数调整指南
- 若出现文字笔画断层的情况,可适当调小自适应阈值的最后一个偏移参数,比如降到8.0
- 若背景残留噪点较多,可适当调大偏移参数到12.0,或者将开运算的内核尺寸调整为3*3
- 自适应阈值的块大小建议根据图片分辨率调整,始终保持为奇数即可
内容的提问来源于stack exchange,提问作者Yura
相关产品推荐
相关产品推荐

