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

PDF转图片后差异高亮异常:代码输出与预期不符求助

解决PDF转图片后的差异高亮问题

参考图片

image1
image2

需求

  • 将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()

当前输出与预期输出

  • 当前输出:我的输出
  • 预期输出:预期输出

问题修正方案

原代码存在三个核心问题:

  1. PDF转图片时强制转为灰度图,丢失色彩信息,无法实现彩色高亮
  2. 差异计算后未做阈值处理和轮廓提取,直接用加权叠加仅得到两张图的混合效果,无法标记差异区域
  3. 逻辑存在漏洞,未处理图片尺寸不一致的情况

以下是修正后的代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:37:49