图像增强
- 图像增强是一种图像处理的常用方式,可以使改变图像的对比度、亮度等作用
- 关于图像的处理方式:加噪,滤波,图像增强
- 应用场景:
- 对图像进行预处理,增加机器学习的鲁棒性
- 在图像训练集较少的情况下,可以通过图像增强或加噪滤波等方式多模糊出几张图片供训练使用,其目的也是增加模型的鲁棒性
图像增强技术分类
- 点处理技术:只对单个像素进行处理
- 领域处理技术:对像素点及其周围的点进行处理(使用卷积核)
点处理技术
线性变换
- 作用:对图像的对比度和亮度进行调整
- 公式:y = a*x + b
- 参数a影响图像的对比度,参数b影响图像的亮度
- a > 1:增强图像的对比度,图像看起来更加清晰
- a < 1:减小图像的对比度,图像看起来更加模糊
- b > 0:图像变亮
- b < 0:图像变暗
- a = -1 and b = 255:图像像素反转,也就是对比度和亮度都会与之前进行一个反转
分段线性变换
- 作用:对图像对比度进行调整,与线性变换不同的是:分段是对某个感兴趣的区域x,将其对比系数a增大或减小,从而增大或减小这个区域的对比度
对数变换
- 原理:对数变换将图像的低灰度值部分扩展,将其高灰度值部分压缩
- 目的:强调图像低灰度部分,可以很好的压缩像素值变化较大的图像的动态范围,突出我们想要的细节
- 公式:y = c * log(1 + x)
- 个人理解:log计算对于硬件来说比加减乘除效率要低,不是很常用
幂律变换
- 作用:图像矫正,对漂白或过黑的图像进行矫正处理
- 公式:y = c * xγ
- 根据γ的大小,可以分为以下两种情况
- γ > 1:处理漂白图片,进行灰度级压缩
- γ < 1:处理过黑的图片,对比度增强,使得细节看的更清楚
领域处理技术
直方图均衡化
- 直方图均衡化是将原图像的直方图通过变换函数变为均匀的直方图,然后按均匀直方图修改原图像,从而获得一副灰度分布均匀的新图像
- 用途:图像增强,将图像中的像素值进行均衡化处理
- 实现步骤:
-
依次扫描原始灰度图像的每一个像素,计算出图像的灰度直方图H
-
计算灰度值累加直方图
- 对于输入图像的任意一个像素p, p∈[0,255], 总能在输出图像里有对应的像素q, q∈[0,255] 使得下面等式成立(输入和输出的像素总量相等)
- 累加直方图公式:
- 输出图像每个灰度级的个数:
- 代入累加直方图
-
根据累加直方图和直方图均衡化原理得到输入与输出之间的映射关系
- 这里的input(k) 是这个像素值对应的个数
-
最后根据映射关系得到结果:dst(x,y) = H’(src(x,y))进行图像变换
-
- 代码展示:
- 灰度图:
import cv2
from matplotlib import pyplot as plt
# 灰度图
img = cv2.imread("lenna.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 灰度图像直方图均衡化
'''
equalizeHist—直方图均衡化
函数原型: equalizeHist(src, dst=None)
src:图像矩阵(单通道图像)
dst:默认即可
'''
dst = cv2.equalizeHist(gray)
plt.figure()
plt.hist(dst.ravel(), 256)
plt.hist(gray.ravel(), 256)
plt.show()
cv2.imshow("Histogram Equalization", np.hstack([gray, dst]))
cv2.waitKey(0)
- 彩色图
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("lenna.png", 1)
cv2.imshow("src", img)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
result = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
chans = cv2.split(result)
colors = ("r","g","b")
plt.figure()
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()
cv2.imshow("dst_rgb", result)
cv2.waitKey(0)
- 原图直方图
- 原图和直方图均衡化后的图像
- 均衡化后的直方图
滤波&卷积操作
- 卷积与滤波的区别:
- 卷积操作在做乘积之前,需要先将卷积核翻转180度,之后再做乘积。
- 常见滤波:
- 均值滤波
- 高斯平滑
- 中值滤波:用于去除椒盐噪声
- 最大最小值滤波:对像素点去除中心点后进行从小到大排序,如果中心点小于排序后的最小值则取排序中的最小值,如果中心点大于排序后的最大值则取排序中的最大值,否则不变
- 均值滤波