学习图像处理基础章节内容,包括直方图、高斯滤波、直方图均衡化的结果及其基本原理。
基本原理
直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
而在图像处理中,图像直方图是描述图像中该灰度级的像素个数(出现频率),其中,横坐标表示灰度级,纵坐标表示图像中该灰度级出现的个数(频率)。反映了图像中的灰度分布规律。
python代码实现:
import cv2
import matplotlib.pyplot as plt
# 读取图片信息, imread() 函数内放图片路径
img = cv2.imread("../image/nuo.jpg")
# 展示图片
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 调用 matplotlib.pyplot 库中的 hist 函数绘制出直方图
# ravel() 函数用于返回包含 n 维输入数组的所有元素的一维数组
plt.hist(img.ravel(), 256)
plt.show()
运行结果如下:
展示的图片:
基本原理
直方图均衡化是将原始图片中比较集中的灰度区间变成全部灰度区间的均匀分布。实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。
虽然直方图均衡化增强了图像的对比度,但因为对象元的修改,使得变化后图像的灰度级减少,一些细节消失。
python代码实现:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 直方图均衡化时,需要在使用 imread 读取时加一个 0
# 这样读取的就是灰度图片,不然读取的是彩色图片
# 才可以使用 equalizeHist 函数 进行直方图均衡化
img = cv2.imread('../image/s.jpg',0)
# 均衡化函数 equalizeHist
equ = cv2.equalizeHist(img)
# 展示图片
cv2.imshow('img',img)
cv2.imshow('equ',equ)
cv2.waitKey()
cv2.destroyAllWindows()
# 创建一个 figure
fig = plt.figure("直方图对比")
# 初始图片的直方图
fig1 = fig.add_subplot(121)
fig1.hist(img.ravel(), 256)
# 均衡化后的直方图
fig2 = fig.add_subplot(122)
fig2.hist(equ.ravel(),256)
plt.show()
运行结果如下:
原图:
均衡化后的图片:
直方图的对比:
左边是读取的初始图片的直方图,右边是均衡化后的图片的直方图
基本原理
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。
高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
python代码实现:
# opencv函数 cv2.GaussianBlur(img,(3,3),1.3) 实现高斯滤波
import cv2
import numpy as np
img = cv2.imread('../image/q.jpg')
rows, cols, chn = img.shape
# (3, 3)表示高斯滤波器的长和宽都为3,0表示滤波器的标准差
out = cv2.GaussianBlur(img, (3, 3), 0)
cv2.imshow("img", img)
cv2.imshow('out', out)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
左边是原图,右边是经过高斯滤波处理过后的,可以看经高斯滤波出处理过的图片会更加平滑。
高斯滤波处理后能降低噪声的影响,因此可以在原图添加噪声,来进行比较。
在上述代码中加入噪声:
# 添加噪声
for i in range(1000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
img[x, y, :] = 255
运行结果:
可以看到经高斯滤波处理后,降低了噪声点的影响。