首要任务是将图像加载到系统内存中。为此,需要导入脚本中必要的包。
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包的新概念。
感谢时间。