PDF转图片后差异高亮异常:代码输出与预期不符求助
解决PDF转图片后的差异高亮问题
参考图片


需求
- 将PDF文档(file_1.pdf和file_2.pdf)转换为图片
- 对比图片以检测两者间的差异
- 高亮两张图片中的变更或差异区域
现有代码
from pdf2image import convert_from_path import cv2 import numpy as np from PIL import Image, ImageOps from IPython.display import display def process_and_display_image(pdf_path, target_size=(800, 600),save_path='processed_image.jpeg'): images = convert_from_path(pdf_path) image = images[0] image = ImageOps.exif_transpose(image) image.thumbnail(target_size, Image.Resampling.LANCZOS) image_np = np.array(image) image_np = cv2.cvtColor(image_np, cv2.COLOR_RGB2GRAY) image_processed = Image.fromarray(image_np) display(image_processed) image_processed.save(save_path, 'JPEG') print(f"Image saved as {save_path}") # Display image from PDF process_and_display_image("file_1.pdf",save_path='file_1.jpeg') process_and_display_image("file_2.pdf",save_path='file_2.jpeg') import matplotlib.pyplot as plt image1 = cv2.imread('file_1.jpeg', cv2.IMREAD_UNCHANGED) image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB) image2 = cv2.imread('file_2.jpeg', cv2.IMREAD_UNCHANGED) image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB) if image1.shape == image2.shape: difference = cv2.absdiff(image1,image2) difference = 255 - difference if image1.shape == image2.shape: overlay = cv2.addWeighted(image1, 0.5, image2, 0.5, 0) difference = overlay plt.imshow(difference) plt.axis('off') plt.show()
当前输出与预期输出
- 当前输出:

- 预期输出:

问题修正方案
原代码存在三个核心问题:
- PDF转图片时强制转为灰度图,丢失色彩信息,无法实现彩色高亮
- 差异计算后未做阈值处理和轮廓提取,直接用加权叠加仅得到两张图的混合效果,无法标记差异区域
- 逻辑存在漏洞,未处理图片尺寸不一致的情况
以下是修正后的代码:
from pdf2image import convert_from_path import cv2 import numpy as np from PIL import Image, ImageOps from IPython.display import display import matplotlib.pyplot as plt def process_and_display_image(pdf_path, target_size=(800, 600), save_path='processed_image.jpeg'): # PDF转图片,保留彩色信息 images = convert_from_path(pdf_path) image = images[0] image = ImageOps.exif_transpose(image) image.thumbnail(target_size, Image.Resampling.LANCZOS) # 不转灰度,直接保存彩色图 display(image) image.save(save_path, 'JPEG') print(f"Image saved as {save_path}") # 处理两个PDF process_and_display_image("file_1.pdf", save_path='file_1.jpeg') process_and_display_image("file_2.pdf", save_path='file_2.jpeg') # 读取彩色图片 image1 = cv2.imread('file_1.jpeg') image2 = cv2.imread('file_2.jpeg') # 先确保两张图尺寸一致 if image1.shape != image2.shape: # 以第一张图尺寸为基准调整第二张 image2 = cv2.resize(image2, (image1.shape[1], image1.shape[0])) # 计算差异 diff = cv2.absdiff(image1, image2) # 转灰度后做阈值处理,得到差异掩码 gray_diff = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray_diff, 25, 255, cv2.THRESH_BINARY) # 膨胀操作,让差异区域更明显 kernel = np.ones((5,5), np.uint8) thresh = cv2.dilate(thresh, kernel, iterations=1) # 创建红色高亮层 highlight = np.zeros_like(image1) highlight[thresh > 0] = [0, 0, 255] # BGR格式,对应红色 # 将高亮层叠加到原图上 result = cv2.addWeighted(image1, 0.8, highlight, 0.2, 0) # 转换为RGB格式用于matplotlib显示 result_rgb = cv2.cvtColor(result, cv2.COLOR_BGR2RGB) # 展示结果 plt.imshow(result_rgb) plt.axis('off') plt.show()
关键修正点说明
- 保留彩色处理:PDF转图片时不再转为灰度,保留原始色彩,为后续高亮提供基础
- 差异掩码提取:通过阈值处理和膨胀操作,精准提取差异区域的掩码
- 红色高亮叠加:创建红色高亮层,与原图加权叠加,清晰标记差异区域
- 尺寸一致性处理:增加图片尺寸校准逻辑,避免因尺寸不一致导致的报错
内容的提问来源于stack exchange,提问作者Plutus
相关产品推荐
相关产品推荐

