文章目录
histograms直方图1 使用opencv来计算直方图2 grayscale histograms灰度直方图3 color histograms彩色直方图4 彩色二维直方图5 histogram equalization直方图均一化6 histograms and masks带遮罩的直方图histograms直方图
什么是直方图?
直方图就是描述像素强度intensity的分布图。如果是在RGB空间中,那么这个强度就指代某个像素在特定某一通道的值,一般是0-255。
在制作直方图的时候,X轴可以理解为箱子bin,如果有两个箱子,那么像素值(强度)在[0 128)区间的像素点就落在第一个箱子,[128 255)的像素点就落在第二个箱子。箱子的高度就是像素点的个数。
1 使用opencv来计算直方图
标准公式为
hist = cv2.calcHist(images, channels, mask, histSize, ranges)
channels
是一个列表list格式,list里面装了indexs向量。例如一个RGB的3个通道,分别为[0, 1, 2],如果是一个灰度图grayscale,那么只有一个通道,所以表示为[0]。
histSize
表示把像素值离散化的程度,例如可以把RGB三个通道分别映射成32个子集,此时histSize为[32, 32, 32],这三个数字可以各不相同。
ranges
指定像素值的分布范围,例如RGB图像的像素分布一般是[0, 256],但是其他色彩空间,例如HSV就可能会不一样。
2 grayscale histograms灰度直方图
核心公式如下,注意cv2.calcHist()
里面除了mask
其他都是列表的数据格式。
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)hist = cv2.calcHist([image], [0], None, [256], [0,256])plt.figure()plt.plot(hist)
3 color histograms彩色直方图
绘制各个通道的彩色直方图
# 首先进行通道分离channels = cv2.split(image)colors = ("blue", "green", "red")# 分别对BGR三个通道画直方图for (channel, color) in zip(channels, colors):hist cv2.calcHist([channel], [0], None, [256], [0,256])plt.plot(hist, color = color)
4 彩色二维直方图
fig = plt.figure()# 新建一个操作句柄ax = fig.add_subplot(131)hist = cv2.calcHist([channel[1],channel[0]], [0,1], None, [32,32], [0,256,0,256])p = ax.imshow(hist, interpolation = "nearest")ax.set_title("2D color histograms for Green and Blue")plt.colorbar(p)ax = fig.add_subplot(132)...print("2D histogram shape is {}, with {} values".format(hist.shape, hist.flatten().shape[0]))
5 histogram equalization直方图均一化
# 这个只是直方图的均一化,并不涉及图像的改变eq = cv2.equalizeHist(image)cv2.imshow("histogram equalization", np.hstack([iamge, eq]))
可以看到,原来图像的颜色相对集中在中等亮度段,而现在的图像白色和黑色部分增多(即对比度增强)。
6 histograms and masks带遮罩的直方图
首先创建遮罩
# 创建画布mask = np.zeros(image.shape[:2], dtype = "uint8")# 画出一个白色填充的矩形cv2.rectange(mask, (15,15), (130,100), 255, -1)cv2.imshow("mask", mask)
接着将遮罩覆盖到原来的图像上
# 将遮罩和图像做加的位运算masked = cv2.bitwise_and(image, image, mask = mask)cv2.imshow("applying the mask", masked)
最后计算遮罩区域的直方图
# 直接调用函数plot_histogram(image, "histogram for masked image", mask = mask)
被调用函数为
def plot_histogram(image, title, mask = None):channel = cv2.split(image)colors = ("b","g","r")plt.figure()plt.title(title)for (channel, color) in zip(channels, colors):hist = cv2.calcHist([channes], [0], mask, [256], [0,256])plt.plot(hist, color = color)plt.xlim([0,256])
如果觉得《OpenCV-python学习笔记(三)——histograms直方图》对你有帮助,请点赞、收藏,并留下你的观点哦!