You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何在未知子图内容前提下识别图像中的内嵌图像

Python环境下未知内容内嵌图像识别方案

待检测的参考图像如下:
示例待检测图像

不需要预先知晓内嵌图像内容即可完成检测,可直接落地的方案分为三类,均不需要依赖match_by_template这类需要提前知道待匹配内容的方法:

轻量传统CV方案(无训练依赖,适合规整文档场景)

  • 核心判断依据:纯文本区域的连通域形态、梯度分布、频域特征高度规律,二次嵌入的图像块和周围文本区域存在固有特征差,可通过阈值筛选直接定位
  • 实现流程:
    1. 读入灰度图后用Otsu阈值做二值化反转,通过cv2.connectedComponentsWithStats提取所有连通域,筛选出符合文本行特征(宽高比大于3、面积处于常规文字区间、排列对齐)的区域,生成文本区域掩膜
    2. 对掩膜取反后做闭运算,把零散的非文本区域拼接成连通块,过滤掉面积过小的噪点、面积覆盖整页的无效块,得到初步候选区域
    3. 对候选区域做双重校验:一是计算区域四周的Sobel梯度均值,嵌图为二次粘贴,哪怕做过边缘柔化也会存在明显高于文本间隙的梯度突变;二是对候选块做8*8网格DCT变换,纯文本区域DCT系数集中在低频段,嵌图区域高频系数占比会明显偏高,不符合阈值的候选直接排除
  • 可直接运行的核心代码片段:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:09:22