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)
热门推荐
移动硬盘数据恢复全攻略:从原理到预防
重庆长江索道:最美“空中巴士”的打卡攻略
重庆长江索道:空中漫步打卡新地标
重庆长江索道:4分钟穿越山城,解锁最美视角!
长江索道:重庆的空中走廊与城市记忆
电商假货问题加剧,消费者维权意识提升应对挑战
网购遭遇欺诈怎么办?一文详解维权流程和法律依据
臊子面的精髓——臊子的制作方法大揭秘!
四川炒臊子制作教程:从选材到出锅的完整步骤详解
寒假亲子游打卡:南京历史文化探秘
舌头疼怎么办?五种缓解方法全解析
雪乡:中国冬天最浪漫的童话小镇
大宝贝呕吐怎么护理?
甘泉豆干带你品味南京老门东的悠闲午后
探访南京六朝古迹:秦淮河畔的千年风华
中山陵:民主革命先行者的永恒丰碑
C-Drama出海:文化生态的“好东西”
AI创作出百万字小说,“人人皆能写长篇”不再是梦
沂源灵芝洞景区:地下仙境里的网红打卡地
淄博文旅局力荐:沂源鲁山溶洞群&天鹅湖
淄博沂源自驾游:打卡历史与自然美景
秋冬打卡:沂源最美休闲胜地推荐
德国环保黑科技:从碳捕获到氢能的创新突破
德国绿色生态:可持续生活的典范
德国生态保护政策:我们能学到什么?
瓦登海国家公园:德国最大湿地保护区的生态奇观
《喜羊羊与灰太狼之筐出未来》:一部关于友谊与梦想的动画电影
《喜羊羊与灰太狼》:从动画到AI,家庭教育的新选择
《喜羊羊与灰太狼》:如何打造经典角色
喜羊羊重返春节档,黄伟明揭秘篮球新作