计算机视觉 : 端午无事 ,图像处理入门案例一文速通

一. 前言

以前跨语言的东西是不太敢碰的 ,怕时间不够 ,学习效率低学不会。 现在 AI 时代到了 ,借助 AI 也是把以前想学的快速学了一遍 ,过程中整理了一些东西,分享给大家。

文章的目

  • 完善计算机视觉的整体体系 ,本次主要针对 中度使用
  • 完善案例的代码Demo ,输出使用方式

本文的脉络

  • 基础图像的加解密(打码)处理
  • 图像水印处理
  • 图像物体检测
  • 绿幕隐身
  • 未来 : 深入图像识别 / AI 处理

二. 关于计算机视觉的前置文章

快跟上 ,和我一起入门计算机视觉

看完稳赚不亏,计算机视觉的基础概念与入门

五分钟,零基础也能入门 Python 图像文字识别

五分钟就能写出来 ,Python 实现一个 AI 物体识别需要几步?

三. 案例整理

3.1 图像加解密

简单加密 : 基于密钥进行加解密 -- decode_001.py

python 复制代码
"""生成或读取密钥图像"""
key = np.random.randint(0, 256, size=original_img.shape, dtype=np.uint8)

"""加密图像"""
cv2.bitwise_xor(original_img, key)

"""解密图像"""
cv2.bitwise_xor(encrypted_img, key)

掩模方式 : 针对特定部位进行掩码加密 -- decode_002.py

python 复制代码
""" 保存原始图像副本"""
original_copy = original_img.copy()

""" 生成3通道掩膜"""
mask_3d = np.stack([mask] * 3, axis=2)

""" 加密:将指定区域设置为黑色(0)"""
encrypted_img = np.where(mask_3d == 1, 0, original_img)

""" 解密:将原始数据恢复到加密区域"""
decrypted_img = np.where(mask_3d == 1, original_copy, encrypted_img)


# 创建特点区域的掩码
def create_mask(image_shape, x1, y1, x2, y2):
    """创建一个指定区域的掩模图像"""
    r, c = image_shape[:2]
    mask = np.zeros((r, c), dtype=np.uint8)
    # 确保坐标在图像范围内
    y1 = max(0, y1)
    y2 = min(r, y2)
    x1 = max(0, x1)
    x2 = min(c, x2)
    mask[y1:y2, x1:x2] = 1
    return mask

ROI方式 : 直接对原有图像进行异或加密 - decode_003.py

python 复制代码
""" 生成随机密钥,与原图像形状相同 """ 
key = np.random.randint(0, 256, size=original_img.shape, dtype=np.uint8)

""" 加密:对整个图像进行异或操作 """ 
encrypted_full = cv2.bitwise_xor(original_img, key)

""" 提取加密后的ROI区域 """ 
encrypted_roi = encrypted_full[y1:y2, x1:x2]

""" 将加密的ROI区域替换到原始图像 """ 
result_img = original_img.copy() result_img[y1:y2, x1:x2] = encrypted_roi

""" 解密:对加密图像进行异或操作 """ 
decrypted_full = cv2.bitwise_xor(encrypted_img, key)

""" 提取解密后的ROI区域 """ 
decrypted_roi = decrypted_full[y1:y2, x1:x2]

""" 将解密后的ROI区域替换回加密图像 """ 
result_img = encrypted_img.copy() result_img[y1:y2, x1:x2] = decrypted_roi

原理和对比 :

python 复制代码
## 按位异或(XOR)运算
- 加密:将原始图像与密钥图像进行按位异或运算,得到加密图像。
- 解密:将加密图像与密钥图像再次进行按位异或运算,恢复原始图像。


## 掩模方式 和 ROI方式 的原理简述
- 掩模 : 掩膜(Mask) 是一个与原图像大小和通道数相同的辅助图像
    - 通过一个二维数组(通常为灰度图像)来控制主图像的每个像素
    - 使用 cv2.bitwise_and 函数,保留掩膜中标记为 1 的区域
- ROI : 直接对图像特定区域进行处理 ,直接替换
对比项 掩模方式 ROI方式
实现方式 通过创建掩模图像,提取并替换指定区域 直接操作图像的特定区域,提取并替换脸部区域
灵活性 灵活,适用于任意形状的区域 灵活,适用于固定形状的脸部区域
复杂度 较高,需要创建掩模图像 较低,直接操作ROI区域
适用场景 适用于需要对任意形状区域进行打码的场景 适用于需要对固定形状(如人脸)区域进行打码的场景

3.2 水印的两种常见玩法

基础数字水印操作 : 通过位平面载入水印 watermark_001.py

python 复制代码
""" 准备透明旋转水印 """ 
rotated_watermark = cv2.warpAffine(binary_watermark, rotation_matrix, (width, height)) normalized_watermark = rotated_watermark.astype(float) / 255.0 * alpha

""" 分散平铺水印 """ 
h_spacing = h * spacing_factor # 水印间的垂直间距 
w_spacing = w * spacing_factor # 水印间的水平间距 
offset = (w_spacing // 2) if (i // h_spacing) % 2 == 0 else 0 # 错位效果 tiled_watermark[i:i+place_h, j:j+place_w] = watermark_tile[:place_h, :place_w]

""" 可见水印嵌入 """ 
embedded = carrier * (1 - watermark_3ch) + watermark_3ch * 255

""" LSB水印嵌入 """ 
carrier_lsb = channel & 0xFE # 将最低位清零 
embedded_channel = carrier_lsb | binary_watermark # 嵌入水印二值图

基础可视化水印操作 : 能见度更高 watermark_002.py

python 复制代码
## 这段代码创建了一个从中心向边缘渐变的透明度掩模,中心区域不透明度高,边缘区域不透明度低,使水印效果更自然。
# 创建渐变透明度掩模
for i in range(roi_height):
        for j in range(roi_width):
            # 计算到中心的距离比例
            center_x, center_y = roi_width / 2, roi_height / 2
            dist_x = abs(j - center_x) / center_x
            dist_y = abs(i - center_y) / center_y
            # 距离越远,透明度越低
            alpha = 1.0 - max(dist_x, dist_y) * 0.7
            mask[roi_y1 + i, roi_x1 + j] = max(0.3, alpha)  # 最小透明度为0.3

## 这是透明度混合的核心算法,通过掩模的权重值,将水印图像与原图进行加权混合,实现半透明效果。公式为:`结果 = alpha * 水印 + (1 - alpha) * 原图`。
# 应用透明度混合: dst = alpha * src1 + (1 - alpha) * src2
watermarked[roi_y1:roi_y2, roi_x1:roi_x2, c] = (
    mask[roi_y1:roi_y2, roi_x1:roi_x2] * watermark_resized[:, :, c] + 
    (1 - mask[roi_y1:roi_y2, roi_x1:roi_x2]) * roi)


    

## **创建统一透明度版本**:
alpha = 0.4  # 统一的透明度值
for c in range(3):  # 处理BGR三个通道
        roi = watermarked2[roi_y1:roi_y2, roi_x1:roi_x2, c]
        watermarked2[roi_y1:roi_y2, roi_x1:roi_x2, c] = (
            alpha * watermark_resized[:, :, c] + 
            (1 - alpha) * roi
        )

原理简述 :

  • 操作步骤 : 载体图像 → 嵌入水印 → 含水印载体图像 → 提取水印 → 原始水印
  • 数字水印 : 一种通过在数字作品中嵌入特定数字信号来实现信息隐藏
    • 位平面 : 将图像中所有像素值的 某一二进制位提取出来 ,形成一个新的图像
    • 最低有效位 : 二进制数中的 最右边的一位, 最低有效位的变化对图像的整体视觉效果影响最小
  • 可视化水印 : 通过 ROI 方式 ,将水印图像叠加到该区域中
    • 本质 : 视化水印直接叠加在载体图像上,具有较高的可见性
    • 实现 : 除了 ROI 方式 ,还可以通过加法运算的方式 ,本次不细述
python 复制代码
# 数字水印操作步骤 :
'''1. 嵌入过程'''
   - 将载体图像和水印图像分别转换为二进制形式。
   - 将载体图像的最低有效位清0。
   - 将水印图像的二进制值嵌入到载体图像的最低有效位上。
'''2. 提取过程'''
   - 将含水印载体图像转换为二进制形式。
   - 提取含水印载体图像的最低有效位,得到水印信息。

------------------------------------

3.3 人形检测 (Outline.py

  1. 敏感度参数控制系统

    python 复制代码
    # 基于敏感度调整参数
    min_area = int(1000 * (1 - sensitivity**2))  # 敏感度越高,最小面积越小
    max_area_ratio = 0.3 + sensitivity * 0.4     # 敏感度越高,最大面积比例越大
    min_aspect = 0.2 - sensitivity * 0.15        # 敏感度越高,最小宽高比越小
    max_aspect = 5 + sensitivity * 10            # 敏感度越高,最大宽高比越大
    overlap_threshold = 0.8 - sensitivity * 0.3  # 敏感度越高,允许更多重叠

    这组公式建立了敏感度参数与各种检测阈值之间的关系,允许通过单一参数控制整个检测系统的严格程度。

  2. 多阈值检测与敏感度关联

    python 复制代码
    # 多阈值处理方法
    binary_methods = []
    
    # OTSU二值化 - 始终使用
    ret, otsu = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    binary_methods.append(otsu)
    
    # 自适应阈值 - 敏感度高时使用
    if sensitivity > 0.3:
        block_size = int(25 - sensitivity * 10)
        block_size = block_size if block_size % 2 == 1 else block_size + 1  # 确保是奇数
        c_value = int(5 - sensitivity * 3)
        
        adaptive_gaussian = cv2.adaptiveThreshold(...)
        binary_methods.append(adaptive_gaussian)

    根据敏感度启用不同的图像处理算法,低敏感度时只使用基本算法,高敏感度时启用更多复杂算法以捕获更多潜在目标。

  3. 形态学操作参数动态调整

    python 复制代码
    # 形态学操作核大小随敏感度调整
    morph_size = int(7 - sensitivity * 4)        # 敏感度越高,核越小
    morph_size = max(3, morph_size)              # 确保至少为3
    
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (morph_size, morph_size))

    形态学操作核大小会影响目标边界的细节保留,敏感度高时使用较小的核以保留更多细节。

  4. 条件检测分支

    python 复制代码
    # 合并二值图像
    if sensitivity > 0.8:  # 极高敏感度时,使用图像合并以捕获更多区域
        combined = np.zeros_like(binary_methods[0])
        for binary in binary_methods:
            combined = cv2.bitwise_or(combined, binary)

原理解析 :

  1. 多方法目标分割 → 2. 连通域标记统计 → 3. 轮廓特征计算 → 4. 区域筛选去重 → 5. 最终统计输出
核心知识点 原理说明 关键方法 检测统计作用
1. 连通域分析 在二值图像中识别和标记所有连通的像素区域,为每个独立区域分配唯一标签,并统计各区域的几何特征 cv2.connectedComponentsWithStats() 核心统计功能:自动统计每个目标的面积、位置、宽高等几何特征,是目标计数和特征提取的基础
2. 轮廓检测与特征提取 检测二值图像中物体的边界轮廓,并计算轮廓的几何特征如面积、周长、形状复杂度等 cv2.findContours() cv2.contourArea() cv2.arcLength() 形状统计:提供目标的精确边界信息,计算面积、周长、形状因子等,用于目标分类和质量评估
3. 多阈值二值化策略 使用OTSU自动阈值、自适应阈值、固定阈值等多种方法生成二值图像,捕获不同光照和对比度条件下的目标 cv2.threshold() cv2.adaptiveThreshold() cv2.inRange() 鲁棒检测:通过多种阈值方法提高检测覆盖率,确保在复杂环境下能够检测到所有潜在目标
4. 形态学操作优化 使用开运算去除噪点、闭运算填充孔洞、膨胀扩大目标区域,优化二值图像质量 cv2.morphologyEx() cv2.dilate() 图像预处理:消除噪声干扰,连接断裂的目标,确保连通域分析的准确性
5. 区域筛选与重叠处理 基于面积、宽高比、重叠度等特征对检测到的区域进行筛选,去除无效区域和重复检测 几何特征计算 + 掩膜重叠检测 精确统计:通过几何约束和重叠分析确保每个目标只被统计一次,提高计数准确性
6. 自适应参数控制 根据敏感度参数动态调整检测阈值、形态学核大小、面积限制等,实现检测严格程度的精确控制 参数映射函数 灵活统计:通过敏感度控制检测的包容性,适应不同精度要求的统计任务

3.5 绿幕隐身 (特定绿幕抠图)

  1. HSV色彩空间转换
python 复制代码
# 转换为HSV色彩空间
hsv = cv2.cvtColor(fore, cv2.COLOR_BGR2HSV)

'''作用:'''
- 将BGR图像转换为HSV色彩空间,使颜色检测更加可靠,
- HSV色彩空间将颜色的色调(H)、饱和度(S)和亮度(V)分离。
  1. 精确颜色范围定义与掩模创建
python 复制代码
# 创建绿色掩模
lower_green = np.array(green_lower)
upper_green = np.array(green_upper)
mask = cv2.inRange(hsv, lower_green, upper_green)

'''作用:'''
使用inRange函数创建二值掩模,该掩模标识出图像中所有在指定HSV范围内的像素
  1. 掩模优化 - 噪点去除
python 复制代码
# 使用中值滤波去除小噪点
mask = cv2.medianBlur(mask, 5)

# 形态学操作 - 闭操作填充小洞
kernel = np.ones((5, 5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=2)

'''作用:'''
- 通过中值滤波和形态学闭操作改善掩模质量,去除噪点并填充小孔洞。
  1. 面积过滤 - 去除小区域
python 复制代码
# 只保留较大的连通区域,去除小噪点
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
min_area = 500  # 最小面积阈值
clean_mask = np.zeros_like(mask)

for contour in contours:
    area = cv2.contourArea(contour)
    if area > min_area:
        cv2.drawContours(clean_mask, [contour], 0, 255, -1)

mask = clean_mask

'''作用:'''
- 计算掩模中每个连通区域的面积,并只保留大于阈值的区域。
- 这有效地消除了小的误检区域,大大提高了掩模的准确性。
  1. 边缘处理 - 平滑过渡
python 复制代码
# 边缘处理 - 创建边缘掩模
edge_mask = np.zeros_like(mask)
for contour in contours:
    area = cv2.contourArea(contour)
    if area > min_area:
        cv2.drawContours(edge_mask, [contour], 0, 255, 2)

# 膨胀边缘
edge_kernel = np.ones((3, 3), np.uint8)
edge_mask = cv2.dilate(edge_mask, edge_kernel, iterations=2)

# 边缘模糊处理
blurred_fore = cv2.GaussianBlur(fore, (9, 9), 0)
fore_with_blur = fore.copy()
fore_with_blur[edge_mask == 255] = blurred_fore[edge_mask == 255]


'''作用''':
- 为掩模边缘创建平滑过渡区域,避免最终结果中出现明显的边界。
- 这是通过检测轮廓边缘,然后在边缘区域应用高斯模糊实现的。
  1. 区域合成 - 隐形效果核心
python 复制代码
# 使用掩模提取背景
back_region = cv2.bitwise_and(back, back, mask=mask)

# 使用反向掩模提取前景
mask_inv = cv2.bitwise_not(mask)
fore_region = cv2.bitwise_and(fore_with_blur, fore_with_blur, mask=mask_inv)

# 合并前景和背景
result = cv2.add(back_region, fore_region)

'''作用''':
- 首先从背景图像中提取对应掩模区域的像素
- 然后从前景图像中提取非掩模区域的像素,最后将两部分合并

- 这样,前景图像中掩模标识的区域(绿色区域)就被背景图像中的相应区域替换,创造隐形效果。

四. 后续预告

写着写着发现东西有点复杂了 ,如果单纯的写个 Demo 聊不清楚 ,所以后面还会有几个案例准备单独整理出来 :

  • A. 以图识图的原理和高级案例用法
  • B. 图像信息识别的原理和高级案例
  • C. 更高级的用法 : 比如 AI

总结

  • 参考书籍 : @ 计算机视觉40例从入门到深度学习
  • 学习搭子 : Trae + GPT

AI 就是好 ,以前完全不好入门的东西 ,可以通过 AI 快速入门 。 上面的案例都虽然大部分是 AI 完成的 ,但是都是修改调试过的可执行代码 。 感兴趣的可以拉源代码体验一下 :

代码地址 :

gitee.com/antblack/Py...

最后的最后 ❤️❤️❤️👇👇👇

相关推荐
大写-凌祁4 分钟前
GLIDE论文阅读笔记与DDPM(Diffusion model)的原理推导
论文阅读·人工智能·笔记·python·深度学习·机器学习·计算机视觉
SimonKing6 分钟前
面试实习生后,理解了王树国校长三问中国教育的演讲
后端·程序员
Mikhail_G6 分钟前
Python应用continue关键字初解
大数据·运维·开发语言·python·数据分析
TAICHIFEI14 分钟前
KITTI数据集(计算机视觉和自动驾驶领域)
图像处理·人工智能·深度学习·计算机视觉
互联网杂货铺15 分钟前
unittest自动化测试实战
自动化测试·软件测试·python·测试工具·程序人生·职场和发展·测试用例
Code_流苏15 分钟前
Python趣学篇:从零打造智能AI井字棋游戏(Python + Tkinter + Minimax算法)
python·算法·游戏·tkinter·智能井字棋·minimax算法
翻滚吧键盘21 分钟前
数据库,Spring Boot,数据源
数据库·spring boot·后端
水银嘻嘻22 分钟前
04 APP 自动化- Appium toast 元素定位&列表滑动
python·appium·自动化
@ chen25 分钟前
Springboot中Controller接收参数的方式
java·spring boot·后端
Ronin-Lotus1 小时前
嵌入式硬件篇---龙芯2k1000串口
linux·网络·python·嵌入式硬件·龙芯·2k1000