OpenCV图像处理入门:基础操作详解
创作时间:
作者:
@小白创作中心
OpenCV图像处理入门:基础操作详解
引用
CSDN
1.
https://blog.csdn.net/weixin_48970443/article/details/144951932
图像处理的流程从图像获取开始,通过预处理(如灰度化、平滑处理等)、特征提取和分割等步骤逐步实现对图像内容的理解和分析。本文将详细介绍OpenCV中图像IO操作、图像滤波、特征提取和阈值分割等核心概念和具体实现方法。
1 图像IO操作
img = cv2.imread('Lena.png')
:读取图像;cv2.imshow('Lena.png',img)
:展示图像;cv2.imwrite('Lena_copy.png',img)
:保存图像;img.shape
:获取图像基本属性,图像的长/宽以及RGB通道数;- ROI:region of interest,感兴趣的区域。实质是像素矩阵的切片;
img_gray = cv2.imread('Lena.png', cv2.IMREAD_GRAYSCALE)
:读取灰度图像。
# 读取图像,返回一个三维数组,shape为(height,width,channels),channels为3,表示RGB三个通道
img = cv2.imread('Lena.png')
cv2.imshow('Lena.png',img)
cv2.imwrite('Lena_copy.png',img)
# 读取灰度图像,返回一个二维数组,shape为(height,width),channels为1,表示灰度图像
img_gray = cv2.imread('Lena.png', cv2.IMREAD_GRAYSCALE)
#img_gray2 = cv2.imread('Lena.png',0)
# img.shape获取图像基本属性,如果channels为4,表示RGBA图像(包含透明度)
height, width, channels = img.shape
print(f"Image dimensions: {width}x{height}")
print(f"Number of channels: {channels}")
# 获取特定位置的像素值 (x=100, y=100)
pixel = img[100, 100]
print(f"Pixel value at (100,100): {pixel}")
#以下是输出:
Image dimensions: 512x512
Number of channels: 3
Pixel value at (100,100): [ 78 70 180]
2 图像滤波
图像滤波器大致可以分为两种:
- 低通滤波器:保留低频信息(图像中变化缓慢的部分),去除高频信息(图像中变化剧烈的部分,如噪声和边缘)
- 高通滤波器:保留高频信息(边缘、细节),去除低频信息(平滑区域)
低通滤波器的作用是去噪声,同时平滑图像,使其显得更加柔和。但会丢失部分细节信息,导致图像变得模糊。以下是三种常见的低通滤波器:
2.1. 均值滤波 (cv2.blur)
- 原理:对滤波核内所有像素取均值,用结果替代中心像素值。
- 特点:
- 简单易用,计算速度快。
- 对边缘的保留效果差,容易导致边缘模糊。
- 参数如 (5,5) 表示滤波核大小,核越大,平滑效果越明显,但细节丢失越多(必须为奇数)。
2.2. 高斯滤波 (cv2.GaussianBlur)
- 原理:对滤波核内像素赋予高斯分布权重,中心像素权重最大,离中心越远权重越小,用加权平均值替代中心像素值。
- 特点:
- 对噪声有更好的抑制效果。
- 较均值滤波更能保留边缘细节。
- 参数如 (5,5) 表示核大小, 表示根据核大小自动计算高斯标准差(必须为奇数)。
2.3. 中值滤波 (cv2.medianBlur)
- 原理:用滤波核内像素的中值替代中心像素值。
- 特点:
- 对椒盐噪声(孤立的亮点或暗点)特别有效。
- 对边缘保留效果更好,不会像均值滤波那样导致边缘模糊。
- 参数 5 表示滤波核大小(必须为奇数)。
2.4. 总结
滤波后,图像中的细节信息减少,纹理和边缘部分被平滑处理,因此图像会显得“模糊”。这是低通滤波器的典型特征,其优点是去除噪声,缺点是损失细节。
均值滤波:图像整体模糊化,边缘锐度明显降低。
高斯滤波:在平滑图像的同时,边缘保留效果较好,视觉上更自然。
中值滤波:在去噪声的同时,边缘区域细节保留最佳,尤其对椒盐噪声的处理效果优于前两种方法。
应用场景
均值滤波:快速去噪,对处理时间要求较高的场景。
高斯滤波:去除高斯噪声,同时需要较好的边缘保留效果。
中值滤波:对椒盐噪声场景效果最佳,适用于图像噪声类型明确的情况。
mean = cv2.blur(img, (5,5))
gaussian = cv2.GaussianBlur(img, (5,5), 0)
median = cv2.medianBlur(img, 5)
3 特征提取
特征提取是一种高通滤波操作,着重于提取图像中的高频信息(边缘)。介绍3种特征提取方法:
3.1. Sobel算子
- 原理:基于图像的一阶导数,计算像素点在水平和垂直方向上的梯度,通过梯度变化检测边缘。
- 特点:
- 分别对水平方向和垂直方向的边缘进行检测,可以结合两个方向的结果得到最终边缘。
- 使用简单的卷积核(如−1,0,1-1, 0, 1−1,0,1)进行计算。
- 优点:计算简单,能够有效检测方向性边缘。
- 缺点:对噪声敏感,可能会产生假边缘。
3.2. Laplacian算子
- 原理:基于图像的二阶导数,计算像素值变化的加速度。检测边缘时对亮度变化剧烈的区域特别敏感。
- 特点:
- 使用的是二阶导数(如拉普拉斯算子),因此对图像的噪声也特别敏感。
- 可以检测多方向的边缘,而不像Sobel仅限于水平或垂直方向。
- 优点:可以检测图像中更多细节。
- 缺点:对噪声非常敏感,常需结合其他预处理操作(如高斯滤波)。
3.3. Canny算子
- 原理:是一个更复杂的边缘检测算法,结合了多种技术:
- 高斯滤波:平滑图像,减少噪声。
- 梯度计算:利用Sobel算子计算梯度方向和大小。
- 非极大值抑制:通过抑制梯度图中的非边缘点,保留真正的边缘。
- 双阈值处理:设置高低两个阈值,将边缘分为强边缘和弱边缘,连接形成最终边缘。
- 特点:
- 过程复杂但结果更精确。
- 能够平衡噪声抑制和边缘检测的精确性。
- 优点:对噪声鲁棒性强,能够检测完整的边缘。
- 缺点:计算复杂度较高,需要调节多个参数(如高斯滤波核大小和双阈值)。
3.4. 总结
- Sobel适合基础的方向性边缘检测,简单高效。
- Laplacian可以检测多方向边缘,但对噪声较为敏感,适合结合其他方法使用。
- Canny是综合性最强的边缘检测算法,适用于对边缘检测精度要求较高的任务,但需要更多计算资源和参数调整。
img = cv2.imread('./Lena.png', 0) #读取灰度图像

# Sobel边缘检测
# 计算x方向的Sobel边缘
#1, 0表示计算x方向的梯度,0, 1表示计算y方向的梯度。
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
# 计算y方向的Sobel边缘
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
# 将Sobel边缘转换为8位无符号整数
sobelx = np.uint8(np.absolute(sobelx))
sobely = np.uint8(np.absolute(sobely))
sobel_combined = cv2.bitwise_or(sobelx, sobely)
# Laplacian边缘检测
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = np.uint8(np.absolute(laplacian))
# Canny边缘检测
canny = cv2.Canny(img, 100, 200) ## 100, 200表示低阈值和高阈值
4 阈值分割
图像是由一个个像素点组成,而每一个像素点又是0-255之间的任一数值(0为黑色,255为白色),因此可以根据特定的阈值将图像进行分割,将图像简化为二值图像(只有黑白两种颜色)。阈值分割是图像处理中的基础操作,opencv提供很多种阈值分割方法,这里简单介绍三种:
4.1. 全局阈值
- 原理:人为指定一个固定的阈值,将图像中的像素值与阈值进行比较,大于阈值的像素设为白色(255),小于阈值的像素设为黑色(0)。
- 适用场景:光照均匀、背景简单的图像。
- 优点:计算简单,效率高。
- 缺点:对光照变化敏感,效果依赖于阈值选择,复杂场景中表现较差。
4.2. Otsu阈值
- 原理:基于灰度直方图的双峰性,计算出一个最优阈值,使前景和背景之间的类间方差最大化,达到最佳分割效果。通常结合全局阈值方法进行自动优化。
- 适用场景:灰度直方图具有明显双峰特性的图像。
- 优点:自动选择最优阈值,适合简单图像的分割任务,无需人为干预。
- 缺点:对噪声较敏感,若图像直方图为单峰或分布不清晰,效果可能不理想。
4.3. 自适应阈值
- 原理:为每个像素点动态计算局部阈值,综合考虑其邻域内的像素信息,适应光照变化和局部特征。
- 适用场景:光照不均匀或背景复杂的图像。
- 优点:能够适应不同区域的亮度变化,对光照变化和局部细节处理效果更好。
- 缺点:计算复杂度较高,处理时间比全局阈值方法长,参数选择较为敏感。
4.4. 总结
- 全局阈值适合简单、光照均匀的图像,效率高但灵活性较差。
- Otsu阈值在特定条件下可以自动选择最优阈值,效果智能但对噪声较敏感。
- 自适应阈值适合复杂场景和光照不均匀的图像,灵活性强,但计算开销较大。
img = cv2.imread('./Lena.png', 0)
# 全局阈值
# 127, 255表示阈值和最大灰度值。像素值 > 127 时设为 255(白色),像素值 ≤ 127 时设为 0(黑色)
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# Otsu阈值法
ret2, thresh2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 自适应阈值
# 11, 2表示块大小和常数C
thresh3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
thresh4 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
热门推荐
投保人和被保险人豁免需要吗 重疾险夫妻互保有必要吗
治疗慢性鼻咽炎的好方法
普萘洛尔的作用与功效副作用是什么
近视眼滴什么眼药水可以减轻近视
中国家庭必安的防盗窗,为啥犯罪率高的欧美却没有?他们不用?
心力衰竭中静脉淤血的诊断与治疗
培养孩子专注力:用围棋训练提升逻辑思维的5个阶段
如何合理设置杠杆比例?杠杆比例的设置对投资风险有哪些影响?
海拔千米之上的珍宝——神农四宝
HCHO-8000甲醛自动在线水质分析仪技术详解
劳资协议💰|比尔的交易否决权是什么?为啥它是“免死金牌”?
明前茶与明后茶,谁更胜一筹?
指甲竖纹多吃什么好得快
定期进行甲状腺检查有多关键?听听专家怎么说的吧
C语言如何定义主函数
逾期是什么意思
浅析网络外挂的刑事司法规制
Excel中将中文转换为拼音的三种方法
《玫瑰的故事》表达了什么?鼓励现代女性追求独立、自主和幸福
【Scratch图形化编程】:从算法到逻辑,专家带你一探究竟
逆回购的操作方法和作用是什么?这种操作方法在市场中如何发挥效果?
我国“冬暖夏凉”的四个城市,夏天温度在20多度,是个宜居好地方
湿润烧伤膏使用全攻略:从原理到注意事项
由课堂上的“手机美人”引发的思考
接地电阻试验:原理、标准与检测方法详解
Muse Dash:一款结合音乐与跑酷的二次元游戏
痛风云南白药喷雾有用吗
茅盾文学奖的来历,茅盾文学奖的评选标准是什么
维生素C缺乏的症状及预防方法
解压专家软件使用指南:电子书文件的导出与阅读