使用直方图分析图像的 OpenCV Python程序
本文讨论了使用 Matplotlib 和 OpenCV 进行图像分析。我们先来了解如何对各种风格的图像数据进行实验,以及如何用直方图表示。
先决条件:
- 开放式CV
- matplotlib
导入图像数据
import matplotlib.pyplot as plt #importing matplotlib
该图像应在 PNG 文件中使用,因为 matplotlib 仅支持 PNG 图像。这里,它是本示例中使用的 24 位 RGB PNG 图像(R、G、B 各 8 位)。每个内部列表代表一个像素。在这里,对于 RGB 图像,有 3 个值。对于 RGB 图像,matplotlib 支持 float32 和 uint8 数据类型。
img = plt.imread('flower.png') #reads image data
在 Matplotlib 中,这是使用imshow()函数执行的。在这里,我们抓取了绘图对象。
关于直方图
直方图被认为是与灰度图像中像素频率相关的图形或绘图
像素值(范围从 0 到 255)。灰度图像是每个像素的值为单个样本的图像,即它只携带像素值从0到255变化的强度信息。这种图像也称为黑白图像,由完全是灰色阴影,从最弱的黑色到最强的白色,像素可以被视为图像中的每个点。
灰度图像的外观如何:
它量化了所考虑的每个强度值的像素数。在浏览直方图之前,让我们从这个给定的例子中大致了解一下。
在这里,我们可以直观地了解该图像的对比度、亮度、强度分布等。我们可以看到图像及其直方图是为灰度图像而不是彩色图像绘制的。
直方图的左侧区域显示图像中较暗像素的数量,右侧区域显示较亮像素的数量。
使用 numpy 数组创建直方图
要创建图像数据的直方图,我们使用 hist()函数。
plt.hist(n_img.ravel(), bins=256, range=(0.0, 1.0), fc='k', ec='k') #calculating histogram
在我们的直方图中,看起来像灰度图像的黑白像素在整个图像上都有强度分布。
从直方图中,我们可以得出结论,暗区多于亮区。
现在,我们将处理由像素值变化的像素强度分布组成的图像。首先,我们需要使用 OpenCV 内置函数计算直方图。
直方图计算
在这里,我们使用 cv2.calcHist()(OpenCV 中的内置函数)来查找直方图。
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
images :它是 uint8 或 float32 类型的源图像,表示为“[img]”。
通道:它是我们计算直方图的通道索引。对于灰度图像,其值为 [0] 并且
彩色图像,您可以通过 [0]、[1] 或 [2] 分别计算蓝色、绿色或红色通道的直方图。
掩码:掩码图像。为了找到完整图像的直方图,它被指定为“无”。
histSize :这代表我们的 BIN 计数。对于全尺寸,我们通过 [256]。
范围:这是我们的范围。通常,它是 [0,256]。
例如:
# load an image in grayscale mode
img = cv2.imread('ex.jpg',0)
# calculate frequency of pixels in range 0-255
histg = cv2.calcHist([img],[0],None,[256],[0,256])
然后,我们需要绘制直方图来显示图像的特征。
绘制直方图
使用 Matplotlib 分析:
# importing required libraries of opencv
import cv2
# importing library for plotting
from matplotlib import pyplot as plt
# reads an input image
img = cv2.imread('ex.jpg',0)
# find frequency of pixels in range 0-255
histr = cv2.calcHist([img],[0],None,[256],[0,256])
# show the plotting graph of an image
plt.plot(histr)
plt.show()
输入:
输出:
插图显示图像的每个像素数位于 0 到 255 的范围内。在第二个示例中,它直接找到直方图并绘制它。我们不需要使用 calcHist()。请看下面的代码:
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('ex.jpg',0)
# alternative way to find histogram of an image
plt.hist(img.ravel(),256,[0,256])
plt.show()
输出:
因此,我们得出结论,图像可以表示为直方图,以构想图像上的强度分布的概念并进一步提高其宁静度。
参考:
- http://docs.opencv.org/2.4/doc/tutorials/imgproc/table_of_content_imgproc/table_of_content_imgproc.html#table-of-content-imgproc
- http://www.cambridgeincolour.com/tutorials/histograms1.htm