如何通过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
相关产品推荐
相关产品推荐

