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 许可协议,转载请注明出处。
相关文章


