【机器视觉】一文掌握常见图像增强算法。 - 指南

1、引言

小屌丝:鱼哥,你可算是回来了
小鱼:时间如梭啊~
小屌丝:听你这意思,是不想回来?
小鱼:那倒没有,哪里都不如自己的国家啊。
小屌丝:这话说得带劲
小鱼:这也是我们国家给我们的自豪感。
小屌丝:你说的是这个么?
在这里插入图片描述

小鱼:看来,你也是关注咱的军事动态啊。
小屌丝:那我的夸夸你啊, 在国外,也关注国家的军事动态
小鱼:这得夸"咱妈"啊: 福建舰入列,H2O也快入列…
小屌丝:呱唧呱唧
小鱼:你看天也冷了,咱边泡澡,边聊?
小屌丝:不急,我有一个问题。
小鱼:打住,你是不是想问 图像算法的是?
小屌丝:呦呵~ 鱼哥,你这又神啊,咋知道的?
小鱼:边泡澡边聊
小屌丝:行啊~

2、图像增强概述

2.1 定义

图像增强是指通过一系列技术手段改善图像视觉效果或将图像转换成更适合人或机器分析处理的形式的技术过程。其主要目标包括:

  • 改善图像的主观视觉质量
  • 突出图像中的特定信息
  • 抑制不希望的噪声或失真
  • 增强图像中的某些特征以供后续处理

2.2 分类体系

根据处理域的不同,图像增强算法可分为以下几大类:

图像增强算法
├── 空间域增强
│   ├── 点运算
│   │   ├── 灰度变换
│   │   ├── 直方图处理
│   │   └── 对比度增强
│   └── 邻域运算
│       ├── 平滑滤波
│       └── 锐化滤波
├── 频率域增强
│   ├── 低通滤波
│   ├── 高通滤波
│   └── 同态滤波
└── 彩色图像增强
    ├── 伪彩色增强
    └── 真彩色增强

3、常见图像增强算法

3.1 直方图均衡化

3.1.1 定义

直方图均衡化是一种通过重新分布图像像素强度值来增强图像对比度的技术。
它将输入图像的直方图变换为在整个强度范围内均匀分布的直方图。

3.1.2 算法原理

对于离散图像,直方图均衡化的变换函数为:

s k = T ( r k ) = ∑ j = 0 k n j n s_k = T(r_k) = \sum_{j=0}^{k} \frac{n_j}{n} sk=T(rk)=j=0knnj

其中 r k r_k rk 是输入强度级, s k s_k sk 是输出强度级, n j n_j nj 是强度级 r j r_j rj 的像素数, n n n 是总像素数。

3.1.3 代码示例

import cv2
import numpy as np
import matplotlib.pyplot as plt
def histogram_equalization_demo():
# 读取图像
img = cv2.imread('input.jpg', 0)  # 以灰度模式读取
# 直方图均衡化
equ = cv2.equalizeHist(img)
# 显示原图和结果
plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1)
plt.imshow(img, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.subplot(2, 2, 2)
plt.imshow(equ, cmap='gray')
plt.title('Equalized Image')
plt.axis('off')
plt.subplot(2, 2, 3)
plt.hist(img.flatten(), 256, [0, 256], color='r')
plt.title('Original Histogram')
plt.xlim([0, 256])
plt.subplot(2, 2, 4)
plt.hist(equ.flatten(), 256, [0, 256], color='b')
plt.title('Equalized Histogram')
plt.xlim([0, 256])
plt.tight_layout()
plt.show()
# 执行示例
histogram_equalization_demo()

3.2 伽马校正

3.2.1 定义

伽马校正是一种非线性操作,用于校正图像的亮度响应。
它通过幂律变换调整图像的像素强度

3.2.2 算法原理

V o u t = A ⋅ V i n γ V_{out} = A \cdot V_{in}^{\gamma} Vout=AVinγ

其中 V i n V_{in} Vin 是输入像素值, V o u t V_{out} Vout 是输出像素值, A A A 是常数(通常为1), γ \gamma γ 是伽马值。

3.2.3 代码示例

def gamma_correction_demo():
# 读取图像
img = cv2.imread('input.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 定义伽马值
gamma_values = [0.5, 1.0, 1.5, 2.0]
plt.figure(figsize=(15, 10))
for i, gamma in enumerate(gamma_values):
# 应用伽马校正
inv_gamma = 1.0 / gamma
table = np.array([((j / 255.0) ** inv_gamma) * 255
for j in np.arange(0, 256)]).astype("uint8")
corrected = cv2.LUT(img, table)
plt.subplot(2, 2, i+1)
plt.imshow(corrected)
plt.title(f'Gamma Correction (γ={gamma})')
plt.axis('off')
plt.tight_layout()
plt.show()
# 执行示例
gamma_correction_demo()

3.3 高斯滤波

3.3.1 定义

高斯滤波是一种线性平滑滤波器,使用高斯函数作为卷积核,能有效去除高斯噪声并保留图像边缘信息。

3.3.2 算法原理

G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2

其中 σ \sigma σ 是标准差,控制平滑程度

3.3.3 代码示例

def gaussian_filter_demo():
# 读取图像并添加高斯噪声
img = cv2.imread('input.jpg', 0)
# 添加高斯噪声
noise = np.random.normal(0, 25, img.shape).astype(np.uint8)
noisy_img = cv2.add(img, noise)
# 应用不同大小的高斯滤波器
kernel_sizes = [3, 5, 7, 9]
plt.figure(figsize=(15, 10))
plt.subplot(2, 3, 1)
plt.imshow(img, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.subplot(2, 3, 2)
plt.imshow(noisy_img, cmap='gray')
plt.title('Noisy Image')
plt.axis('off')
for i, ksize in enumerate(kernel_sizes):
# 应用高斯滤波
blurred = cv2.GaussianBlur(noisy_img, (ksize, ksize), 0)
plt.subplot(2, 3, i+3)
plt.imshow(blurred, cmap='gray')
plt.title(f'Gaussian Filter (size={ksize})')
plt.axis('off')
plt.tight_layout()
plt.show()
# 执行示例
gaussian_filter_demo()

3.4 同态滤波

3.4.1 定义

同态滤波是一种在频率域中同时压缩亮度范围和增强对比度的方法,特别适用于处理光照不均匀的图像。

3.4.2 算法原理

同态滤波基于图像的照射-反射模型:
f ( x , y ) = i ( x , y ) ⋅ r ( x , y ) f ( x , y ) = i ( x , y ) ⋅ r ( x , y ) f(x,y) = i(x,y) \cdot r(x,y)f(x,y)=i(x,y)⋅r(x,y) f(x,y)=i(x,y)r(x,y)f(x,y)=i(x,y)r(x,y)

通过对数变换将乘法关系转换为加法关系,在频率域进行滤波,最后通过指数变换恢复图像。

3.4.3 代码示例

def homomorphic_filter_demo():
# 读取图像
img = cv2.imread('input.jpg', 0)
img = np.float32(img) / 255.0
# 同态滤波参数
gamma_l = 0.5  # 低频增益
gamma_h = 2.0  # 高频增益
c = 1.0        # 锐化常数
d0 = 10        # 截止频率
# 获取图像尺寸
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
# 创建同态滤波器
u, v = np.meshgrid(np.arange(cols) - ccol, np.arange(rows) - crow)
d = np.sqrt(u**2 + v**2)
h = (gamma_h - gamma_l) * (1 - np.exp(-c * (d**2 / d0**2))) + gamma_l
# 应用同态滤波
img_log = np.log(img + 1e-6)  # 避免log(0)
img_fft = np.fft.fft2(img_log)
img_fft_shift = np.fft.fftshift(img_fft)
# 频域滤波
filtered_fft = img_fft_shift * h
# 逆变换
filtered_fft_ishift = np.fft.ifftshift(filtered_fft)
filtered_img = np.fft.ifft2(filtered_fft_ishift)
filtered_img = np.real(filtered_img)
# 指数变换
result = np.exp(filtered_img)
result = np.uint8(np.clip(result * 255, 0, 255))
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(np.uint8(img * 255), cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(result, cmap='gray')
plt.title('Homomorphic Filtered Image')
plt.axis('off')
plt.tight_layout()
plt.show()
# 执行示例
homomorphic_filter_demo()

3.5 中值滤波

3.5.1 定义

中值滤波是一种非线性滤波技术,用像素邻域的中值代替该像素值,能有效去除椒盐噪声同时保护图像边缘。

3.5.2 算法原理

3.5.3 代码示例

def median_filter_demo():
# 读取图像并添加椒盐噪声
img = cv2.imread('input.jpg', 0)
# 添加椒盐噪声
noisy_img = img.copy()
salt_pepper_prob = 0.05
# 添加盐噪声
salt_mask = np.random.random(img.shape) < salt_pepper_prob/2
noisy_img[salt_mask] = 255
# 添加椒噪声
pepper_mask = np.random.random(img.shape) < salt_pepper_prob/2
noisy_img[pepper_mask] = 0
# 应用中值滤波
kernel_sizes = [3, 5, 7]
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.imshow(img, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.subplot(2, 2, 2)
plt.imshow(noisy_img, cmap='gray')
plt.title('Noisy Image (Salt & Pepper)')
plt.axis('off')
for i, ksize in enumerate(kernel_sizes):
# 应用中值滤波
filtered = cv2.medianBlur(noisy_img, ksize)
plt.subplot(2, 2, i+3)
plt.imshow(filtered, cmap='gray')
plt.title(f'Median Filter (size={ksize})')
plt.axis('off')
plt.tight_layout()
plt.show()
# 执行示例
median_filter_demo()

在这里插入图片描述

在这里插入图片描述

3.6 拉普拉斯锐化

3.6.1 定义

拉普拉斯锐化是一种基于二阶导数的图像增强技术,通过增强图像中的灰度突变来突出边缘和细节。

3.6.2 算法原理

∇ 2 f = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 \nabla^2 f = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} 2f=x22f+y22f
离散形式的拉普拉斯算子常用卷积核表示,如:

[ 0 − 1 0 − 1 4 − 1 0 − 1 0 ] \begin{bmatrix} 0 & -1 & 0 \\ -1 & 4 & -1 \\ 0 & -1 & 0 \end{bmatrix} 010141010

3.6.3 代码示例

def laplacian_sharpening_demo():
# 读取图像
img = cv2.imread('input.jpg', 0)
# 应用高斯模糊模拟平滑图像
blurred = cv2.GaussianBlur(img, (5, 5), 0)
# 拉普拉斯锐化
laplacian = cv2.Laplacian(blurred, cv2.CV_64F)
# 将拉普拉斯结果转换为8位图像
laplacian_abs = cv2.convertScaleAbs(laplacian)
# 将原图与拉普拉斯结果相加实现锐化
sharpened = cv2.addWeighted(img, 1.5, laplacian_abs, -0.5, 0)
plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
plt.imshow(img, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(laplacian_abs, cmap='gray')
plt.title('Laplacian Filter Result')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(sharpened, cmap='gray')
plt.title('Sharpened Image')
plt.axis('off')
plt.tight_layout()
plt.show()
# 执行示例
laplacian_sharpening_demo()

4、算法性能比较

算法优点缺点适用场景
直方图均衡化简单有效,显著增强对比度可能过度增强噪声
伽马校正灵活调整亮度,计算简单需要手动调整参数光照校正
高斯滤波有效去除高斯噪声,保持边缘可能模糊细节一般性去噪
中值滤波有效去除椒盐噪声,保护边缘对高斯噪声效果一般脉冲噪声去除
拉普拉斯锐化突出边缘和细节增强噪声边缘增强
同态滤波同时处理亮度和对比度计算复杂非均匀光照

5、总结

看到这里,常见图像增强算法就差不多聊完了。
最后再唠叨一句:在实际项目中,建议根据具体需求、资源约束和性能要求,在传统方法和深度学习方法之间做出合适的选择。

我是小鱼

  • CSDN 博客专家
  • AIGC 技术MVP专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)评测一等奖获得者

关注小鱼,学习【机器视觉与目标检测】最新最全的领域知识。

posted @ 2025-12-14 22:19  gccbuaa  阅读(3)  评论(0)    收藏  举报