OpenCV图像直方图(python)

 案例 ©Fu Xianjun. All Rights Reserved.

一、读取图像

知识储备:图像直方图

直方图是数值数据分布的精确图形表示。        

这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Karl Pearson)首先引入。它是一种条形图。

构建直方图: ①将值的范围分段 ②计算每个间隔中有多少值

知识实战:直方图阈值化

        对于任何一张图像,它的直方图中如果存在较为明显的双峰,用直方图分割技术法可以达到很好的效果,否则,达到的效果会很不理想。

 1、使用掩膜进行直方图绘制

直方图均衡

 知识实战:直方图均衡化

二、直方图比较

创建 RGB 三通道直方图(直方图矩阵)

创建一个(16*16*16,1)的初始矩阵,作为直方图矩阵  16*16*16的意思为三通道每通道有16个bins 人为构建直方图矩阵的索引,该索引是通过每一个像素点的三通道值进行构建 该处形成的矩阵即为直方图矩阵

创建第一幅图的rgb三通道直方图(直方图矩阵)

直方图比较函数

知识实战:直方图比较

(1)相关性比较(Correlation)

(2)Chi-Square(卡方比较)

(3)Intersection(十字交叉性)

(4)Bhattacharyya distance(巴氏距离)

Step1: 先用cvtColor()把图像从RGB色彩空间转换到HSV色彩空间;

Step2: 计算图像的直方图,然后归一化到[0~1]之间,用到函数 calcHist() 和 normalize()

Step3:使用上述的四种方法之一进行比较,用到函数compareHist()。

### 使用 PythonOpenCV 生成图像直方图 以下是一个完整的代码示例,展示如何使用 PythonOpenCV 生成图像直方图。此代码涵盖了灰度图像和彩色图像的处理方法。 ```python import cv2 import numpy as np from matplotlib import pyplot as plt # 灰度图像直方图生成 def generate_gray_histogram(image_path: str): img = cv2.imread(image_path, 0) # 以灰度模式读取图像 plt.hist(img.ravel(), 256, [0, 256]) # 计算直方图 plt.title('Gray Histogram') plt.xlabel('Pixel Value') plt.ylabel('Frequency') plt.show() # 彩色图像直方图生成 def generate_color_histogram(image_path: str): img = cv2.imread(image_path) # 以彩色模式读取图像 color = ('b', 'g', 'r') # 定义颜色通道 for i, col in enumerate(color): histr = cv2.calcHist([img], [i], None, [256], [0, 256]) # 计算每个通道的直方图 plt.plot(histr, color=col) plt.xlim([0, 256]) plt.title('Color Histogram') plt.xlabel('Pixel Value') plt.ylabel('Frequency') plt.show() # 测试代码 if __name__ == '__main__': image_path = 'example.jpg' # 替换为你的图像路径 generate_gray_histogram(image_path) # 生成灰度图像直方图 generate_color_histogram(image_path) # 生成彩色图像直方图 ``` #### 代码说明 1. **灰度图像直方图**:通过 `cv2.imread` 函数以灰度模式读取图像,并使用 `matplotlib.pyplot.hist` 方法计算和绘制直方图[^1]。 2. **彩色图像直方图**:通过 `cv2.imread` 函数以彩色模式读取图像,并使用 `cv2.calcHist` 方法分别计算每个颜色通道(蓝色、绿色、红色)的直方图[^2]。 3. **绘图**:使用 `matplotlib` 库绘制直方图,支持自定义标题、坐标轴标签等属性。 ### 直方图均衡化示例 如果需要对图像进行直方图均衡化处理,可以参考以下代码: ```python import cv2 import numpy as np from matplotlib import pyplot as plt # 灰度图像直方图均衡化 def equalize_gray_histogram(image_path: str): img = cv2.imread(image_path, 0) # 以灰度模式读取图像 equ = cv2.equalizeHist(img) # 直方图均衡化 res = np.hstack((img, equ)) # 拼接原图和均衡化后的图像 cv2.imshow('Equalized Gray Histogram', res) cv2.waitKey(0) cv2.destroyAllWindows() # 彩色图像直方图均衡化 def equalize_color_histogram(image_path: str): img = cv2.imread(image_path) # 以彩色模式读取图像 (b, g, r) = cv2.split(img) # 分离颜色通道 bH = cv2.equalizeHist(b) # 对每个通道进行均衡化 gH = cv2.equalizeHist(g) rH = cv2.equalizeHist(r) result = cv2.merge((bH, gH, rH)) # 合并通道 cv2.imshow('Original Image', img) cv2.imshow('Equalized Color Histogram', result) cv2.waitKey(0) cv2.destroyAllWindows() # 测试代码 if __name__ == '__main__': image_path = 'example.jpg' # 替换为你的图像路径 equalize_gray_histogram(image_path) # 灰度图像均衡化 equalize_color_histogram(image_path) # 彩色图像均衡化 ``` #### 代码说明 1. **灰度图像均衡化**:使用 `cv2.equalizeHist` 函数对灰度图像进行直方图均衡化处理[^3]。 2. **彩色图像均衡化**:将彩色图像分解为 BGR 三个通道,分别对每个通道进行均衡化处理后重新合并[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值