opencv学习笔记(十)
hist = cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
images
:输入的图像,可以是单张图像或图像列表。在函数中需要用中括号 【】,且原图像格式应该是uint8或者floa32channels
:指定要计算直方图的通道索引,对于灰度图像为[0]
,对于彩色图像可以指定[0]
、[1]
、[2]
分别代表蓝色、绿色和红色通道,即对应。mask
:可选参数,用于指定要计算直方图的区域,如果不指定或者None则计算整个图像的直方图。histSize
:指定直方图的大小,可以是一个整数或一个整数列表,表示每个通道的直方图的 bin 数量,也用【】括起来。ranges
:指定直方图的范围,通常为[0, 256]
,表示像素值的范围。
ravel()
是 NumPy 数组对象的一个方法,用于将多维数组转换为一维数组。它返回一个视图,而不是创建新的数据副本。
plt.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, color=None, label=None, stacked=False, *, data=None, **kwargs)
x
:输入的一维数据数组,用于绘制直方图。bins
:直方图的 bin(箱)的数量或定义的 bin 边界。默认为None
,表示自动计算 bin 数量。range
:直方图的范围。默认为None
,表示使用数据的范围。density
:是否将直方图归一化为概率密度。默认为False
。weights
:用于指定每个数据点的权重。默认为None
。cumulative
:是否绘制累积直方图。默认为False
。
其他参数用于设置直方图的样式、颜色、标签等。
#图像直方图 import cv2 import numpy as np import matplotlib.pyplot as plt def cv_show(img,name): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows() img = cv2.imread('C:/Users/hellou/Desktop/beautiful.jpg',0) hist = cv2.calcHist([img],[0],None,[256],[0,256]) plt.hist(img.ravel(),256) """ravel()方法介绍:不论矩阵的维度是多少。使用ravel()可以让矩阵统统变为一维数组 调用方法:plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False) 参数说明: bottom:可以为直方图的每个条形添加基准线,默认为0; histtype:指定直方图的类型,默认为bar,除此还有’barstacked’, ‘step’, ‘stepfilled’; align:设置条形边界值的对其方式,默认为mid,除此还有’left’和’right’; orientation:设置直方图的摆放方向,默认为垂直方向; rwidth:设置直方图条形宽度的百分比; log:是否需要对绘图数据进行log变换; color:设置直方图的填充色; label:设置直方图的标签,可通过legend展示其图例; stacked:当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放; """ plt.show() color = ('b','g','r') for i in enumerate(color): histr = cv2.calcHist([img],[0],None,[256],[0,256]) plt.xlim([0,256]) plt.show()
matplot统计的是rbg图像,而opencv统计的是bgr图像
均衡化原理:
在图像处理中,掩码(Mask)是一个二进制图像,用于指示某些区域的位置或选择。掩码图像与原始图像具有相同的大小,但只有在掩码中对应位置为 1 的像素才被视为有效或需要处理的像素。
使用掩码可以实现以下操作:
-
区域选择:通过将掩码中感兴趣的区域设置为白色(像素值为 255),其余区域设置为黑色(像素值为 0),可以选择图像中特定区域进行处理或分析。
-
掩码运算:通过将两个掩码图像进行逻辑运算,可以合并、相交或排除两个区域。例如,可以通过逻辑与运算(AND)来获取两个掩码中相交区域的结果。
cv2.bitwise_and()
函数进行逻辑与运算,得到两个掩码的相交区域。使用cv2.bitwise_or()
函数进行逻辑或运算,得到两个掩码的合并区域。使用cv2.bitwise_not()
函数进行逻辑非运算,得到第一个掩码的补集。 -
遮罩操作:将掩码应用于原始图像,只保留掩码中为白色的像素,而将其他像素设置为透明或特定颜色,可以实现图像的遮罩效果。
直方图均衡化:
具体步骤如下
-
将彩色图像转换为灰度图像:如果原始图像是彩色图像,首先将其转换为灰度图像。
-
计算灰度直方图:计算灰度图像的直方图,即统计每个灰度级的像素数量。
-
计算累积直方图:计算灰度直方图的累积分布函数(CDF),表示小于或等于给定灰度级的像素的累积概率。
-
根据累积直方图进行像素映射:使用CDF对原始图像中的每个像素值进行映射,将像素值映射到新的灰度级。这可以通过线性插值或其他映射函数来实现。
-
创建均衡化后的图像:使用调整后的像素值创建均衡化后的图像。
#直方图均衡化 import cv2 import matplotlib.pyplot as plt import numpy as np def cv_show(img,name): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows() img = cv2.imread('C:/Users/hellou/Desktop/self-image.jpg', 0) img = cv2.resize(img,(600,600)) plt.hist(img.ravel(), 256) plt.show() equ = cv2.equalizeHist(img) plt.hist(equ.ravel(), 256) plt.show() #均衡化处理后的区别 res = np.hstack((equ,img)) cv_show(res,"res") """因为整体平均了,所以会有部分细节进行丢失 进行分块均衡化处理,但是容易被噪音点干扰""" clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) res_clache = clahe.apply(img) res = np.hstack((img, equ,res_clache)) cv_show(res,'res')