【问题标题】:C# Converting TIFF JPEG compression to TIFF CompressionCCITT4 gives a lot of noiseC# 将 TIFF JPEG 压缩转换为 TIFF CompressionCCITT4 会产生很多噪音
【发布时间】:2026-02-03 13:00:01
【问题描述】:

对于 OCR 引擎,我需要为 OCR 引擎提供带有 CCITT4 压缩的 TIFF 文件。 我们的扫描仪输出带有 JPEG 压缩的 TIFF 文件。我想使用 System.Drawing.Imaging 用 C# 转换这些文件。

这会导致图像出现大量噪点。如何降低噪音?

我的代码:

        List<byte[]> fRet = new List<byte[]>();
        ImageCodecInfo fImageCodecInfo = GetEncoderInfo("image/tiff");
        EncoderParameters fEncoderParameters = new EncoderParameters(3);
        fEncoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
        fEncoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ScanMethod, (int)EncoderValue.ScanMethodNonInterlaced);
        fEncoderParameters.Param[2] = new EncoderParameter(System.Drawing.Imaging.Encoder.RenderMethod, (int)EncoderValue.RenderNonProgressive);

        //

        Image fOrgTiff = Image.FromStream(pInputTiff);
        Guid objGuid = fOrgTiff.FrameDimensionsList[0];
        FrameDimension objDimension = new FrameDimension(objGuid);
        int frameCount = fOrgTiff.GetFrameCount(objDimension);
        for (int i = 0; i < frameCount; i++)
        {
            MemoryStream ms = new MemoryStream();
            fOrgTiff.SelectActiveFrame(objDimension, i);
            fOrgTiff.Save(ms, fImageCodecInfo, fEncoderParameters);
            ms.Position = 0;
            fRet.Add(ms.GetBuffer());
        }
        return fRet;

【问题讨论】:

  • 原始JPEG有噪声还是转换引入的噪声?一个简单的中值过滤器可能会做得很好。
  • 我的猜测是你得到了一个从 JPEG 转换为二进制图像格式的扩散算法。您需要一个阈值或分割算法。发布编码器的所有可能参数。

标签: c# compression noise


【解决方案1】:

正如Brannon 所说,Ccitt4 是一种二进制格式(黑白),因此您的图像会自动二进制化。 文档说:“The Ccitt3, Ccitt4, and Rle require that the PixelFormat value be set to BlackWhite. Setting the PixelFormat to any other value resets the Compression property value to Default.

您可以尝试通过选择更好的二值化阈值来降低噪音。您可以查看AForge.NetEmguCV 等开源成像库提供的算法。

【讨论】: