You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:24:02