图像对比度与像素强度直方图

加载图像以获取像素强度直方图

首要任务是将图像加载到系统内存中。为此,需要导入脚本中必要的包。

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

使用imread()方法将图像加载到系统RAM中。将使用灰度色彩格式:

image = cv2.imread("path_to_image.jpg", cv2.IMREAD_GRAYSCALE)

接下来,设置显示配置:

cv2.imshow("Grayscale Image", image) cv2.waitKey(0) cv2.destroyAllWindows()

输出将如下所示:

然后,将打印图像的形状以了解像素的数量:

print(image.shape) print('Total Number Of Pixels In GRAYSCALE Image:', image.shape[0] * image.shape[1])

输出将如下所示:

如上图所示,正在处理大量的像素。

绘制灰度图像的像素强度直方图

为了绘制可视化图形,将使用Python编程语言中可用的Matplotlib包。具体来说,将使用hist()方法,该方法可通过Matplotlib包使用。该方法接受多个参数,强烈建议查阅文档以进一步阅读和探索。以下是一些参数:

将关注三个特定的参数:

x: 这是将输入输入数组的参数。数组可以是一维的或多维的(2D+)。

bins: 它将接受一个整数值,表示直方图中的箱子数量。每个箱子将具有相同的宽度。

range: 这是一个包含两个值的列表或元组,表示箱子的最小和最大范围。本质上得到的输出是一个直方图,其中每个箱子是一个像素强度(从0到255),箱子的高度显示图像中属于该特定强度值的像素数量。

在统计学中,直方图将计算满足标准的值的数量,并将它们集体存储在一个称为箱子的垂直条中。在像素场景中,试图计算属于每个值从0到255的像素数量。

视觉将找到给定范围内的每个值的计数,通过计算和增加输入数组中的值,即x。每个值将有自己的箱子,其中将收集计数。

为了绘制像素强度直方图,尝试如下操作:

import matplotlib.pyplot as plt plt.hist(x=image.ravel(), bins=256, range=[0, 256], color='crimson') plt.title("Histogram Showing Pixel Intensities And Counts", color='crimson') plt.ylabel("Number Of Pixels Belonging To The Pixel Intensity", color="crimson") plt.xlabel("Pixel Intensity", color="crimson") plt.show()

上述代码块的逐行解释如下:

首先导入所需的包/依赖项。

import matplotlib.pyplot as plt

接下来,使用hist()方法为提供一个直方图模板。向模板传递一个输入数组,即图像。但请注意,使用了NumPy包中提供的ravel()方法。ravel()方法将压缩一个多维数组(2D+)到一个单维数组(1D)。

plt.hist(x=image.ravel(), bins=256, range=[0, 256], color='crimson')

使用title()方法为直方图提供一个标题,并指定所选颜色。可以以文本形式输入名称,或提供十六进制颜色值。

plt.title("Histogram Showing Pixel Intensities And Counts", color='crimson')

然后,为图表的y轴提供标签,并指定所需的颜色。

plt.ylabel("Number Of Pixels Belonging To The Pixel Intensity", color="crimson")

尝试对图表的x轴做同样的事情,并指定所选颜色。

plt.xlabel("Pixel Intensity", color="crimson")

最后,在屏幕上显示图表。

plt.show()

上述代码块的输出将如下所示:

为了支持直方图,查看灰度图像本身,会发现图像左侧有大量深色阴影,这在直方图中反映为属于较低像素强度的大量像素,知道这是黑色。注意,当在灰度图像中向右移动时,白色像素的浓度增加,黑色像素减少。这在直方图中也有所体现。注意,在直方图的左侧,更多的像素属于白色阴影。

增强图像对比度

为了增加图像中像素的对比度,需要使用OpenCV包提供的equalizeHist()方法。

有一个关键参数需要指定:

src: 这是输入源图像,以数组形式存在。即对比度将增加的图像。

equalizeHist()方法将规范化(平滑)图像的亮度,从而尝试增加图像的对比度。

根据手头的任务,让尝试进行增加图像对比度的过程:

image_enhanced = cv2.equalizeHist(src=image) cv2.imshow("Enhanced Contrast", image_enhanced) cv2.waitKey(0) cv2.destroyAllWindows()

上述代码块的输出将如下所示:

如上图所示,整个图像的对比度已经增加。可以通过查看增强对比度图像的像素直方图来确认对比度已经增加。

plt.hist(image_enhanced.ravel(), 256, [0,256], color="blue") plt.title("Pixel Intensities And Counts In Enhanced Image", color="crimson") plt.ylabel("Number Of Pixels Belonging To Pixel Intensity", color="crimson") plt.xlabel("Pixel Intensity", color="crimson") plt.show()

因此,通过新像素强度直方图得到加强,可以看到像素强度的范围已经通过直方图均衡技术大大减少。该方法有效地规范化了图像中的像素,并限制了像素的强度,从而使像素的颜色范围受到限制。这正如所知,已经减少了图像的亮度,并增加了对比度。

这就是关于高级图像对比度-像素强度直方图的文章。希望喜欢阅读这篇文章,并学习了关于Python编程语言中OpenCV包的新概念。

感谢时间。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485