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

如何消除图像unpatchify后出现的分块边界

消除图像分块拼接后的边界问题

此处为问题示例图

将尺寸为1024×1024×3的原始图像通过patchify分割为128×128×3的图像块,完成相关操作后执行unpatchify拼接图像,但拼接后的图像出现明显的分块边界,以下是几种可行的消除方法:

一、重叠分块+加权融合

无重叠分块时,模型对每个块的边缘处理易出现不一致,导致拼接边界明显。改用重叠分块并对重叠区域加权融合,能实现边缘平滑过渡。

修改prediction函数如下:

def prediction(img, model):
    img_h, img_w, channel_count = img.shape
    patch_size = 128
    overlap = 32  # 设置重叠像素数,可根据效果调整
    # 重叠分块,步长=块尺寸-重叠尺寸
    img_patches = patchify(img, (patch_size, patch_size, 3), step=patch_size - overlap)
    rows, cols = img_patches.shape[0], img_patches.shape[1]
    
    # 逐个预测图像块
    pred_patches = []
    for i in range(rows):
        for j in range(cols):
            patch = img_patches[i][j][0]
            pred = model.predict(np.expand_dims(patch, axis=0), verbose=0)[0]
            pred_patches.append(pred)
    pred_patches = np.array(pred_patches).reshape(rows, cols, 1, patch_size, patch_size, 3)
    
    # 创建线性权重掩码,边缘区域权重低,中心区域权重高
    def create_weight_mask(size, overlap):
        mask = np.ones((size, size))
        # 左右边缘线性加权
        for i in range(overlap):
            weight = i / overlap
            mask[:, i] = weight
            mask[:, size - 1 - i] = weight
        # 上下边缘线性加权(取与左右边缘的最小权重,避免角落权重过低)
        for i in range(overlap):
            weight = i / overlap
            mask[i, :] = np.minimum(mask[i, :], weight)
            mask[size - 1 - i, :] = np.minimum(mask[size - 1 - i, :], weight)
        return mask
    
    weight_mask = create_weight_mask(patch_size, overlap)
    weight_mask = np.expand_dims(np.expand_dims(weight_mask, axis=-1), axis=0)  # 适配张量维度
    
    # 对预测块应用权重
    weighted_patches = pred_patches * weight_mask
    
    # 拼接加权后的块,并除以总权重得到最终图像
    total_weight = unpatchify(np.ones_like(pred_patches) * weight_mask, img.shape)
    pred_img = unpatchify(weighted_patches, img.shape) / total_weight
    
    return pred_img

二、后处理平滑边界

若不想修改分块逻辑,可直接对拼接后的图像做局部边界平滑处理,用高斯模糊或双边滤波弱化边界差异:

def smooth_boundaries(img, patch_size=128, blur_kernel=(5,5)):
    img_h, img_w = img.shape[:2]
    # 处理水平分块边界
    for i in range(1, img_h // patch_size):
        y = i * patch_size
        # 对边界上下各10像素区域做高斯模糊
        img[y-10:y+10, :] = cv2.GaussianBlur(img[y-10:y+10, :], blur_kernel, 0)
    # 处理垂直分块边界
    for j in range(1, img_w // patch_size):
        x = j * patch_size
        # 对边界左右各10像素区域做高斯模糊
        img[:, x-10:x+10] = cv2.GaussianBlur(img[:, x-10:x+10], blur_kernel, 0)
    return img

# 在预测流程中调用
predicted = normalize(p_img)
predicted = smooth_boundaries(predicted)

三、训练阶段加入边缘一致性约束

从根源优化模型,在训练时加入边缘一致性损失,让模型学习保持块之间的边缘连续性:

# 定义边缘一致性损失函数
def edge_consistency_loss(y_true_patches, y_pred_patches):
    # 获取每个块的右侧边缘和下侧边缘
    right_edge_true = y_true_patches[:, :, -1:, :]
    right_edge_pred = y_pred_patches[:, :, -1:, :]
    bottom_edge_true = y_true_patches[:, -1:, :, :]
    bottom_edge_pred = y_pred_patches[:, -1:, :, :]
    
    # 计算边缘的均方误差损失
    loss = tf.reduce_mean(tf.square(right_edge_true - right_edge_pred)) + \
           tf.reduce_mean(tf.square(bottom_edge_true - bottom_edge_pred))
    return loss

# 训练时将该损失与主重建损失结合(权重可调整)
total_loss = reconstruction_loss + 0.1 * edge_consistency_loss(y_true, y_pred)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:24:59