opencv-python笔记(1)
1|0openCV笔记
1|1图像
灰度图像
0代表纯黑色,255代表白色(类似亮度)
通道拆分
通过索引拆分:
通过cv2.split()函数拆分:
图像属性
获取图像属性
shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或 者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一 幅图像是灰度图像(或二值图像)还是彩色图像。
size:返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道 数为 1。
dtype:返回图像的数据类型。
如:
重置图像属性
1|2图像运算
图像相加
直接加法运算:a+b=mod(a+b,256)
使用cv2.add:大于255则饱和
图像加权:使用cv2.addWeighted函数
dst=cv2.addWeighted(src1, alpha, src2, beta, gamma),其中gamma为亮度调节
图像位运算
按位与
dst = cv2.bitwise_and( src1, src2[, mask]] )
· 其中mask表示可选操作掩码,即指定要更改的输出数组的元素,也即输出图像像素只有mask对应位置元素不为0的部分才输出,否则 该位置像素的所有通道分量都设置为0
按位或
dst = cv2.bitwise_or( src1, src2[, mask]] )
按位非
dst = cv2.bitwise_not( src[, mask]] )
按位异或(与二进制加法类似)
dst = cv2.bitwise_xor( src1, src2[, mask]] )
位平面分解
提取某个位平面:
提取位平面并进行阈值处理:
1|3色彩空间
色彩空间基础
GRAY色彩空间
GRAY(灰度图像)通常指 8 位灰度图,其具有 256 个灰度级,像素值的范围是[0,255]。 当图像由 RGB 色彩空间转换为 GRAY 色彩空间时,其处理方式如下:
Gray = 0.299 · 𝑅 + 0.587 · 𝐺 + 0.114 · 𝐵
上述是标准的转换方式,也是 OpenCV 中使用的转换方式。有时,也可以采用简化形式完 成转换:
Gray = (𝑅 + 𝐺 + 𝐵 ) / 3
当图像由 GRAY 色彩空间转换为 RGB 色彩空间时,最终所有通道的值都将是相同的,其处理方式如下:
𝑅 = Gray
𝐺 = Gray
𝐵 = Gray
HSV色彩空间
分为色调,饱和度,亮度
色调环:
0 红色
60 黄色
120 绿色
180 青色
240 蓝色
300 品红色
在openCV中需要将色调值除以2来适应uint8存储类型
色彩空间的转换
调用cv2.cvtColor()函数
dst = cv2.cvtColor( src, code [, dstCn] )
式中:
· dst 表示输出图像,与原始输入图像具有同样的数据类型和深度。
· src 表示原始输入图像。可以是 8 位无符号图像、16 位无符号图像,或者单精度浮点数等。
· code 是色彩空间转换码,表 4-2 展示了其枚举值。
· dstCn 是目标图像的通道数。如果参数为默认的 0,则通道数自动通过原始输入图像和 code 得到
HSV色彩空间及其应用
H:色调,Hue
S:饱和度,Saturation
V:亮度,Value
色调
openCV中,色调值如下:
0 红色
30 黄色
60 绿色
90 青色
120 蓝色
150 品红色
饱和度:
原值为[0,1],映射到openCV中为[0,255]
灰度颜色R,G,B是相等的,故饱和度值为0
若颜色饱和度很低,那么其计算得出的色调值就不可靠
亮度
同样的,[0,1] —> [0,255]
标记指定颜色
颜色的差异主要体现在 H 通道值的不同上。所以,通过对 H 通道值进行筛选,便能够筛选出 特定的颜色。
我们可以通过cv2.inRange()函数来锁定特征值:
dst = cv2.inRange( src, lowerb, upperb )
其中:
· dst 表示输出结果,大小和 src 一致。
· src 表示要检查的数组或图像。
· lowerb 表示范围下界。
· upperb 表示范围上界。
· 如果 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。
· 如果 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0。(即作为掩图)
通过基于掩码的按位与显示ROI
通道融合函数
cv2.merge(mv[, dst])
如:
alpha通道
alpha通道一般代表透明度的值,取值为[0,255],表示从透明到不透明。
加入alpha通道的图像格式为BGRA。
例程:
1|4几何变换
缩放
dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )
其中:
- dst 代表输出的目标图像,该图像的类型与 src 相同,其大小为 dsize(当该值非零时), 或者可以通过 src.size()、fx、fy 计算得到。
- src 代表需要缩放的原始图像。
- dsize 代表输出图像大小。
- fx 代表水平方向的缩放比例。
- fy 代表垂直方向的缩放比例。
- interpolation 代表插值方式。(默认双线性插值)
例程:
翻转
函数:dst = cv2.flip( src, flipCode )
其中:
- dst 代表和原始图像具有同样大小、类型的目标图像。
- src 代表要处理的原始图像。
- flipCode 代表旋转类型,如下:
0代表绕着x轴翻转
正数代表绕y轴翻转(镜像)
负数代表绕x,y同时翻转(旋转180°)
仿射,透视
感觉用不太到,没看
重映射
表示把一幅图像内的像素点放置到另外一幅图像内的指定位置。
函数:dst = cv2.remap( src, map1, map2, interpolation[, borderMode[, borderValue]]
其中:
-
dst 代表目标图像,它和 src 具有相同的大小和类型。
-
src 代表原始图像。
-
map1 参数有两种可能的值:
- 表示(x,y)点的一个映射。
- 表示 CV_16SC2 , CV_32FC1, CV_32FC2 类型(x,y)点的 x值。
-
map2 参数同样有两种可能的值:
- 当 map1 表示(x,y)时,该值为空。
- 当 map1 表示(x,y)点的 x 值时,该值是 CV_16UC1, CV_32FC1 类型(x,y)点的 y 值。
-
Interpolation 代表插值方式,这里不支持 INTER_AREA 方法。
-
borderMode 代表边界模式。当该值为 BORDER_TRANSPARENT 时,表示目标图像内 的对应源图像内奇异点(outliers)的像素不会被修改。
-
borderValue 代表边界值,该值默认为 0。
不细嗦了。
1|5阈值处理
直白的说,就是将大于某个值设为255,低的就设为0。
函数:
cv2.threshold()
cv2.adaptiveThreshold()
threshold函数
retval, dst = cv2.threshold( src, thresh, maxval, type )
式中:
- retval 代表返回的阈值。
- dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型。
- src 代表要进行阈值分割的图像,可以是多通道的,8 位或 32 位浮点型数值。
- thresh 代表要设定的阈值。
- maxval 代表当 type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 类型时,需要设定的最大值。
- type 代表阈值分割的类型
cv2.THRESH_BINARY
大于thresh,设置为最大值,小于则为0
例:
cv2.THRESH_BINARY_INV
没啥,就反相。
其他的就不细嗦了
自适应阈值处理
dst = cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C )
式中:
- dst 代表自适应阈值处理结果。
- src 代表要进行处理的原始图像。需要注意的是,该图像必须是 8 位单通道的图像。
- maxValue 代表最大值。
- adaptiveMethod 代表自适应方法。
- thresholdType 代表阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV 中的一个。
- blockSize 代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为 3、5、 7 等。
- C 是常量。
其中自适应方法:
- cv2.ADAPTIVE_THRESH_MEAN_C:领域内所有像素点权值一样
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通 过高斯方程得到各个点的权重值
例:
Otsu处理
简单来说,就是让opencv帮你算thresh。
食用方法:
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
注意:
- 设置的thresh要为0
- 后面加上cv2.THRESH_OTSU方案
1|6图像平滑处理
图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。
取近似值的主要方式:
- 均值滤波
- 方波滤波
- 高斯滤波
- 中值滤波
- 双边滤波
- 2D卷积
均值滤波
用周围n*n的区域内均值代表该处像素值
针对边缘点,取边角处。
卷积核:
式中,M 和 N 分别对应高度和宽度。一般情况下,M 和 N 是相等的,例如比较常用的 3×3、5×5、 7×7 等。如果 M 和 N 的值越大,参与运算的像素点数量就越多,图像失真越严重。
把卷积核的元素与待处理区域计算即可获得最终值
编程实现
函数语法:
dst = cv2.blur( src, ksize, anchor, borderType )
- ksize 是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。 例如,其值可以为(5, 5),表示以 5×5 大小的邻域均值作为图像均值滤波处理的结果,。
- anchor 是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该 值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
- borderType 是边界样式,该值决定了以何种方式处理边界。一般情况下不需要考虑该值的取值,直接采用默认值即可。
其一般形式为:
dst = cv2.blur( src, ksize,)
例:
方框滤波
基本原理
在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择 滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。
函数实现
函数语法:
dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )
其中:
- ddepth 是处理结果图像的图像深度,一般使用-1 表示与原始图像使用相同的图像深度。
- ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。例如,滤波核的值可以为(3,3),表示以 3×3 大小的邻域均值作为图像均值滤波处理的结果
- anchor 是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该 值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
- normalize 表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围 内的值)处理,该参数是一个逻辑值,可能为真(值为 1)或假(值为 0)。
- 当参数 normalize=1 时,表示要进行归一化处理,要用邻域像素值的和除以面积。
- 当参数 normalize=0 时,表示不需要进行归一化处理,直接使用邻域像素值的和。
常用形式:
dst = cv2.boxFilter( src, ddepth, ksize )
高斯滤波
在进行均值滤波和方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将 中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。
函数语法
dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )
其中
- ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。 需要注意,滤波核的值必须是奇数。
- sigmaX 是卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。
- sigmaY 是卷积核在垂直方向上(Y 轴方向)的标准差。如果将该值设置为 0,则只采用 sigmaX 的值;如果 sigmaX 和 sigmaY 都是 0,则通过 ksize.width 和 ksize.height 计算得到。
- sigmaX = 0.3×[(ksize.width-1)×0.5 -1] + 0.8
- sigmaY = 0.3×[(ksize.height-1)×0.5-1] + 0.8
例:
中值滤波
中值滤波与前面介绍的滤波方式不同,不再采用加权求均值的方式计算滤波结果。它用邻 域内所有像素值的中间值来替代当前像素点的像素值。
函数实现
dst = cv2.medianBlur( src, ksize)
其中:
- ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。 需要注意,核大小必须是比 1 大的奇数,比如 3、5、7 等。
在中值滤波处理中,噪声成分很难被选上,所以可以在几乎不影响原有图像的情 况下去除全部噪声。但是由于需要进行排序等操作,中值滤波需要的运算量较大。
例:
双边滤波
双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息。
算法思想
在双边滤波中,当处在边缘时,与当前点色彩相近的像素点(颜色距离很近)会被给予较大的权重值;而与当前色彩差别较大的像素点(颜色距离很远)会被给予较小的权重值(极端情况下权重可能为 0,直接忽略该点),这样就保护了边缘信息。
函数语法
dst = cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace, borderType )
其中:
- d 是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。如果滤波空间较大(d>5),则速度 较慢。因此,在实时应用中,推荐 d=5。对于较大噪声的离线滤波,可以选择 d=9。
- sigmaColor 是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的 滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为 0 时,滤波失去意义;该值为 255 时,指定直径内的所有点都能够参与运算。
- sigmaSpace 是坐标空间中的 sigma 值。它的值越大,说明有越多的点能够参与到滤波计 算中来。当 d>0 时,无论 sigmaSpace 的值如何,d 都指定邻域大小;否则,d 与 sigmaSpace 的值成比例。
- borderType 是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。
2D卷积
说白了,自定义卷积核
dst = cv2.filter2D( src, ddepth, kernel, anchor, delta, borderType )
其中:
- kernel 是卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不 同的核,则必须将彩色图像分解后使用不同的核完成操作。
- delta 是修正值,它是可选项。如果该值存在,会在基础滤波的结果上加上该值作为最终的滤波处理结果。
__EOF__

本文链接:https://www.cnblogs.com/Asaka-QianXiang/p/17216334.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!