直方图均衡化计算例题_小白入门计算机视觉(四) : 图像基本处理直方图(Histogram)...

本文介绍了直方图在图像处理中的作用,包括颜色直方图和灰度直方图的概念及处理方法。直方图均衡化用于改善图像的亮度对比度,通过特定的映射函数使图像灰度分布更加均匀。文章详细阐述了直方图均衡化的步骤、目的和映射公式,并通过实例展示了直方图均衡化前后图像的变化,证实了其在图像增强中的效果。

bd8127bdb1b3b3d0e58165483ef1089f.gif

认识直方图

在图像处理中,也经常需要分析图像的亮度(即像素级的分布情况),这就需要用到直方图了,如颜色直方图、灰度直方图等。

颜色直方图

颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可以不受图像尺度变化的影响,其缺点是没有表达出颜色空间分布的信息。

颜色直方图处理方法

颜色直方图是对RGB三通道分别做统计,这个逻辑比较简单,我直接用opencv的函数来实现吧,先看代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

image = cv2.imread("data.jpg")
cv2.imshow("Original",image)
#cv2.waitKey(0)

chans = cv2.split(image)
colors = ("b","g","r")
plt.figure()
plt.title("Flattened Color Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")

for (chan,color) in zip(chans,colors):
    hist = cv2.calcHist([chan],[0],None,[256],[0,256])
    plt.plot(hist,color = color)
    plt.xlim([0,256])
plt.show()
<
给定规定直方图如下: | $z_q$ | $p_z(z_q)$ | $G(z_q)=\sum_{j = 0}^{q}p_z(z_j)$ | | --- | --- | --- | | $r_0 = 0$ | 0.000 | 0.000 | | $r_1 = 1$ | 0.000 | 0.000 | | $r_2 = 2$ | 0.000 | 0.000 | | $r_3 = 3$ | 0.151 | 0.151 | | $r_4 = 4$ | 0.202 | 0.353 | | $r_5 = 5$ | 0.305 | 0.658 | | $r_6 = 6$ | 0.206 | 0.864 | | $r_7 = 7$ | 0.157 | 1.021 (近似为 1) | 假设存在一个输入图像,其直方图分布需要与上述规定直方图进行匹配。这里以一个简单的图像数据为例说明,假设输入图像的像素值如下(为简化,假设图像为 4x4 的灰度图像): ```plaintext [ [3, 4, 3, 5], [4, 5, 6, 3], [5, 6, 7, 4], [6, 7, 3, 5] ] ``` 以下是使用 Python 实现直方图匹配的代码示例: ```python import numpy as np import cv2 import matplotlib.pyplot as plt # 输入图像数据 input_image = np.array([ [3, 4, 3, 5], [4, 5, 6, 3], [5, 6, 7, 4], [6, 7, 3, 5] ], dtype=np.uint8) # 规定直方图 specified_hist = np.array([0.000, 0.000, 0.000, 0.151, 0.202, 0.305, 0.206, 0.157]) # 计算输入图像直方图 hist_input = cv2.calcHist([input_image], [0], None, [8], [0, 8]) hist_input = hist_input.flatten() / (input_image.shape[0] * input_image.shape[1]) # 计算输入图像的累积分布函数 (CDF) cdf_input = np.cumsum(hist_input) # 计算规定直方图的累积分布函数 (CDF) cdf_specified = np.cumsum(specified_hist) # 创建映射表 mapping = np.zeros(8, dtype=np.uint8) for i in range(8): diff = np.abs(cdf_input[i] - cdf_specified) mapping[i] = np.argmin(diff) # 应用映射表到输入图像 matched_image = mapping[input_image] # 输出结果 print("输入图像:") print(input_image) print("匹配后的图像:") print(matched_image) # 绘制直方图 plt.figure(figsize=(12, 4)) plt.subplot(131) plt.bar(range(8), hist_input) plt.title('Input Image Histogram') plt.subplot(132) plt.bar(range(8), specified_hist) plt.title('Specified Histogram') plt.subplot(133) hist_matched = cv2.calcHist([matched_image], [0], None, [8], [0, 8]) hist_matched = hist_matched.flatten() / (matched_image.shape[0] * matched_image.shape[1]) plt.bar(range(8), hist_matched) plt.title('Matched Image Histogram') plt.show() ``` 上述代码中,首先定义了输入图像和规定直方图。然后计算输入图像直方图以及输入图像和规定直方图的累积分布函数(CDF)。接着,创建一个映射表,将输入图像的每个灰度级映射到规定直方图中最接近的灰度级。最后,应用这个映射表到输入图像上,得到匹配后的图像,并绘制输入图像、规定直方图和匹配后图像直方图,以便直观观察匹配效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值