From b99ec63306e697c1c148f888a0890da3390d60fa Mon Sep 17 00:00:00 2001 From: sinvo Date: Thu, 19 Mar 2026 17:25:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=87=E5=AD=97=E7=B3=8A?= =?UTF-8?q?=E6=88=90=E4=B8=80=E5=9B=A2=EF=BC=9A=E7=94=A8gamma=E6=9B=B2?= =?UTF-8?q?=E7=BA=BF=E4=BB=A3=E6=9B=BF=E7=BA=BF=E6=80=A7=E5=88=86=E6=AE=B5?= =?UTF-8?q?LUT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 线性分段把0-210全压到0-30,笔画间灰度差异丢失导致糊成墨团。 改用gamma=2.5的幂曲线,文字整体变黑但保留笔画间的灰度渐变, 文字清晰可辨。 Co-Authored-By: Claude Opus 4.6 --- CamScanner.cs | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) 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();