【图像处理基石】图像预处理方面有哪些经典的算法?

在这里插入图片描述

图像预处理是计算机视觉任务(如目标检测、图像分割、人脸识别)的基础步骤,核心目的是消除图像中的噪声、提升对比度、修正几何畸变等,为后续高阶处理提供高质量输入。以下先系统梳理经典算法,再通过Python实现2个高频应用算法(直方图均衡化、中值滤波)。

一、图像预处理经典算法梳理

根据处理目标,可将经典算法分为5大类,每类包含核心算法、原理、目的及应用场景:

1. 几何变换类(修正空间畸变)

针对图像的空间位置或形状偏差,调整像素坐标以满足后续对齐、裁剪等需求。

算法原理核心目的应用场景
平移对所有像素按指定偏移量(dx, dy)移动,公式:(x’, y’) = (x+dx, y+dy)调整图像位置图像拼接、目标定位校准
旋转以某点(如中心)为原点,按角度θ旋转,需处理像素插值避免模糊修正图像倾斜文档扫描(矫正倾斜文字)
缩放按比例(fx, fy)放大/缩小像素,常用双线性插值提升画质统一图像尺寸神经网络输入标准化(如224x224)
翻转水平翻转(左右镜像)或垂直翻转(上下镜像)数据增强、修正视角人脸识别(增加样本多样性)

2. 图像增强类(提升视觉质量)

通过调整像素灰度/颜色分布,增强图像的细节对比度,解决低光照、模糊等问题。

算法原理核心目的应用场景
全局直方图均衡化拉伸像素灰度分布,使直方图趋于均匀(映射灰度累积概率)提升整体对比度医学图像(如X光片)、低光照片
CLAHE(自适应直方图均衡化)将图像分块,对每块单独均衡化,限制对比度避免过增强增强局部细节(如暗区)逆光照片、监控图像
伽马校正通过幂函数(O = I^γ)调整灰度:γ<1提亮,γ>1压暗修正光照不均显示器校准、水下图像增强
对比度拉伸(线性变换)线性映射灰度范围:O = a*I + b(a>1增强对比度,a<1降低)扩展有效灰度区间灰度范围狭窄的图像(如雾天图)

3. 图像去噪类(消除干扰像素)

针对图像采集过程中的噪声(如椒盐噪声、高斯噪声),通过邻域像素平滑实现去噪。

算法原理核心目的应用场景
均值滤波用邻域内所有像素的平均值替换中心像素消除高斯噪声轻微模糊的自然图像
中值滤波用邻域内像素的中值替换中心像素消除椒盐噪声(脉冲噪声)老照片、传感器噪声图像
高斯滤波用高斯核(权重随距离递减)加权平均邻域像素平滑图像、保留细节预处理(如边缘检测前去噪)
双边滤波结合空间距离(邻域权重)和灰度相似度(避免模糊边缘)加权平均去噪+保留边缘人像美颜、纹理保留

4. 颜色空间转换(适配任务需求)

将图像从默认的RGB空间转换为其他空间,简化后续处理(如分离亮度与色彩)。

转换方向原理核心目的应用场景
RGB → 灰度加权平均RGB通道:Gray = 0.299R + 0.587G + 0.114B(符合人眼感知)减少维度(3→1)灰度图像任务(如文字识别)
RGB → HSV分离色调(H)、饱和度(S)、亮度(V)通道单独调整亮度/色彩图像增强、色彩分割
RGB → YCrCb分离亮度(Y)与色差(Cr/Cb)通道视频压缩、肤色检测人脸识别(肤色区域提取)

5. 阈值处理(二值化分割)

将灰度图转换为二值图(仅黑白两色),突出目标区域。

算法原理核心目的应用场景
全局阈值用固定阈值T分割:I>T设为255(白),否则设为0(黑)(如Otsu自动选T)简单目标分割文字提取、硬币检测
自适应阈值按局部区域动态计算阈值(如邻域均值)处理光照不均图像文档扫描(文字与背景分离)

二、Python实现经典算法(2个高频案例)

以下基于 OpenCV(图像处理库)Matplotlib(图像显示库) 实现,需先安装依赖:

pip install opencv-python numpy matplotlib

案例1:直方图均衡化(全局+CLAHE)

需求:提升低对比度图像的细节(如逆光照片),对比全局均衡化与CLAHE的效果差异。

实现步骤:
  1. 加载图像并转换为灰度图(均衡化通常在单通道上进行);
  2. 实现全局直方图均衡化;
  3. 实现CLAHE(自适应均衡化);
  4. 显示原图、全局均衡化图、CLAHE图及对应直方图。
代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt# 1. 加载图像(以灰度模式读取,0表示灰度)
img = cv2.imread("low_contrast_image.jpg", 0)  # 替换为你的图像路径
if img is None:raise ValueError("图像加载失败,请检查路径是否正确!")# 2. 全局直方图均衡化
global_eq = cv2.equalizeHist(img)# 3. CLAHE(自适应直方图均衡化)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))  # clipLimit限制对比度,tileGridSize分块大小
clahe_eq = clahe.apply(img)# 4. 计算各图像的直方图(用于对比)
def calculate_histogram(image):hist = cv2.calcHist([image], [0], None, [256], [0, 256])return hist / hist.sum()  # 归一化,便于显示hist_original = calculate_histogram(img)
hist_global = calculate_histogram(global_eq)
hist_clahe = calculate_histogram(clahe_eq)# 5. 显示结果(Matplotlib默认RGB,灰度图直接显示)
plt.figure(figsize=(15, 10))# 图像显示
plt.subplot(2, 3, 1)
plt.imshow(img, cmap="gray")
plt.title("原图")
plt.axis("off")plt.subplot(2, 3, 2)
plt.imshow(global_eq, cmap="gray")
plt.title("全局直方图均衡化")
plt.axis("off")plt.subplot(2, 3, 3)
plt.imshow(clahe_eq, cmap="gray")
plt.title("CLAHE(自适应均衡化)")
plt.axis("off")# 直方图显示
plt.subplot(2, 3, 4)
plt.plot(hist_original, color="black")
plt.title("原图直方图")
plt.xlabel("灰度值")
plt.ylabel("概率密度")plt.subplot(2, 3, 5)
plt.plot(hist_global, color="black")
plt.title("全局均衡化直方图")
plt.xlabel("灰度值")plt.subplot(2, 3, 6)
plt.plot(hist_clahe, color="black")
plt.title("CLAHE直方图")
plt.xlabel("灰度值")plt.tight_layout()
plt.show()
结果分析:
  • 全局均衡化:整体对比度提升,但可能导致局部过亮(如天空区域泛白);
  • CLAHE:通过分块均衡化,在提升暗区细节(如建筑阴影)的同时,避免过增强,效果更自然。

案例2:中值滤波(消除椒盐噪声)

需求:去除图像中的椒盐噪声(随机黑白斑点),对比原图与去噪后的效果。

实现步骤:
  1. 加载灰度图并手动添加椒盐噪声(模拟真实噪声场景);
  2. 用中值滤波处理噪声图像;
  3. 对比原图、噪声图、去噪图。
代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt# 1. 加载灰度图像
img = cv2.imread("lena.jpg", 0)  # 替换为你的图像路径(如经典Lena图)
if img is None:raise ValueError("图像加载失败,请检查路径是否正确!")# 2. 手动添加椒盐噪声(噪声比例:10%)
def add_salt_pepper_noise(image, noise_ratio=0.1):h, w = image.shapenoise_img = image.copy()# 计算噪声像素数量noise_pixels = int(h * w * noise_ratio)# 添加盐噪声(白色斑点,灰度255)for _ in range(noise_pixels // 2):x = np.random.randint(0, w)y = np.random.randint(0, h)noise_img[y, x] = 255# 添加椒噪声(黑色斑点,灰度0)for _ in range(noise_pixels // 2):x = np.random.randint(0, w)y = np.random.randint(0, h)noise_img[y, x] = 0return noise_imgnoise_img = add_salt_pepper_noise(img, noise_ratio=0.1)# 3. 中值滤波处理(核大小为3x3,需为奇数)
median_filtered = cv2.medianBlur(noise_img, ksize=3)  # ksize可调整为5、7(核越大去噪越强,但细节越模糊)# 4. 显示结果
plt.figure(figsize=(12, 4))plt.subplot(1, 3, 1)
plt.imshow(img, cmap="gray")
plt.title("原图")
plt.axis("off")plt.subplot(1, 3, 2)
plt.imshow(noise_img, cmap="gray")
plt.title("添加椒盐噪声(10%)")
plt.axis("off")plt.subplot(1, 3, 3)
plt.imshow(median_filtered, cmap="gray")
plt.title("中值滤波(3x3核)")
plt.axis("off")plt.tight_layout()
plt.show()
结果分析:
  • 噪声图:出现明显的黑白斑点(椒盐噪声),细节被掩盖;
  • 中值滤波后:大部分噪声被消除,图像细节(如面部轮廓、眼睛)保留较好,这是因为中值对脉冲噪声的抑制效果优于均值滤波。

三、总结

图像预处理算法的选择需结合具体任务和图像问题

  • 若图像对比度低:优先用CLAHE(优于全局均衡化);
  • 若图像有椒盐噪声:优先用中值滤波(核大小根据噪声强度调整);
  • 若需统一图像尺寸:用缩放(双线性插值);
  • 若需分离亮度与色彩:将RGB转为HSV或YCrCb。

上述实现的2个算法是工业界最常用的预处理步骤,可直接集成到目标检测、图像分割等 pipeline 中,提升后续模型的精度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921036.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 多表查询方法

MySQL 多表查询方法MySQL 多表查询用于从多个表中检索数据&#xff0c;通常通过关联字段&#xff08;如外键&#xff09;实现。以下是常见的多表查询方式&#xff1a;内连接&#xff08;INNER JOIN&#xff09;内连接返回两个表中匹配的行。语法如下&#xff1a;SELECT 列名 F…

网络断连与业务中断的全链路诊断与解决之道(面试场景题)

目录 1. 网络链路的“命脉”:从物理层到应用层的排查逻辑 物理层:别小看那一根网线 数据链路层:MAC地址和交换机的“恩怨情仇” 工具推荐:抓包初探 2. 网络层的“幕后黑手”:IP冲突与路由迷雾 IP冲突:谁抢了我的地址? 路由问题:数据包的“迷路”之旅 3. 传输层与…

英伟达Newton与OpenTwins如何重构具身智能“伴随式数采”范式

具身智能的“数据饥荒”&#xff1a;行业痛点与技术瓶颈的深度剖析1.1 具身智能的现状与核心挑战Embodied AI的落地之路面临着多重严峻挑战。在算法层面&#xff0c;实现通用智能仍需人类的持续介入&#xff0c;并且从感知到行动的认知映射尚未完全打通。在硬件层面&#xff0c…

STM32HAL 快速入门(十六):UART 协议 —— 异步串行通信的底层逻辑

大家好&#xff0c;这里是 Hello_Embed。在前几篇中&#xff0c;我们通过环形缓冲区解决了按键数据丢失问题&#xff0c;而在嵌入式系统中&#xff0c;设备间的数据交互&#xff08;如单片机与电脑、传感器的通信&#xff09;同样至关重要。UART&#xff08;通用异步收发传输器…

使用 C 模仿 C++ 模板的拙劣方法

如下所示&#xff0c;准备两个宏&#xff0c;一个定义类型&#xff0c;一个定义容器大小。 使用时只要先定义这两个宏&#xff0c;然后再包含容器头文件就能生成不同类型和大小的容器了。但是这种方法只允许在源文件中使用&#xff0c;如果在头文件中使用&#xff0c;定义不同类…

flume接收处理器:构建高可用与高性能的数据链路

flume接收处理器&#xff1a;构建高可用与高性能的数据链路 在大规模数据采集场景中&#xff0c;单点故障和性能瓶颈是两大核心挑战。Flume 通过 Sink Group 接收处理器&#xff08;Processor&#xff09; 机制&#xff0c;提供了强大的故障转移&#xff08;Failover&#xf…

高级Kafka应用之流处理

40 Kafka Streams与其他流处理平台的差异在哪里&#xff1f; 什么是流处理平台&#xff1f; “Streaming Systems”一书是这么定义“流处理平台”的&#xff1a;流处理平台&#xff08;Streaming System&#xff09;是处理无限数据集&#xff08;Unbounded Dataset&#xff09;…

Custom SRP - LOD and Reflections

1 LOD Groups 场景中对象越多,场景就越丰富,但是过多的对象,也会增加 CPU 和 GPU 的负担.同时如果对象最终渲染在屏幕上后覆盖的像素太少,就会产生模糊不清的像素点/噪点.如果能够不渲染这些过小的对象,就能解决噪点问题,同时释放 CPU GPU,去处理更重要的对象. 裁剪掉这些对象…

【Linux篇章】互联网身份密码:解密 Session 与 Cookie 的隐藏玩法和致命漏洞!

本篇摘要 本篇将承接上篇HTTP讲解&#xff08; 戳我查看 &#xff09;遗留的关于Cookie与Session的介绍&#xff0c;在本篇&#xff0c;将会介绍Cookie的由来&#xff0c;作用&#xff0c;以及缺点等&#xff0c;进而引出Session&#xff0c;最后介绍一下它们的性质等&#xf…

Postman接口测试工具:高效管理测试用例与环境变量,支持断言验证及团队协作同步

之前跟你们聊过能搭知识网络的 Obsidian&#xff0c;今天换个偏向接口测试的方向 —— 给你们安利一个 Github 上的「Postman」&#xff0c;它是个接口测试工具&#xff0c;官网能直接下载&#xff08;Postman: The Worlds Leading API Platform | Sign Up for Free&#xff09…

可可图片编辑 HarmonyOS 上架应用分享

可可图片编辑 HarmonyOS 上架应用分享 介绍 可可图片编辑 原名 图片编辑大师&#xff0c;因为上架审核的时候 &#xff0c;提示与一些已有应用重名&#xff0c;为了避免冲突&#xff0c;需要改名字&#xff0c;所以苦心思考了一分钟&#xff0c;就调整成 可可图片编辑。 应用…

Notepad++近期版本避雷

近期Notepad若干版本存在投毒事件&#xff0c;虽然也欢迎大家使用替代软件&#xff0c;但是Notepad作为一款开源软件&#xff0c;如有需要也可以继续白嫖使用&#xff0c;但是请务必避开若干埋雷版本&#xff01; 经检查&#xff0c;部分版本在帮助菜单中加入了有关tw的部分个人…

【lucene核心】impacts的由来

在 Lucene 的 Impact 概念&#xff08;出现在 ImpactsEnum / Impact 对象里&#xff09;中&#xff1a;字段 含义 freq 当前 term 在该文档中出现了多少次&#xff08;即词频 term frequency&#xff09;。 norm 当前 文档在该字段中的长度因子&#xff08;即之前 norms 里保存…

基于Echarts+HTML5可视化数据大屏展示-惠民服务平台

效果展示代码结构&#xff1a;主要代码实现 index.html布局 <!doctype html> <html><head><meta charset"utf-8"><title>双数智慧公卫-传染病督导平台</title><meta http-equiv"refresh" content"60;urlhttps…

【Flink】DataStream API:执行环境、执行模式、触发程序执行

目录执行环境getExecutionEnvironmentcreateLocalEnvironmentcreateRemoteEnvironment执行模式流执行模式&#xff08;Streaming&#xff09;批执行模式&#xff08;Batch&#xff09;自动模式&#xff08;AutoMatic&#xff09;触发程序执行DataStream API是Flink的核心层API&…

CentOS7.6

腾讯云服务器 腾讯云 产业智变云启未来 - 腾讯 服务器在控制台显示 点击进入面板&#xff0c;显示所有信息 现在来安装桌面的远程控制软件 宝塔SSH终端:一款同时支持SSH和SFTP客户端的免费软件! 点击立即下载 在云服务器的实例列表复制公网ip 密码就是服务器的密码&#xff…

前端架构知识体系:常见图片格式详解与最佳实践

前端开发必备&#xff1a; 在前端开发中&#xff0c;合理选择图片格式直接影响网页加载性能、用户体验和带宽成本。本文将系统梳理常见图片格式&#xff0c;分析它们的优缺点、压缩原理、兼容性和推荐使用场景&#xff0c;并提供前端优化实战建议。1. JPEG / JPG 全称&#xff…

ARM的编程模型

ARM的编程模型 ARM 的编程模型指的是从程序员&#xff08;特别是汇编程序员和编译器设计者&#xff09;视角所看到的 ARM 处理器架构。它定义了程序员可以使用的资源、数据操作方式以及规则&#xff0c;主要包括&#xff1a;寄存器组、数据类型、内存访问方式、执行状态和异常处…

最大熵强化学习相比传统强化学习,有什么缺点?

要理解最大熵强化学习&#xff08;MaxEnt RL&#xff09;相比传统强化学习&#xff08;如DQN、PPO、DDPG等&#xff09;的缺点&#xff0c;首先需要明确两者的核心差异&#xff1a;传统RL的目标是“最大化累积奖励”&#xff0c;而MaxEnt RL在该目标基础上额外增加了“最大化策…

python生成器与协程深度剖析

目录 生成器 传统列表 vs 生成器对比 yield机制深度解析 生成器的高级用法 协程的演进:从yield到async/await 基于yield的协程 现代async/await语法 协程的错误处理和超时控制 异步生成器与异步迭代器 异步生成器 异步迭代器实现 实战案例:异步爬虫框架设计 生成器…