图像处理-opencv(一)
目录
1、灰度图
1.1 定义
1.2 表示方法
1.3 特点
2、HSV
2.1 HSV 三要素定义
2.2 HSV 模型的特点
2.3 HSV 与 RGB 的区别
3、图像阈值
3.1 函数作用
3.2、参数含义与要求
3.3 阈值类型(type)及实例
3.3.1 cv2.THRESH_BINARY(二值化)
3.3.2 cv2.THRESH_BINARY_INV(反二值化)
3.3.3 cv2.THRESH_TRUNC(截断)
3.3.4 cv2.THRESH_TOZERO(归零)
3.3.5 cv2.THRESH_TOZERO_INV(反归零)
3.4 返回值ret的作用
4、图像平滑
4.1 核心原理
4.2 常见的图像平滑方法
4.2.1. 均值滤波(Mean Filtering)
4.2.2. 高斯滤波(Gaussian Filtering)
4.2.3. 中值滤波(Median Filtering)
4.2.4. 双边滤波(Bilateral Filtering)
4.3 平滑方法的选择依据
1、灰度图
灰度图(Grayscale)是指只含亮度信息,不含色彩信息的图像,其外观类似黑白照片
1.1 定义
灰度图中的每个像素只有一个亮度值,通常用一个 8 位或 16 位的整数表示。8 位灰度图的亮度值范围是 0 到 255,其中 0 代表黑色,255 代表白色,介于两者之间的值代表不同程度的灰色。
1.2 表示方法
灰度图是单通道图像,即每个像素仅由一个灰度值来表示其亮度水平,不像彩色图像那样由多个颜色通道组成。
1.3 特点
数据简化由于仅包含灰度信息,灰度图像的数据量比彩色图像小,处理起来更为简单高效。
易于处理:许多图像处理技术,如边缘检测、图像分割、特征提取等,在灰度图像上的实现更为直接和简单。
2、HSV
HSV(Hue, Saturation, Value)是一种基于人眼对色彩感知的颜色模型,它将颜色分解为三个直观的维度。
2.1 HSV 三要素定义
HSV 模型通过 色调(H)、饱和度(S)、明度(V) 三个独立分量描述颜色,三个维度共同决定最终呈现的色彩,具体含义如下:
2.2 HSV 模型的特点
相比 RGB(红、绿、蓝)等基于硬件的颜色模型,HSV 具有更贴近人类视觉感知的优势:
直观性强:调整颜色时,可独立控制 “色调(换颜色)”“饱和度(调鲜艳度)”“明度(调明暗)”,无需像 RGB 那样同时调整三个通道(如想让红色变亮,只需提高 V,无需修改 R/G/B 比例)。
分量独立:三个维度互不干扰 —— 例如,改变饱和度(S)不会影响色调(H)和明度(V),改变明度(V)也不会改变颜色的种类和纯净度。
适合色彩选择:在设计软件(如 Photoshop、Figma)或图像编辑工具中,HSV 色轮能快速定位目标颜色,尤其适合需要精细调整色彩氛围的场景(如将图片色调从 “冷蓝” 改为 “暖黄”,只需调整 H 值)。
2.3 HSV 与 RGB 的区别RGB 和 HSV 是两种最常用的颜色模型,但核心逻辑完全不同,具体差异如下:
对比维度 | HSV 模型 | RGB 模型 |
核心逻辑 | 基于人类视觉感知 (色调、饱和度、明度) | 基于硬件显示 (红、绿、蓝三原色叠加) |
分量含义 | 分量独立,对应色彩的直观属性 | 分量为三原色的亮度值,无直接 “色彩意义” |
调色便捷性 | 高:可直接调整 “颜色种类 / 鲜艳度 / 明暗” | 低:需同时调整三通道,且效果不直观(如 “让蓝色更鲜艳” 需调整 R/G/B 比例) |
适用场景 | 图像编辑、色彩设计、视觉效果调整 | 屏幕显示、数字图像存储、硬件驱动 |
3、图像阈值
OpenCV 中图像阈值化的核心函数cv2.threshold(),它是将灰度图像转换为二值化图像(或特定阈值处理图像)的关键工具。以下是对该函数及各参数的详细解读,结合实例帮助理解:
3.1 函数作用
cv2.threshold()通过设定一个固定阈值,将单通道图像(通常是灰度图)的像素值根据阈值规则进行转换,实现图像的简化(如突出目标区域、去除背景)。
3.2、参数含义与要求
src 输入图像,必须是单通道图像(灰度图),不能直接输入彩色图(需先转灰度)。
dst 输出图像,与输入图像尺寸、类型一致,存储阈值处理后的结果。
thresh 设定的阈值(如 127),用于判断像素值的分割标准。
maxval 当像素值满足阈值条件时,赋予的最大值(通常设为 255,即白色)。
type 阈值处理的类型,决定像素值如何根据thresh和maxval转换(核心参数)。
3.3 阈值类型(type)及实例
像素值为p,阈值thresh=127,maxval=255,以下是 5 种类型的转换规则及效果:
3.3.1 cv2.THRESH_BINARY(二值化)
规则:p > thresh → maxval(255);p ≤ thresh → 0
效果:阈值以上为白色,以下为黑色(最常用的二值化方式)。
3.3.2 cv2.THRESH_BINARY_INV(反二值化)
规则:p > thresh → 0;p ≤ thresh → maxval(255)
效果:与THRESH_BINARY相反,阈值以上为黑色,以下为白色。
3.3.3 cv2.THRESH_TRUNC(截断)
规则:p > thresh → thresh(127);p ≤ thresh → p(不变)
效果:阈值以上的像素统一设为阈值(如 127),以下保持原样(图像亮部被 “截断”)。
3.3.4 cv2.THRESH_TOZERO(归零)
规则:p > thresh → p(不变);p ≤ thresh → 0
效果:阈值以下的像素设为黑色,以上保持原样(只保留亮部)。
3.3.5 cv2.THRESH_TOZERO_INV(反归零)
规则:p > thresh → 0;p ≤ thresh → p(不变)
效果:与THRESH_TOZERO相反,阈值以上的像素设为黑色,以下保持原样(只保留暗部)。
3.4 返回值ret的作用
函数返回两个值:ret和dst。
dst是处理后的图像(核心结果)。
ret是实际使用的阈值(在固定阈值场景下与thresh相同;在自适应阈值等场景中,ret可能是算法自动计算的阈值)。
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]for i in range(6):plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')plt.title(titles[i])plt.xticks([]), plt.yticks([])
plt.show()

4、图像平滑
图像平滑(Image Smoothing)是一种基础的图像处理技术,主要通过抑制图像中的高频分量(如噪声、细节边缘)来减少图像噪声,使图像变得更模糊、更平滑,同时保留重要的低频信息(如大面积的区域特征)。它是图像预处理中的常用步骤,为后续的边缘检测、特征提取等操作提供更干净的图像数据。
4.1 核心原理
图像中的噪声通常表现为像素值的突变(高频信号),而平滑处理的本质是对像素周围的邻域进行加权平均,通过 “平均” 操作抵消突变的像素值,从而降低噪声。常见的实现方式是使用卷积核(滤波器) 对图像进行卷积运算:将卷积核覆盖在每个像素上,计算核内所有像素的加权和,作为中心像素的新值。
4.2 常见的图像平滑方法
根据卷积核的设计和计算方式不同,图像平滑可分为以下几类:
4.2.1. 均值滤波(Mean Filtering)
- 原理:使用一个固定大小的滑动窗口(如 3×3、5×5),将窗口内所有像素的平均值作为中心像素的新值。
- 卷积核:窗口内所有元素均为 1/(窗口面积)(确保加权和后亮度不变),例如 3×3 核为:
[[1/9, 1/9, 1/9],[1/9, 1/9, 1/9],[1/9, 1/9, 1/9]]
- 特点:
- 简单高效,能有效去除高斯噪声等随机噪声。
- 缺点:过度平滑会模糊图像边缘和细节(因为边缘也是高频信号,会被同时抑制)。
- OpenCV 实现:
import cv2
img = cv2.imread('image.jpg')
# 3×3均值滤波
mean_blur = cv2.blur(img, (3, 3))
4.2.2. 高斯滤波(Gaussian Filtering)
- 原理:使用高斯核进行卷积,核内像素的权重遵循高斯分布(中心像素权重最高,向四周逐渐减小),更接近人眼对邻域像素的感知。
- 卷积核:例如 3×3 高斯核(σ 为标准差,控制权重衰减速度):
[[0.0751, 0.1238, 0.0751], [0.1238, 0.2042, 0.1238], [0.0751, 0.1238, 0.0751]]
- 特点:
- 相比均值滤波,在平滑噪声的同时,能更好地保留图像边缘(因为中心像素权重更高,对边缘的模糊更少)。
- 适用于去除高斯噪声(图像中最常见的噪声类型之一)。
- OpenCV 实现:
# 3×3高斯滤波,sigmaX=1(X方向标准差)
gaussian_blur = cv2.GaussianBlur(img, (3, 3), sigmaX=1)
4.2.3. 中值滤波(Median Filtering)
- 原理:与均值滤波类似,但不计算平均值,而是取窗口内所有像素值的中值作为中心像素的新值。
- 特点:
- 对椒盐噪声(Salt-and-Pepper Noise,即图像中的黑白斑点) 效果极佳(因为中值能有效剔除极端异常值)。
- 相比均值滤波,边缘保留更好(不会因极端值影响平均结果)。
- 缺点:计算速度较慢(需排序取中值),且对高斯噪声的抑制效果不如高斯滤波。
- OpenCV 实现:
# 3×3中值滤波
median_blur = cv2.medianBlur(img, 3) # 注意:核大小为奇数(3,5,7...)
4.2.4. 双边滤波(Bilateral Filtering)
- 原理:在高斯滤波的基础上,增加了像素值相似度权重—— 不仅考虑空间距离(越近权重越高),还考虑像素值差异(差异越小权重越高)。
- 特点:
- 能在平滑噪声的同时,几乎不模糊边缘(因为边缘处像素值差异大,权重低,不会被过度平均)。
- 适用于需要保留边缘的场景(如人像美颜、细节保留平滑)。
- 缺点:计算复杂度高,速度较慢。
- OpenCV 实现:
# d=5(邻域直径),sigmaColor=100(颜色相似度标准差),sigmaSpace=100(空间距离标准差)
bilateral_blur = cv2.bilateralFilter(img, d=5, sigmaColor=100, sigmaSpace=100)
4.3 平滑方法的选择依据
噪声类型 | 推荐方法 | 核心优势 |
高斯噪声 | 高斯滤波 | 平滑效果好,边缘保留较好 |
椒盐噪声 | 中值滤波 | 有效剔除极端异常值 |
需保留边缘时 | 双边滤波 | 平滑噪声的同时不模糊边缘 |
简单快速处理 | 均值滤波 | 计算量小,适合快速预处理 |