OpenCV如何利用阈值分割结果将图案叠加到阈值图像的黑色区域
Python+OpenCV实现不规则区域图案填充
核心思路
利用阈值图生成布尔掩码,通过numpy的数组索引直接匹配替换对应位置的像素,无需判断区域几何形状,完美适配不规则的黑色填充区域。
前置条件
- 阈值图与图案图尺寸完全一致
- 阈值图为单通道二值图(黑色像素值为0,白色像素值为255,非标准二值图可先做二值化处理)
- 图案图为3通道BGR格式(OpenCV默认读取格式)
实现代码
import cv2 import numpy as np # 读取图像 # 单通道读取阈值图 thresh_img = cv2.imread("your_threshold_img_path.png", 0) # 读取3通道图案图 pattern_img = cv2.imread("your_pattern_img_path.png") # 将阈值图转为3通道作为结果底图 result_img = cv2.cvtColor(thresh_img, cv2.COLOR_GRAY2BGR) # (可选)如果阈值图不是标准二值图,先执行二值化 # _, thresh_img = cv2.threshold(thresh_img, 127, 255, cv2.THRESH_BINARY) # 生成黑色区域的布尔掩码:像素值为0的位置即为需要填充的区域 fill_mask = thresh_img == 0 # 直接将图案图对应掩码位置的像素赋值到结果图 result_img[fill_mask] = pattern_img[fill_mask] # (可选)如果需要半透明叠加效果,替换上一步的赋值逻辑为以下代码,调整权重参数即可 # result_img[fill_mask] = cv2.addWeighted(result_img[fill_mask], 0.3, pattern_img[fill_mask], 0.7, 0) # 保存结果 cv2.imwrite("result.png", result_img)
逻辑说明
- 布尔索引会自动匹配所有符合
thresh_img == 0条件的像素位置,不管区域形状是否规则,都能精准替换 - 不需要做切片、轮廓提取等额外操作,运行效率极高,适配任意尺寸的输入图像
- 支持直接替换、半透明叠加两种效果,按需调整即可
内容的提问来源于stack exchange,提问作者TrueRandom
相关产品推荐
相关产品推荐

