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

如何通过Python生成扫描压缩后的文本图像压缩伪影?

扫描压缩文本伪影的成因与Python实现方法

一、伪影成因

这类文本周边的伪影是JPEG压缩块效应+振铃效应的典型组合,常见于扫描文档后用低质量JPEG压缩的场景:

  • JPEG采用8×8像素的分块离散余弦变换(DCT)进行压缩,高对比度的文本边缘属于高频信息,压缩时为了大幅减小文件体积,量化表会丢弃大量高频细节,导致文本边缘出现明显的方块状分界(块效应)。
  • 同时,DCT逆变换时的截断误差会在文本边缘产生类似“波纹”的振铃效应,也就是你看到的文本周围模糊、带虚影的效果。
  • 扫描纸张本身的细微纹理、扫描过程中产生的轻微噪点,会和压缩伪影结合,让最终效果更贴近真实扫描后的状态。

二、Python实现脚本

用PIL和numpy就能快速模拟这类伪影,核心思路是通过低质量JPEG压缩生成块效应,再叠加轻微噪点模拟扫描纹理:

from PIL import Image, ImageDraw, ImageFont
import numpy as np

def add_scan_compression_artifact(text_img, compress_quality=10, noise_strength=3):
    # 第一步:低质量JPEG压缩生成块效应
    text_img.save("temp_compress_temp.jpg", "JPEG", quality=compress_quality)
    compressed_img = Image.open("temp_compress_temp.jpg")
    
    # 第二步:添加高斯噪点模拟扫描纸张纹理
    img_array = np.array(compressed_img)
    # 生成符合扫描噪点特征的高斯噪声
    noise = np.random.normal(0, noise_strength, img_array.shape).astype(np.int16)
    # 确保像素值在0-255范围内
    img_array = np.clip(img_array + noise, 0, 255).astype(np.uint8)
    
    return Image.fromarray(img_array)

# 1. 创建带文本的模拟纸张背景
paper_bg = Image.new("RGB", (600, 200), color=(243, 240, 235))  # 米白色模拟打印纸
drawer = ImageDraw.Draw(paper_bg)
# 加载字体(可替换为本地字体路径,比如Windows的"simhei.ttf")
try:
    text_font = ImageFont.truetype("simhei.ttf", 42)
except:
    text_font = ImageFont.load_default()
# 添加文本
drawer.text((60, 70), "测试扫描压缩伪影效果", font=text_font, fill=(15,15,15))

# 2. 生成伪影
result_image = add_scan_compression_artifact(paper_bg)

# 3. 保存或查看结果
result_image.save("scan_artifact_output.jpg")
result_image.show()

参数调整说明

  • compress_quality:JPEG压缩质量,值越小(1-10)伪影越明显,可根据需求调整。
  • noise_strength:扫描噪点强度,值越大噪点越重,建议在2-5之间调整。
  • 若要更真实,可将背景图替换为真实扫描的空白纸张图片,再添加文本后处理。

内容的提问来源于stack exchange,提问作者libra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:37:05