python3+opencv 使用灰度直方图来判断图片的亮暗操

1. 简介

在计算机视觉中,判断一张图片的亮暗程度是一个很重要的问题。通过对图片的灰度直方图进行分析,我们可以粗略地判断图片的亮暗程度。本文将介绍如何使用Python3和OpenCV来进行灰度直方图分析,从而判断图片的亮暗程度。

2. 灰度直方图

灰度直方图是用来统计一张图片中不同灰度级别像素的数量的图表。它反映了图片中每个灰度级别所占比例的分布情况。通过分析直方图的形状,我们可以得出图片的亮暗程度。

2.1 灰度图像

灰度图像是一种只包含单通道的图像。每个像素的值表示了该像素在整个灰度级别范围内的亮度大小。例如,灰度图像中的黑色像素的值为0,白色像素的值为255,其他灰度值则介于0和255之间。

2.2 灰度直方图的生成

在Python中,我们可以使用OpenCV库来生成一张灰度图像的灰度直方图。

import cv2

import matplotlib.pyplot as plt

# 读取图片

image = cv2.imread('image.jpg')

# 转换为灰度图像

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 计算灰度直方图

histogram = cv2.calcHist([gray_image], [0], None, [256], [0, 256])

# 画出直方图

plt.plot(histogram)

plt.xlabel('灰度级别')

plt.ylabel('像素数量')

plt.show()

上述代码首先使用cv2.imread()函数读取一张图片,然后使用cv2.cvtColor()函数将其转换为灰度图像。接着,使用cv2.calcHist()函数计算灰度直方图,并将结果存储在histogram变量中。最后,使用plt.plot()函数画出直方图。

3. 判断图片的亮暗程度

根据直方图的形状,我们可以大致判断一张图片的亮暗程度。通常情况下,亮度较高的图片的直方图会偏向于右侧,而亮度较低的图片的直方图会偏向于左侧。

3.1 直方图均衡化

直方图均衡化是一种用来增强图像亮度和对比度的方法。它通过重新分布灰度级别,使图像中灰度级别分布更加均匀,从而提高图像的亮暗程度。

# 对灰度图像进行直方图均衡化

equalized_image = cv2.equalizeHist(gray_image)

# 显示原图和均衡化后的图像

plt.subplot(121)

plt.imshow(gray_image, cmap='gray')

plt.title('原图')

plt.subplot(122)

plt.imshow(equalized_image, cmap='gray')

plt.title('均衡化后的图像')

plt.show()

上述代码首先使用cv2.equalizeHist()函数对灰度图像进行直方图均衡化,然后使用plt.imshow()函数分别显示原图和均衡化后的图像。

3.2 计算亮暗程度

通过比较均衡化前后的直方图,我们可以得出一张图片的亮暗程度。直方图的均衡化后,亮度较高的图片的直方图会更加平坦,而亮度较低的图片的直方图则会更加峰值化。

# 计算均衡化前后的直方图

histogram_before = cv2.calcHist([gray_image], [0], None, [256], [0, 256])

histogram_after = cv2.calcHist([equalized_image], [0], None, [256], [0, 256])

# 显示均衡化前后的直方图

plt.subplot(121)

plt.plot(histogram_before)

plt.xlabel('灰度级别')

plt.ylabel('像素数量')

plt.title('均衡化前的直方图')

plt.subplot(122)

plt.plot(histogram_after)

plt.xlabel('灰度级别')

plt.ylabel('像素数量')

plt.title('均衡化后的直方图')

plt.show()

上述代码首先使用cv2.calcHist()函数分别计算均衡化前后的直方图,并分别将结果存储在histogram_beforehistogram_after变量中。然后,使用plt.plot()函数画出均衡化前后的直方图。

4. 结论

本文介绍了如何使用Python3和OpenCV来使用灰度直方图来判断一张图片的亮暗程度。通过分析直方图的形状,我们可以粗略地判断图片的亮暗程度。此外,通过直方图均衡化,我们还可以增强图像的亮度和对比度。

使用灰度直方图来判断图片的亮暗程度是一个简单而有效的方法,但也有一定的局限性。对于某些特殊类型的图片,如高对比度图片或含有大面积黑色或白色区域的图片,直方图可能无法准确判断亮暗程度。

因此,在实际应用中,我们可能需要结合其他方法来对图片的亮暗程度进行更准确的判断。

后端开发标签