PHP中如何检测图像内的masked透明矩形区域坐标?
矩形透明蒙版区域检测及二维码替换实现方案
你无需寻找专门的定制类库,使用通用图像处理库即可完成需求,Python环境下先安装依赖:pip install opencv-python pillow
第一步:检测固定尺寸透明蒙版坐标
所有图片的蒙版尺寸一致,你可以先确认蒙版的预设宽高作为匹配过滤条件,检测逻辑如下:
- 用带Alpha通道的模式读取图片,确保能获取像素透明度信息,OpenCV读取时指定
cv2.IMREAD_UNCHANGED参数即可拿到4通道(BGR+A)的数据 - 提取Alpha通道做二值化处理,完全透明的像素Alpha值为0,你可以根据实际蒙版透明度调整阈值,所有低于阈值的像素标记为蒙版区域
- 用轮廓检测接口提取所有透明区域的外接矩形,过滤出和预设蒙版宽高一致的矩形,得到的
(x, y, w, h)就是目标蒙版的左上角坐标、宽度、高度 - 因为所有图片蒙版尺寸一致,拿到一次坐标后可以复用,也可以每张图都做一次检测避免个别图片坐标偏移
核心检测代码示例:
import cv2 import numpy as np def get_mask_coord(img_path, standard_mask_w, standard_mask_h): # 读取带透明通道的原图 img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED) # 提取Alpha通道 alpha = img[:, :, 3] # 二值化提取透明区域,阈值可根据实际透明度调整 _, binary_mask = cv2.threshold(alpha, 5, 255, cv2.THRESH_BINARY_INV) # 查找所有透明区域的轮廓 contours, _ = cv2.findContours(binary_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) # 匹配标准蒙版尺寸,允许2像素误差 if abs(w - standard_mask_w) <= 2 and abs(h - standard_mask_h) <=2: return (x, y, w, h) return None
第二步:将二维码替换到蒙版位置
拿到坐标后直接做图像粘贴替换即可,逻辑如下:
- 先把待替换的二维码调整到和蒙版完全一致的宽高,用 Lanczos 采样算法调整可以避免二维码模糊
- 直接将调整好的二维码粘贴到原图片的对应坐标位置,覆盖原透明蒙版区域即可
- 导出时根据需求选择保存为带透明通道的PNG或者转成RGB格式保存为JPG
核心替换代码示例:
from PIL import Image def paste_qr_to_mask(origin_img_path, qr_img_path, mask_coord, output_path="output.png"): x, y, w, h = mask_coord # 打开原图和二维码,统一转为RGBA格式处理 origin = Image.open(origin_img_path).convert("RGBA") qr = Image.open(qr_img_path).convert("RGBA") # 调整二维码尺寸适配蒙版 qr_resized = qr.resize((w, h), Image.Resampling.LANCZOS) # 粘贴到蒙版位置,带透明通道处理 origin.paste(qr_resized, (x, y), mask=qr_resized) # 导出,如需保存为JPG则先转RGB:origin.convert("RGB").save("output.jpg") origin.save(output_path)
优化说明
- 如果蒙版是半透明效果,调整二值化的阈值即可,比如半透明的Alpha值一般在128左右,把阈值设为128就能提取到对应区域
- 如果图片内存在多个透明区域,只要提前输入标准蒙版的宽高做过滤,就不会误匹配到其他非目标透明区域
内容的提问来源于stack exchange,提问作者Giorgi Tskhondia
相关产品推荐
相关产品推荐

