1 直方图
1.1 基本原理
直方图是一种二维统计图表,他的两个坐标分别是统计样本(图像、视频帧)和样本的某种属性(亮度,像素值,梯度,方向,色彩等等任何特征)。
对于图像来说,直方图的横坐标代表像素值,纵坐标代表对应像素值的个数。
任一幅图像,都能唯一地算出一幅与它对应的直方图。但不同的图像,可能有相同的直方图。即图像与直方图之间是多对一的映射关系。
1.2 相关代码
def histogram1(img):
image = img.copy()
chans = cv2.split(image)
colors = ("b","g","r")
plt.figure()
plt.title("Histogram")
plt.xlabel("Bins")
plt.ylabel("number of Pixels")
for (chan,color) in zip(chans,colors):
hist = cv2.calcHist([chan],[0],None,[256],[0,256])
plt.plot(hist,color = color)
plt.xlim([0,256])
plt.show()
1.3 实验结果
原图:
直方图:
2 高斯滤波
2.1 基本原理
数值图像处理中,高斯滤波主要可以使用两种方法实现。一种是离散化窗口滑窗卷积,另一种方法是通过傅里叶变化。最常见的就是滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常搭的情况下,可能会考虑基于傅里叶变化的实现方法。所以本文将主要介绍滑窗实现的卷积。
离散化窗口划船卷积时主要利用的是高斯核,高斯核的大小为奇数,因为高斯卷积会在其覆盖区域的中心输出结果。常用的高斯模板有如下几种形式:
高斯模板是通过高斯函数计算出来的,公式如下:
将各个位置的坐标带入到高斯函数G中,得到的每个值按照位置排列,就得到了模板。
这样输出的模板有两种形式:
① 小数类型:直接计算得到的值,没有经过任何处理。
② 整数类型:将得到的值进行归一化处理,即将坐上叫的值归一化为1,其他每个系数都除以左上角的系数,然后取整。在使用整数模板时,则需要在模板的前面加一个系数,该系数为模板系数之和的倒数。
高斯滤波模板中最重要的参数就是高斯分布的标准差σ。它代表着数据的离散程度,如果σ较小,那么生成的模板中心系数越大,而周围的系数越小,这样对图像的平滑效果就不是很明显;相反,σ较大时,则生成的模板的各个系数相差就不是很大,比较类似于均值模板,对图像的平滑效果就比较明显。
2.2 相关代码
def GaussianBlur1(img):
#(3, 3)表示高斯滤波器的长和宽都为5,3表示滤波器的标准差
out=cv2.GaussianBlur(img,(5,5),3)
cv2.imwrite('out.jpg',out)
2.3 实验结果
3 直方图均衡化
3.1 基本原理
直方图均衡化是通过拉伸像素强度的分布范围,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。
equalizeHist()函数实现的图像直方图均衡化算法就是把直方图的每个灰度级进行归一化处理,求每种灰度的累积分布,得到一个映射的灰度映射表,然后根据相应的灰度值来修正原图中的每个像素的像素值。
3.2 相关代码
def histogram_equalization(img):
image = img.copy()
(b,g,r) = cv2.split(image)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH,gH,rH))
cv2.imshow("result",result)
3.3 实验结果
均衡化后的图像