OpenCV-Python快速入门系列25二维直方图

前言

二维直方图是用于分析图像中两个通道之间像素值分布关系的工具。相比于一维直方图,二维直方图可以同时统计两个通道之间的联合分布。比如在 HSV 色彩空间中,可以分析色调(Hue)和饱和度(Saturation)的关系。

功能实现

本示例实现以下功能:

  1. 加载一张彩色图像并转换为 HSV 色彩空间。
  2. 计算 HSV 空间中 H 和 S 通道的二维直方图。
  3. 使用伪彩色可视化二维直方图,并通过 Matplotlib 绘制热图。

完整代码

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def image2d_hist():
    # 加载图像
    image = cv.imread('images/test.png')
    if image is None:
        print("无法加载图像")
        return

    # 转换为 HSV 色彩空间
    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)

    # 计算二维直方图
    hist = cv.calcHist([hsv], [0, 1], None, [48, 48], [0, 180, 0, 256])

    # 调整直方图大小
    dst = cv.resize(hist, (400, 400))

    # 归一化直方图到 0~255
    cv.normalize(dst, dst, 0, 255, cv.NORM_MINMAX)

    # 显示原图
    cv.imshow("Original Image", image)

    # 应用伪彩色并显示直方图
    dst_colormap = cv.applyColorMap(np.uint8(dst), cv.COLORMAP_JET)
    cv.imshow("2D Histogram (ColorMap)", dst_colormap)

    # 使用 Matplotlib 绘制热图
    plt.imshow(hist, interpolation='nearest', extent=[0, 180, 0, 256], aspect='auto', cmap='jet')
    plt.colorbar()
    plt.title("2D Histogram (H and S)")
    plt.xlabel("Hue")
    plt.ylabel("Saturation")
    plt.show()

    # 等待用户按键关闭窗口
    cv.waitKey(0)
    cv.destroyAllWindows()

# 调用函数
image2d_hist()

计算二维直方图

hist = cv.calcHist([hsv], [0, 1], None, [48, 48], [0, 180, 0, 256])
  • 参数说明
    • [hsv]:输入图像。
    • [0, 1]:统计 H 通道(色调)和 S 通道(饱和度)的分布。
    • None:不使用掩码。
    • [48, 48]:将 H 和 S 通道分别分为 48 个区间。
    • [0, 180, 0, 256]:H 通道范围 [0, 180],S 通道范围 [0, 256]。

应用场景

  1. 颜色分析
    • 分析图像中不同颜色的分布规律。
  2. 图像检索
    • 使用直方图作为特征向量进行图像匹配或检索。
  3. 图像分割
    • 基于颜色信息的图像分割。

运行效果

图片[1]-OpenCV-Python快速入门系列25二维直方图-天煜博客

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容