肥仔教程网

SEO 优化与 Web 开发技术学习分享平台

直方图相似度算法(直方图相似度算法是什么)

直方图相似度算法(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()

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言