直方图相似度算法(Histogram Similarity)是一种 图像相似性比对方法,特别适合用来判断两张图的整体“色彩分布是否相似”。
一、什么是图像直方图?
图像直方图是对图像中每种颜色(或灰度)的像素数量进行统计,比如:
- 灰度图:统计 0~255 的灰度值有多少像素
- 彩色图(BGR):可以分开对 B、G、R 三个通道分别做统计
二、相似度计算的常用方法(OpenCV)
OpenCV 提供了内置函数:
cv2.compareHist(hist1, hist2, method)
常见的方法有:
方法名 | 值 | 描述 |
cv2.HISTCMP_CORREL | 0 | 相关性(值越接近1越相似) |
cv2.HISTCMP_CHISQR | 1 | 卡方(越小越相似) |
cv2.HISTCMP_INTERSECT | 2 | 直方图交集(越大越相似) |
cv2.HISTCMP_BHATTACHARYYA | 3 | 巴氏距离(越小越相似) |
三、Python 中常用的图像直方图相似度函数示例
import cv2
import numpy as np
def compare_img_hist(img1, img2):
# 先转为 HSV 更稳定(你也可以试 BGR 或 GRAY)
img1_hsv = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
img2_hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
# 计算直方图(这里只用 H 和 S 通道,更有代表性)
hist_img1 = cv2.calcHist([img1_hsv], [0, 1], None, [50, 60], [0, 180, 0, 256])
hist_img2 = cv2.calcHist([img2_hsv], [0, 1], None, [50, 60], [0, 180, 0, 256])
# 归一化
cv2.normalize(hist_img1, hist_img1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
cv2.normalize(hist_img2, hist_img2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
# 比较(相关性越接近1越相似)
similarity = cv2.compareHist(hist_img1, hist_img2, cv2.HISTCMP_CORREL)
return similarity # 一般你可以设一个阈值,比如 > 0.6 表示相似
五、阈值设定
根据 cv2.HISTCMP_CORREL(相关性):
- 相似度值 ∈ [-1, 1]
- 典型设定:
- > 0.9:非常相似(基本一致)
- 0.7 ~ 0.9:比较接近
- < 0.6:明显不同
六、总结
步骤 | 方法/函数 |
读取图像 | cv2.imread() |
转色彩空间 | cv2.cvtColor(img, cv2.COLOR_BGR2HSV) |
计算直方图 | cv2.calcHist() |
归一化 | cv2.normalize() |
相似度对比 | cv2.compareHist() |