可以将1个卷积分成2个卷积吗?

时间:2017-08-24 18:25:10

标签: math signal-processing

所以我想在RGB图像上执行2D卷积。我的RGB图像的形状为(20,20),我的滤镜的形状为(1296,3888,3)

我想做的是:

  • 将图像拆分为两半大小相等(2554,3869,3)
  • 对每一半执行卷积
  • 合并卷积结果以获得完整的卷积图像

这可能吗?

我有两个GPU。我基本上想要在1 GPU上进行一半的卷积而在另一个GPU上进行另一半,因此这个问题的动机。

当我将图像分成两半并对每一半进行卷积时,返回的组合尺寸为(2573,3869,3),但如果我一次卷积整个图像,则返回的(正确)尺寸为#!/bin/sh #set -x for i in `cat output`; do eval "MASTER_$i = $(/usr/efm-2.0/bin/efm cluster-status $i 2>/dev/null |grep "Master" |head -1 |awk -F " " {'print$2'})"; echo -e "$MASTER_$i"; done

我想做什么的公式?

3 个答案:

答案 0 :(得分:2)

您可以分两个阶段执行卷积,但两个GPU必须包含图像中心的19条(或可能是20条)线的重叠区域。 更好的是,如果卷积例程允许输出(大小+ 2k-1),那么可以通过对这两个结果进行求和来计算中间部分(正确对齐)。

答案 1 :(得分:1)

您的结果似乎只包含卷积产品已满的点,而不是应用任何零填充或类似扩展。因此,如果您精确分割,则缺少完整结果的中间部分。

您可以通过在滤镜大小分割的中间引入重叠来校正,即左侧图像的列为1至1306,第二列为1287至2592列(或者如果移位为-1,则为计数从0开始。

答案 2 :(得分:1)

是的,你可以将你的卷积分成两半。假设您的卷积滤波器以直接的方式工作,对于传统的GPU API应该相当简单。

您想要仔细考虑的问题是边缘效应:您的GPU会在图像的边界处做什么?您通常有许多选项,可以根据纹理采样对象的边界进行配置,以读取原始图像:镜像,环绕或固定颜色(如零)。

但是,如果双方都使用相同的原始图像进行采样,则两半之间的边界将接近纹理的中心,边缘效果不适用!每个半图像将在其自己的采样位置应用卷积,而不依赖于另一个。

请注意,如果要在GPU之间拆分输入图像(例如,最小化GPU和CPU之间的带宽),则必须按照过滤器的范围扩展源纹理的每一半 - 足以避免上面提到的边缘效应!