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 技术要点与实践经验

  1. 确定关键点:透视变换成功的关键在于找到原图中的四个点(src_points)和它们在目标图像中对应的四个点(dst_points)。
  1. 顺序一致性src_pointsdst_points 中点的顺序必须严格对应。例如,都遵循“左上 -> 右上 -> 左下 -> 右下”的顺序。
  1. 获取变换矩阵cv.getPerspectiveTransform(src_points, dst_points) 会根据这两组点计算出变换矩阵 M
  1. 应用变换cv.warpPerspective(src, M, dsize) 将矩阵 M 应用于源图像,生成校正后的目标图像。

三. 图像滤波:消除噪点的常用方法

1.1 背景与目的

图像在采集或传输过程中可能引入噪点,影响视觉效果和后续处理。滤波是平滑图像、消除噪点的常用手段。不同的滤波器适用于不同类型的噪声。

1.2技术要点与实践经验

  • 均值滤波 (cv.blur):计算核内像素的平均值。对高斯噪声有一定效果,但会使图像整体变得模糊。
  • 高斯滤波 (cv.GaussianBlur):加权平均,离中心点越近的像素权重越大。相比均值滤波,能更好地保留图像边缘。
  • 中值滤波 (cv.medianBlur):用核内像素的中值替换中心像素。对椒盐噪声(黑白噪点)有奇效,且能较好地保留边缘。
  • 双边滤波 (cv.bilateralFilter):同时考虑空间距离和像素值差异。既能有效去噪,又能最大程度地保留边缘细节,是效果最好的滤波器之一,但计算速度较慢。

四. 图像掩膜(Mask)应用:提取特定颜色区域

1.1 背景与目的

掩膜(Mask)是一个二值图像,它指定了我们感兴趣的区域。通过掩膜,可以精确地对图像的特定部分进行操作,例如提取特定颜色的物体。

1.2 技术要点与实践经验

  1. 颜色空间转换:对于颜色检测,将图像从 BGR 转换为 HSV 颜色空间通常更有效。HSV 将颜色(Hue)、饱和度(Saturation)和明度(Value)分开,使得颜色范围的定义比在 BGR 中更稳定。
  1. 创建掩膜cv.inRange(hsv_image, lower_bound, upper_bound) 函数会生成一个掩膜。在指定的颜色范围内的像素在掩膜中为白色(255),范围外的为黑色(0)。
  1. 应用掩膜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 技术要点与实践经验

  1. 选择ROI:首先在背景图上确定一块与 logo 等大小的区域 roi,这是我们将要操作的目标。
  1. 创建掩膜
      • 创建一个 mask,其中 logo 图案为白色,背景为黑色。
      • 创建一个 mask 的反向掩膜 mask_inv,其中 logo 图案为黑色,背景为白色。
  1. 分离前景与背景
      • 使用 maskbitwise_and 从原始 logo 中提取出带颜色的 logo 部分(logo_fg)。
      • 使用 mask_invbitwise_androi 中提取出背景,并在 logo 位置“挖出一个洞”(bg_bg)。
  1. 图像融合:使用 cv.addlogo_fgbg_bg 相加。由于它们各自在对方的区域都是黑色(值为0),相加后即可完美融合。
  1. 更新原图:最后,将融合后的图像 dst 赋值回原图的 roi 区域。

七.每日一题

题目:2322. 从树中删除边的最小分数

存在一棵无向连通树,树中有编号从 0 到 n - 1 的 n 个节点, 以及 n - 1 条边。
给你一个下标从 0 开始的整数数组 nums ,长度为 n ,其中 nums[i] 表示第 i 个节点的值。另给你一个二维整数数组 edges ,长度为 n - 1 ,其中 edges[i] = [ai, bi] 表示树中存在一条位于节点 ai 和 bi 之间的边。
删除树中两条 不同 的边以形成三个连通组件。对于一种删除边方案,定义如下步骤以计算其分数:
  1. 分别获取三个组件 每个 组件中所有节点值的异或值。
  1. 最大 异或值和 最小 异或值的 差值 就是这一种删除边方案的分数。
  • 例如,三个组件的节点值分别是:[4,5,7][1,9] 和 [3,3,3] 。三个异或值分别是 4 ^ 5 ^ 7 = 61 ^ 9 = 8 和 3 ^ 3 ^ 3 = 3 。最大异或值是 8 ,最小异或值是 3 ,分数是 8 - 3 = 5 。
返回在给定树上执行任意删除边方案可能的 最小 分数。
示例 1:
notion image
示例 2:
notion image
 

解题:

今天的题看得我一脸懵,完全不会,等我学了再战🥲🥲🥲🥲
 
10.py-OpenCV入门:图像处理核心操作全面指南12.py-OpenCV核心教程:从边缘检测、轮廓分析到直方图
Loading...