type
status
date
slug
summary
tags
category
icon
password
一. 图像几何变换:插值方法对比
1.1 背景与目的
当对图像进行缩放、旋转或仿射变换时,需要根据原有像素计算新图像对应位置的像素值,这个过程就是插值(Interpolation)。不同的插值算法在效果和性能上各有优劣。
cv.warpAffine
函数用于执行仿射变换,我们可以通过指定不同的插值标志来观察效果。1.2 技术要点与实践经验
- 核心函数:
cv.warpAffine(src, M, dsize, flags, borderMode, borderValue)
src
: 输入图像。M
: 2x3 的仿射变换矩阵,可通过cv.getRotationMatrix2D
等函数获取。dsize
: 输出图像的尺寸。flags
: 插值方法标志。borderMode
: 边界填充模式。
- 常用插值方法对比:
cv.INTER_NEAREST
(最近邻插值):速度最快,但效果最差,放大时会出现明显的马赛克效应。cv.INTER_LINEAR
(双线性插值):默认选项,效果与性能的良好平衡,综合考虑了周围 4 个像素点。cv.INTER_AREA
(像素区域关系插值):用于缩小图像时效果最佳,能有效避免波纹。cv.INTER_CUBIC
(双三次插值):考虑周围 16 个像素点,效果比双线性更好,图像更平滑,但计算量更大。cv.INTER_LANCZOS4
(Lanczos 插值):考虑周围 64 个像素点,理论上效果最好,但计算成本最高。
- 边界模式(borderMode):用于处理变换后图像边界外的像素。
cv.BORDER_REPLICATE
:复制边界像素。cv.BORDER_CONSTANT
:使用指定颜色(borderValue
)填充。cv.BORDER_REFLECT
:反射边界,如fedcba|abcdefgh|hgfedcb
。
二. 图像透视变换:实现文档校正效果
1.1 背景与目的
透视变换(Perspective Transformation)可以将图像从一个视角转换到另一个视角,常用于校正倾斜拍摄的文档、移除透视畸变等场景。它需要一个 3x3 的变换矩阵,通过
cv.getPerspectiveTransform
函数计算得出。1.2 技术要点与实践经验
- 确定关键点:透视变换成功的关键在于找到原图中的四个点(
src_points
)和它们在目标图像中对应的四个点(dst_points
)。
- 顺序一致性:
src_points
和dst_points
中点的顺序必须严格对应。例如,都遵循“左上 -> 右上 -> 左下 -> 右下”的顺序。
- 获取变换矩阵:
cv.getPerspectiveTransform(src_points, dst_points)
会根据这两组点计算出变换矩阵M
。
- 应用变换:
cv.warpPerspective(src, M, dsize)
将矩阵M
应用于源图像,生成校正后的目标图像。
三. 图像滤波:消除噪点的常用方法
1.1 背景与目的
图像在采集或传输过程中可能引入噪点,影响视觉效果和后续处理。滤波是平滑图像、消除噪点的常用手段。不同的滤波器适用于不同类型的噪声。
1.2技术要点与实践经验
- 均值滤波 (
cv.blur
):计算核内像素的平均值。对高斯噪声有一定效果,但会使图像整体变得模糊。
- 高斯滤波 (
cv.GaussianBlur
):加权平均,离中心点越近的像素权重越大。相比均值滤波,能更好地保留图像边缘。
- 中值滤波 (
cv.medianBlur
):用核内像素的中值替换中心像素。对椒盐噪声(黑白噪点)有奇效,且能较好地保留边缘。
- 双边滤波 (
cv.bilateralFilter
):同时考虑空间距离和像素值差异。既能有效去噪,又能最大程度地保留边缘细节,是效果最好的滤波器之一,但计算速度较慢。
四. 图像掩膜(Mask)应用:提取特定颜色区域
1.1 背景与目的
掩膜(Mask)是一个二值图像,它指定了我们感兴趣的区域。通过掩膜,可以精确地对图像的特定部分进行操作,例如提取特定颜色的物体。
1.2 技术要点与实践经验
- 颜色空间转换:对于颜色检测,将图像从 BGR 转换为 HSV 颜色空间通常更有效。HSV 将颜色(Hue)、饱和度(Saturation)和明度(Value)分开,使得颜色范围的定义比在 BGR 中更稳定。
- 创建掩膜:
cv.inRange(hsv_image, lower_bound, upper_bound)
函数会生成一个掩膜。在指定的颜色范围内的像素在掩膜中为白色(255),范围外的为黑色(0)。
- 应用掩膜:
cv.bitwise_and(src, src, mask=mask)
函数利用掩膜进行按位与操作。只有掩膜中为白色的区域,src
图像的像素才会被保留,其余区域变为黑色。
五. 颜色替换:基于掩膜的像素级操作
1.1 背景与目的
在提取特定颜色区域的基础上,我们可以更进一步,直接替换这些区域的颜色。这是一种快速实现“换装”、“改色”等特效的方法。
1.2 技术要点与实践经验
- 核心操作:
demo[mask == 255] = (0, 255, 0)
- 原理解析:这行代码利用了 NumPy 的强大功能——布尔索引。
mask == 255
会创建一个布尔数组,掩膜中值为 255 (白色) 的位置为True
,否则为False
。demo[...]
使用这个布尔数组作为索引,选中demo
图像中所有对应True
的像素点。- 最后,将这些选中的像素点统一赋值为新的颜色
(0, 255, 0)
(绿色)。
- 对比:相比于
bitwise_and
,这种方法更直接,适用于简单的颜色替换任务。
六. 综合案例:为图片添加Logo水印
1.1 背景与目的
为图片添加水印是常见的需求。这个案例综合运用了ROI(感兴趣区域)、掩膜创建和图像融合技术,是理解掩膜工作原理的绝佳实践。
代码修正与说明: 原代码中创建 mask 和 mask_bg 的逻辑是一样的,这可能会导致 mask_bg 无法正确地创建出背景区域的掩码。正确的做法是使用 cv.bitwise_not 来反转掩码。 修正版逻辑如下:
1.2 技术要点与实践经验
- 选择ROI:首先在背景图上确定一块与 logo 等大小的区域
roi
,这是我们将要操作的目标。
- 创建掩膜:
- 创建一个
mask
,其中 logo 图案为白色,背景为黑色。 - 创建一个
mask
的反向掩膜mask_inv
,其中 logo 图案为黑色,背景为白色。
- 分离前景与背景:
- 使用
mask
和bitwise_and
从原始 logo 中提取出带颜色的 logo 部分(logo_fg
)。 - 使用
mask_inv
和bitwise_and
从roi
中提取出背景,并在 logo 位置“挖出一个洞”(bg_bg
)。
- 图像融合:使用
cv.add
将logo_fg
和bg_bg
相加。由于它们各自在对方的区域都是黑色(值为0),相加后即可完美融合。
- 更新原图:最后,将融合后的图像
dst
赋值回原图的roi
区域。
七.每日一题
题目:2322. 从树中删除边的最小分数
存在一棵无向连通树,树中有编号从
0
到 n - 1
的 n
个节点, 以及 n - 1
条边。给你一个下标从 0 开始的整数数组
nums
,长度为 n
,其中 nums[i]
表示第 i
个节点的值。另给你一个二维整数数组 edges
,长度为 n - 1
,其中 edges[i] = [ai, bi]
表示树中存在一条位于节点 ai
和 bi
之间的边。删除树中两条 不同 的边以形成三个连通组件。对于一种删除边方案,定义如下步骤以计算其分数:
- 分别获取三个组件 每个 组件中所有节点值的异或值。
- 最大 异或值和 最小 异或值的 差值 就是这一种删除边方案的分数。
- 例如,三个组件的节点值分别是:
[4,5,7]
、[1,9]
和[3,3,3]
。三个异或值分别是4 ^ 5 ^ 7 =
6
、1 ^ 9 =
8
和3 ^ 3 ^ 3 =
3
。最大异或值是8
,最小异或值是3
,分数是8 - 3 = 5
。
返回在给定树上执行任意删除边方案可能的 最小 分数。
示例 1:

示例 2:

解题:
今天的题看得我一脸懵,完全不会,等我学了再战🥲🥲🥲🥲
- 作者:sisui
- 链接:https://www.sisui.me//article/py-opencv-image-processing-techniques
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章