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

能否基于SSIM计算生成二维直方图以可视化图像像素差异?

可以实现,且方法很直接

SSIM并非只能输出全局单一数值,它的核心是基于局部滑动窗口的像素块相似性计算,只要保留每个窗口的计算结果,就能得到和原图像同尺寸的局部SSIM热力图,进而结合像素值生成带相似性权重的二维直方图,实现精细化的像素级差异可视化。

核心思路拆解

  1. 获取像素级SSIM结果
    标准SSIM计算时,会以指定大小的窗口(比如3x3)遍历图像每个位置,输出每个窗口对应的相似性得分(范围0~1,1代表完全相似)。大多数SSIM实现库都支持返回完整的局部SSIM图,而非仅全局均值。

  2. 生成带相似性权重的二维直方图
    二维直方图的x轴设为图A的像素值,y轴设为图B的对应像素值,每个(x,y)点的权重用该位置的局部SSIM值填充——这样直方图的颜色深浅(或颜色映射)就能同时体现像素值的匹配关系和相似程度。

代码示例(Python)

import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim
import cv2

# 读取并预处理图像(转灰度、归一化)
img1 = cv2.imread('img1.jpg', 0) / 255.0
img2 = cv2.imread('img2.jpg', 0) / 255.0

# 获取局部SSIM图(full=True返回完整的相似性矩阵)
ssim_score, ssim_map = ssim(img1, img2, full=True, win_size=3)

# 提取像素值和对应的SSIM权重
pixels1 = img1.flatten()
pixels2 = img2.flatten()
ssim_weights = ssim_map.flatten()

# 绘制带权重的二维直方图
plt.figure(figsize=(10, 8))
hist, xedges, yedges, im = plt.hist2d(pixels1, pixels2, bins=64, weights=ssim_weights, cmap='RdBu_r')
plt.colorbar(im, label='局部SSIM值(越高越相似)')
plt.xlabel('图像A像素值')
plt.ylabel('图像B像素值')
plt.title('像素值匹配 + SSIM相似性二维直方图')
plt.show()

# 直接展示局部SSIM热力图(更直观的像素级差异)
plt.figure(figsize=(10, 8))
plt.imshow(ssim_map, cmap='RdBu_r', vmin=0, vmax=1)
plt.colorbar(label='局部SSIM值')
plt.title('像素级SSIM相似性热力图')
plt.axis('off')
plt.show()

关键注意事项

  • 窗口大小选择:win_size不宜过小(比如1x1会退化为像素灰度差,失去SSIM的结构相似性考量),也不宜过大(会模糊局部细节),3x3或5x5是常用的平衡值。
  • 颜色映射优化:推荐用发散型色卡(如RdBu_r),让高相似(接近1,蓝色)和低相似(接近0,红色)的视觉对比更强烈,避免单一渐变色卡的区分度不足。
  • 彩色图像处理:可分RGB通道分别计算SSIM,再将三个通道的SSIM图合并为彩色热力图,或对每个通道单独生成二维直方图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:12:31