Python OpenCV 图像处理之图像直方图

作者:蛮不讲李2024.02.04 18:14浏览量:149

简介:本文将介绍如何使用Python的OpenCV库来处理图像直方图,包括计算直方图、归一化直方图、均衡化图像等。我们将通过实例和图表来解释这些概念,并给出实际应用的建议。

在Python的OpenCV库中,图像直方图是一种重要的图像处理工具。直方图用于描述图像中每个像素强度的分布情况,从而帮助我们了解图像的整体亮度和对比度特征。通过调整直方图,我们可以改善图像的视觉效果,提高对比度或者改变图像的整体色调。
一、计算直方图
在OpenCV中,可以使用calcHist函数来计算图像的直方图。这个函数可以计算一维、二维或者多维的直方图。对于灰度图像,我们可以计算一维直方图;对于彩色图像,则需要计算二维直方图(分别针对R、G、B三个通道)。
下面是一个简单的例子,演示如何计算灰度图像的直方图:

  1. import cv2
  2. import numpy as np
  3. # 读取灰度图像
  4. img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
  5. # 计算直方图
  6. hist = cv2.calcHist([img], [0], None, [256], [0, 256])
  7. # 绘制直方图
  8. plt.plot(hist)
  9. plt.xlim([0, 256])
  10. plt.show()

这段代码将读取名为’image.jpg’的灰度图像,然后计算其直方图,并使用matplotlib库将其绘制出来。
二、归一化直方图
归一化直方图是将直方图的值进行归一化处理,使其总和为1。这样可以更好地比较不同图像的直方图,或者在同一个图像上进行不同区域的比较。在OpenCV中,可以使用normalize函数对直方图进行归一化处理。
下面是一个归一化直方图的示例代码:

  1. import cv2
  2. import numpy as np
  3. # 读取灰度图像
  4. img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
  5. # 计算直方图
  6. hist = cv2.calcHist([img], [0], None, [256], [0, 256])
  7. # 归一化直方图
  8. hist_norm = cv2.normalize(hist, hist, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
  9. # 绘制归一化直方图
  10. plt.plot(hist_norm)
  11. plt.xlim([0, 256])
  12. plt.show()

这段代码将读取灰度图像,计算其直方图,然后进行归一化处理,并绘制出归一化后的直方图。
三、均衡化图像
均衡化图像是一种常用的改善图像对比度的方法。通过均衡化处理,可以使图像的像素强度分布更加均匀,从而提高对比度。在OpenCV中,可以使用equalizeHist函数进行图像的均衡化处理。
下面是一个均衡化图像的示例代码:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
pix = (100np.cumsum(hist))/255 #累积分布函数 CDF(累积频率分布)
cdf = np.zeros((256,1))
for i in range(1,256):
cdf[i] = cdf[i-1] + hist[i]
cdf = cdf/cdf[255]
cdf_inv = np.zeros((256,1))
for i in range(1,256):
cdf_inv[i] = (cdf[i-1]
255 + cdf[i]*pix[i])/cdf[i]
eq = np.zeros((img.shape[0],img.shape[1]))
for i in range(0,img.shape[0]):
for j in range(0,img.shape