失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > OpenCV-python学习笔记(三)——histograms直方图

OpenCV-python学习笔记(三)——histograms直方图

时间:2023-10-20 04:23:53

相关推荐

OpenCV-python学习笔记(三)——histograms直方图

文章目录

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直方图》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。