我的知识记录

Python 两张图片对比找差异 高亮不同区域教程

用 Pillow + numpy 对比两张同尺寸图片,按像素差生成高亮差异图,输出不同区域数量与差异百分比,适合设计稿改版比对、截图核对。

场景痛点

设计稿改了一版,要和上一版比对哪里动了;网页截图跑回归,要确认只有预期位置变化。肉眼逐像素看根本看不出来,叠在一起也对不齐。用 Python 把两张图转成数组做差,差异点染红,自动输出差异图和差异比例,几秒定位改动区域。

用到的库

pip install Pillow numpy

完整代码

# -*- coding: utf-8 -*-
# 对比两张同尺寸图片,把差异区域高亮成红色,输出差异图
import numpy as np
from PIL import Image, ImageChops

def diff_images(path_a, path_b, out_path, threshold=30):
"""threshold 是像素差阈值,小于它算一致"""
a = Image.open(path_a).convert("RGB")
b = Image.open(path_b).convert("RGB")

if a.size != b.size:
# 尺寸不一致就把 b 缩放到 a 的尺寸再比
b = b.resize(a.size, Image.LANCZOS)

# 逐像素做差,返回每通道差值
diff = ImageChops.difference(a, b)
arr = np.asarray(diff).astype("int32")
# 任一通道差超过 threshold 就算该像素不同
mask = (arr.max(axis=2) > threshold)

diff_ratio = mask.mean() * 100
print(f"差异像素占比:{diff_ratio:.2f}%")

# 把原图 a 复制一份,差异像素染红
out = a.copy()
out_arr = np.asarray(out)
out_arr[mask] = [255, 0, 0]   # 红色
Image.fromarray(out_arr).save(out_path)

# 同时输出一张纯差异热力图(白底黑差异)
heat = Image.fromarray((mask * 255).astype("uint8"))
heat.save(out_path.replace(".", "_heat."))
print(f"差异图:{out_path}")
print(f"热力图:{out_path.replace('.', '_heat.')}")

return diff_ratio

if __name__ == "__main__":
diff_images("./v1.png", "./v2.png", "./diff_result.png", threshold=30)

代码讲解

  • 先把两张图都转成 RGB,尺寸不一致时把第二张缩放到第一张的尺寸,避免数组形状对不上。
  • ImageChops.difference(a, b) 逐通道做差,结果是一张"哪里不同就哪里发亮"的图。
  • 转成 numpy 数组后,按 (arr.max(axis=2) > threshold) 生成布尔蒙版:只要 R/G/B 任一通道差值超过阈值,就认为这一像素变了。
  • mask.mean() * 100 直接得到差异百分比,方便写进自动化测试报告。
  • 高亮图把原图复制一份,差异像素位置直接赋值 [255,0,0] 红色,一眼看到改动在哪。
  • 另外存一张热力图,白底黑点,方便放到 Bug 单里。

运行结果

把两版设计稿命名为 v1.pngv2.png 放在当前目录,运行后终端打印差异百分比,同时生成 diff_result.png(差异处染红)和 diff_result_heat.png(纯黑白热力图)。

注意事项

  • 阈值 threshold=30 是经验值:抗锯齿、压缩噪点会产生 10 以内的差值,设太小会把噪点当成差异;设太大又会漏掉细微改动。
  • 两张图必须是同尺寸同缩放,否则差异会铺满整图。需要先对齐可参考 PIL 裁剪/缩放代码。
  • 大尺寸图(4K 以上)numpy 内存占用大,可先把图缩到 1080 宽再比,速度快很多。
  • JPG 二次保存会有压缩噪声,对比 JPG 时阈值建议调到 40~50。

Python 两张图片对比找差异 高亮不同区域教程

标签:

更新时间:2026-09-14 20:23:37

上一篇:Python 批量拼接图片合成竖长长图教程

下一篇:Python 在图片上批量添加文字 水印标题教程