diff --git a/CamScanner.cs b/CamScanner.cs index 122174e..6542917 100644 --- a/CamScanner.cs +++ b/CamScanner.cs @@ -366,22 +366,16 @@ public static class DocumentScanner Mat normU8 = new Mat(h, w, MatType.CV_8U); Marshal.Copy(resultData, 0, normU8.Data, resultData.Length); - // --- d: 非线性对比度增强(让文字更黑)--- - // 用 LUT 做分段映射: - // 0-210: 线性映射到 0-30(文字区域强力压暗) - // 210-255: 线性映射到 30-255(背景区域拉亮) + // --- d: 非线性对比度增强 --- + // 用 gamma 曲线代替线性分段,保留文字笔画间的灰度层次 + // gamma > 1:中间调压暗(文字变黑),但保留灰度渐变不糊成一团 byte[] lut = new byte[256]; for (int i = 0; i < 256; i++) { - if (i <= 210) - { - lut[i] = (byte)(i * 30 / 210); - } - else - { - lut[i] = (byte)(30 + (i - 210) * 225 / 45); - } - if (lut[i] > 255) lut[i] = 255; + double x = i / 255.0; + // gamma=2.5 让文字明显变黑,但笔画间灰度差异保留 + double y = Math.Pow(x, 2.5); + lut[i] = (byte)Math.Min(255, Math.Max(0, (int)(y * 255.0))); } Mat lutMat = new Mat(1, 256, MatType.CV_8U, lut); Mat contrasted = new Mat();