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

如何筛选含相同色彩网格的重复图像?求更优CV实现方案

针对ARG帧去重的优化方案(适配位置偏移场景)

你的核心需求是忽略帧的小幅度位置偏移,仅保留色彩网格结构唯一的帧,现有掩码异或方案会因偏移误判重复帧为不同,以下是更适配的实现思路和代码:

一、先优化现有掩码生成逻辑

原代码分颜色生成掩码再合并,可简化为批量处理,提升效率:

import cv2
import numpy as np

COLORS_AS_RGB = np.array([
    [255, 22, 1],    # red
    [0, 216, 0],     # green
    [0, 15, 255]     # blue
], dtype=np.uint8)

def generate_color_mask(img):
    mask = np.zeros(img.shape[:2], dtype=np.uint8)
    for color in COLORS_AS_RGB:
        # 针对单一颜色生成掩码,合并到总掩码
        color_mask = cv2.inRange(img, color, color)
        mask = cv2.bitwise_or(mask, color_mask)
    return mask

二、适配位置偏移的核心方案

方案1:相位相关对齐后对比(适合刚性平移偏移)

相位相关能精准计算两幅图像的平移偏移量,对齐后再做掩码对比,彻底解决偏移导致的误判:

def align_and_compare(img1, img2, mask1, mask2):
    # 用相位相关计算平移偏移
    shift = cv2.phaseCorrelate(mask1.astype(np.float32), mask2.astype(np.float32))[0]
    dx, dy = int(round(shift[0])), int(round(shift[1]))
    
    # 生成平移变换矩阵,对齐img2到img1的位置
    M = np.float32([[1, 0, -dx], [0, 1, -dy]])
    aligned_mask2 = cv2.warpAffine(mask2, M, (mask1.shape[1], mask1.shape[0]))
    
    # 异或对比,统计差异像素
    delta_mask = cv2.bitwise_xor(mask1, aligned_mask2)
    return cv2.countNonZero(delta_mask)

# 去重逻辑
unique_frames = [images[0]]
prev_mask = generate_color_mask(images[0])

for img in images[1:]:
    curr_mask = generate_color_mask(img)
    diff_pixels = align_and_compare(images[0], img, prev_mask, curr_mask)
    if diff_pixels > 50:  # 阈值可根据实际调整
        unique_frames.append(img)
        prev_mask = curr_mask

方案2:提取网格特征哈希(适合任意小幅度形变偏移)

如果帧存在旋转、缩放类的轻微形变,可提取网格的颜色分布特征,忽略位置信息:

def get_grid_feature(img, grid_size=(16,16)):
    # 生成颜色掩码
    mask = generate_color_mask(img)
    # 把掩码分成grid_size个网格块
    h, w = mask.shape
    grid_h, grid_w = h // grid_size[0], w // grid_size[1]
    feature = []
    for i in range(grid_size[0]):
        for j in range(grid_size[1]):
            # 统计每个网格块内的目标颜色占比
            block = mask[i*grid_h:(i+1)*grid_h, j*grid_w:(j+1)*grid_w]
            ratio = cv2.countNonZero(block) / (grid_h * grid_w)
            feature.append(round(ratio, 2))  # 保留两位小数,降低噪声
    return tuple(feature)

# 去重逻辑
feature_set = set()
unique_frames = []

for img in images:
    feat = get_grid_feature(img)
    if feat not in feature_set:
        feature_set.add(feat)
        unique_frames.append(img)

三、选择建议

  • 如果帧仅存在平移偏移,优先用相位相关对齐方案,精度最高;
  • 如果帧存在旋转、缩放或不规则小偏移,用网格特征哈希方案,鲁棒性更强;
  • 阈值(50或特征相似度)需根据实际帧的偏移程度、网格密度调整,建议先测试少量帧确定最优值。

内容的提问来源于stack exchange,提问作者Bsector

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 00:04:50