计算机视觉 :端午无事 ,图像处理入门案例一文速通
(??金石瓜分计划3??天倒计时,速戳上图了解详情??)
一. 前言以前跨语言的东西是不太敢碰的 ,怕时间不够 ,学习效率低学不会。 现在 AI 时代到了 ,借助 AI 也是把以前想学的快速学了一遍 ,过程中整理了一些东西,分享给大家。
文章的目完善计算机视觉的整体体系 ,本次主要针对中度使用完善案例的代码 Demo ,输出使用方式本文的脉络基础图像的加解密(打码)处理图像水印处理图像物体检测绿幕隐身未来 : 深入图像识别 / AI 处理二. 关于计算机视觉的前置文章快跟上 ,和我一起入门计算机视觉
看完稳赚不亏,计算机视觉的基础概念与入门
3.五分钟,零基础也能入门Python图像文字识别
4.五分钟就能写出来 ,Python 实现一个 AI 物体识别需要几步?
三. 案例整理3.1 图像加解密?「简单加密」: 基于密钥进行加解密 -- decode_001.py
?"""生成或读取密钥图像"""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
?""" 保存原始图像副本"""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)
# 创建特点区域的掩码defcreate_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 returnmask
?「ROI 方式」: 直接对原有图像进行异或加密 - decode_003.py
?""" 生成随机密钥,与原图像形状相同 """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
?原理和对比 :
?## 按位异或(XOR)运算-加密:将原始图像与密钥图像进行按位异或运算,得到加密图像。-解密:将加密图像与密钥图像再次进行按位异或运算,恢复原始图像。
## 掩模方式 和 ROI方式 的原理简述-掩模 : 掩膜(Mask) 是一个与原图像大小和通道数相同的辅助图像 - 通过一个二维数组(通常为灰度图像)来控制主图像的每个像素 - 使用 cv2.bitwise_and 函数,保留掩膜中标记为 1 的区域- ROI : 直接对图像特定区域进行处理 ,直接替换对比项掩模方式ROI 方式「实现方式」通过创建掩模图像,提取并替换指定区域直接操作图像的特定区域,提取并替换脸部区域「灵活性」灵活,适用于任意形状的区域灵活,适用于固定形状的脸部区域「复杂度」较高,需要创建掩模图像较低,直接操作 ROI 区域「适用场景」适用于需要对任意形状区域进行打码的场景适用于需要对固定形状(如人脸)区域进行打码的场景3.2 水印的两种常见玩法?基础数字水印操作 : 通过位平面载入水印 watermark_001.py
?""" 准备透明旋转水印 """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==0else0# 错位效果 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
?
## 这段代码创建了一个从中心向边缘渐变的透明度掩模,中心区域不透明度高,边缘区域不透明度低,使水印效果更自然。# 创建渐变透明度掩模foriinrange(roi_height): forjinrange(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) * src2watermarked[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# 统一的透明度值forcinrange(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 方式 ,还可以通过加法运算的方式 ,本次不细述# 数字水印操作步骤 :'''1. 嵌入过程''' - 将载体图像和水印图像分别转换为二进制形式。 - 将载体图像的最低有效位清0。 - 将水印图像的二进制值嵌入到载体图像的最低有效位上。'''2. 提取过程''' - 将含水印载体图像转换为二进制形式。 - 提取含水印载体图像的最低有效位,得到水印信息。
------------------------------------
3.3 人形检测 (Outline.py)1. 「敏感度参数控制系统」:
# 基于敏感度调整参数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.「多阈值检测与敏感度关联」# 多阈值处理方法binary_methods=[]
# OTSU二值化 - 始终使用ret, otsu = cv2.threshold(blurred,0,255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)binary_methods.append(otsu)
# 自适应阈值 - 敏感度高时使用ifsensitivity 0.3: block_size= int(25- sensitivity *10) block_size= block_size if block_size %2==1else block_size +1 # 确保是奇数 c_value= int(5- sensitivity *3)
adaptive_gaussian= cv2.adaptiveThreshold(...) binary_methods.append(adaptive_gaussian)根据敏感度启用不同的图像处理算法,低敏感度时只使用基本算法,高敏感度时启用更多复杂算法以捕获更多潜在目标。
3. 「形态学操作参数动态调整」:
# 形态学操作核大小随敏感度调整morph_size= int(7- sensitivity *4) # 敏感度越高,核越小morph_size= max(3, morph_size) # 确保至少为3
kernel= cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (morph_size, morph_size)形态学操作核大小会影响目标边界的细节保留,敏感度高时使用较小的核以保留更多细节。
4. 「条件检测分支」:
# 合并二值图像ifsensitivity 0.8: # 极高敏感度时,使用图像合并以捕获更多区域 combined= np.zeros_like(binary_methods[0]) forbinary in binary_methods: combined= cv2.bitwise_or(combined, binary)
?原理解析 :
?多方法目标分割→ 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.4 绿幕隐身 (特定绿幕抠图)1. HSV 色彩空间转换# 转换为HSV色彩空间hsv = cv2.cvtColor(fore, cv2.COLOR_BGR2HSV)
'''作用:'''- 将BGR图像转换为HSV色彩空间,使颜色检测更加可靠,- HSV色彩空间将颜色的色调(H)、饱和度(S)和亮度(V)分离。2. 精确颜色范围定义与掩模创建# 创建绿色掩模lower_green = np.array(green_lower)upper_green = np.array(green_upper)mask = cv2.inRange(hsv, lower_green, upper_green)
'''作用:'''使用inRange函数创建二值掩模,该掩模标识出图像中所有在指定HSV范围内的像素3. 掩模优化 - 噪点去除# 使用中值滤波去除小噪点mask = cv2.medianBlur(mask,5)
# 形态学操作 - 闭操作填充小洞kernel = np.ones((5,5), np.uint8)mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=2)
'''作用:'''- 通过中值滤波和形态学闭操作改善掩模质量,去除噪点并填充小孔洞。4. 面积过滤 - 去除小区域# 只保留较大的连通区域,去除小噪点contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)min_area =500# 最小面积阈值clean_mask = np.zeros_like(mask)
forcontourincontours: area = cv2.contourArea(contour) ifarea min_area: cv2.drawContours(clean_mask, [contour],0,255, -1)
mask = clean_mask
'''作用:'''- 计算掩模中每个连通区域的面积,并只保留大于阈值的区域。- 这有效地消除了小的误检区域,大大提高了掩模的准确性。5. 边缘处理 - 平滑过渡# 边缘处理 - 创建边缘掩模edge_mask = np.zeros_like(mask)forcontourincontours: area = cv2.contourArea(contour) ifarea 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]
'''作用''':- 为掩模边缘创建平滑过渡区域,避免最终结果中出现明显的边界。- 这是通过检测轮廓边缘,然后在边缘区域应用高斯模糊实现的。6. 区域合成 - 隐形效果核心# 使用掩模提取背景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 完成的 ,但是都是修改调试过的可执行代码」。 感兴趣的可以拉源代码体验一下~
?代码地址??:juejin.cn/post/6941642435189538824
AI编程资讯AI Coding专区指南:https://aicoding.juejin.cn/aicoding
点击"阅读原文"了解详情~
阅读原文
网站开发网络凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求...
请立即点击咨询我们或拨打咨询热线:13245491521 13245491521 ,我们会详细为你一一解答你心中的疑难。 项目经理在线