Python如何在未知子图内容前提下识别图像中的内嵌图像
Python环境下未知内容内嵌图像识别方案
待检测的参考图像如下:
不需要预先知晓内嵌图像内容即可完成检测,可直接落地的方案分为三类,均不需要依赖match_by_template这类需要提前知道待匹配内容的方法:
轻量传统CV方案(无训练依赖,适合规整文档场景)
- 核心判断依据:纯文本区域的连通域形态、梯度分布、频域特征高度规律,二次嵌入的图像块和周围文本区域存在固有特征差,可通过阈值筛选直接定位
- 实现流程:
- 读入灰度图后用Otsu阈值做二值化反转,通过
cv2.connectedComponentsWithStats提取所有连通域,筛选出符合文本行特征(宽高比大于3、面积处于常规文字区间、排列对齐)的区域,生成文本区域掩膜 - 对掩膜取反后做闭运算,把零散的非文本区域拼接成连通块,过滤掉面积过小的噪点、面积覆盖整页的无效块,得到初步候选区域
- 对候选区域做双重校验:一是计算区域四周的Sobel梯度均值,嵌图为二次粘贴,哪怕做过边缘柔化也会存在明显高于文本间隙的梯度突变;二是对候选块做8*8网格DCT变换,纯文本区域DCT系数集中在低频段,嵌图区域高频系数占比会明显偏高,不符合阈值的候选直接排除
- 读入灰度图后用Otsu阈值做二值化反转,通过
- 可直接运行的核心代码片段:
import cv2 import numpy as np def detect_embedded_image(img_path: str, grad_thresh: int = 15): img_gray = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) h_img, w_img = img_gray.shape # 提取文本连通域 _, binary = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) _, _, stats, _ = cv2.connectedComponentsWithStats(binary, connectivity=8) text_mask = np.zeros_like(binary) for stat in stats[1:]: x, y, w, h, area = stat # 按文本行的宽高比、面积特征筛选 if w > h * 3 and 80 < area < 6000: text_mask[y:y+h, x:x+w] = 255 # 提取非文本候选块 non_text = 255 - text_mask non_text_closed = cv2.morphologyEx(non_text, cv2.MORPH_CLOSE, np.ones((7,7), np.uint8)) _, _, stats_cand, _ = cv2.connectedComponentsWithStats(non_text_closed, connectivity=8) detect_res = [] for stat in stats_cand[1:]: x, y, w, h, area = stat # 过滤过小噪点、过大的整页区域 if not (1200 < area < h_img * w_img * 0.75): continue # 边缘梯度校验 roi_pad = img_gray[max(0, y-2):min(h_img, y+h+2), max(0, x-2):min(w_img, x+w+2)] grad_x = cv2.Sobel(roi_pad, cv2.CV_64F, 1, 0, ksize=3) grad_y = cv2.Sobel(roi_pad, cv2.CV_64F, 0, 1, ksize=3) if np.mean(np.sqrt(grad_x**2 + grad_y**2)) > grad_thresh: detect_res.append((x, y, w, h)) return detect_res
预训练模型方案(高精度,适配复杂排版场景)
- 核心逻辑:用已经在海量文档数据集上训练好的版面分析模型,直接区分页面内的文本、图片、表格、公式等不同类别的区域,不需要自己标注训练,也不需要提前知道内嵌图内容
- 可选落地工具:
- 通用场景用
layoutparser加载PubLayNet预训练权重,推理后直接筛选类别为Figure的检测框即可,对英文论文、常规网页截图适配较好 - 中文文档场景可以直接调用PaddleOCR自带的版面分析模块,对中文排版的适配性更好,同时会自动过滤文本、公式、表格区域,直接返回内嵌图片的位置
- 通用场景用
- 该方案对嵌图的内容、尺寸没有限制,哪怕嵌图是截图、手绘、图表都能准确识别,鲁棒性远高于传统CV方法。
刻意隐藏嵌图的检测方案
如果内嵌图像做过边缘模糊、颜色对齐等刻意隐藏处理,前面两种方法出现漏检时,可以用噪声残差分析法:原生未修改的文档所有区域的传感器噪声、压缩噪声分布是连续一致的,二次嵌入的图片来自其他信源,噪声模式和周围区域存在明显差异。只要提取原图和非局部均值去噪后图像的残差,残差分布出现明显断层的块就是内嵌图像区域。
内容的提问来源于stack exchange,提问作者Carl4
相关产品推荐
相关产品推荐

