处理CUDA中的边界条件/ Halo区域

pQB*_*pQB 6 cuda image-processing convolution

我正在使用CUDA进行图像处理,我对像素处理有疑问.

应用m x m卷积滤波器时,通常使用图像的边界像素做什么?

3 x 3卷积内核中,忽略1图像的像素边界更容易处理,尤其是在使用共享内存改进代码时.实际上,在这种情况下,不需要检查给定像素是否具有所有可用的(0, 0)邻域(即,在coord处的像素没有离开,左上,上邻居).但是,删除1原始图像的像素边界可能会产生部分结果.

与此相反,我想处理图像中的所有像素,也就是在使用共享内存改进时,即加载16 x 16像素,但计算内部14 x 14.同样在这种情况下,忽略边界像素会产生更清晰的代码.

在这种情况下通常做什么?

是否有人通常使用我的方法忽略边界像素?

当然,我知道答案取决于问题的类型,即以像素方式添加两个图像没有这个问题.

提前致谢.

jef*_*ff7 11

处理边框效果的常用方法是根据过滤器大小使用额外的行和列填充原始图像.填充值的一些常见选择是:

  • 常数(例如零)
  • 根据需要多次复制第一行和最后一行/列
  • 在边界处反射图像(例如,列[-1] =列[1],列[-2] =列[2])
  • 换行图像值(例如列[-1] =列[宽度-1],列[-2] =列[宽度-2])


mat*_*att 5

tl; dr:这取决于你试图解决的问题 - 没有适用于所有问题的解决方案.事实上,从数学上讲,我怀疑可能根本就没有"解决方案",因为我认为这是一个你被迫处理的不适定问题.

(为我不顾一切地滥用数学提前道歉)

为了演示让我们考虑一种假设所有像素组件和内核值都是正的情况.为了了解其中一些答案如何导致我们误入歧途,让我们进一步考虑一个简单的平均("盒子")过滤器.如果我们将图像边界外的值设置为零,那么这将明显降低边界的ceil(n/2)(曼哈顿距离)内每个像素的平均值.因此,您将在滤镜图像上获得"暗"边框(假设单个强度分量或RGB色彩空间 - 您的结果将因色彩空间而异!).请注意,如果我们将边界外的值设置为任意常量,则可以进行类似的参数 - 平均值将倾向于该常量.如果典型图像的边缘趋向于0,则常数为零可能是合适的.如果我们考虑更复杂的滤波器内核(如高斯滤波器),情况也是如此,但问题将不那么明显,因为内核值往往随着距中心的距离而迅速减小.

现在假设我们选择重复边缘值而不是使用常量.这与在图像周围创建边框并复制行,列或角足够次以确保过滤器保持在新图像"内部"相同.您还可以将其视为夹紧/饱和样品坐标.这对我们简单的盒式滤镜有问题,因为它过分强调了边缘像素的值.一组边缘像素将出现不止一次,但它们都会获得相同的权重w=(1/(n*n)).假设我们采样值为K 3的边缘像素.这意味着它对平均值的贡献是:

K*w + K*w + K*w  = K*3*w
Run Code Online (Sandbox Code Playgroud)

如此有效地说,一个像素的平均权重更高.请注意,由于这是一个平均过滤器,因此权重是内核的常量.然而,这个论点适用于权重也因位置而异的内核(再次:考虑高斯内核......).

假设我们包装或反映采样坐标,以便我们仍然使用图像边界内的值.与使用常数相比,这具有一些有价值的优点,但也不一定是"正确的".例如,你拍摄了多少张照片,上面边框的物体与底部的物体相似?除非你拍摄镜面光滑的湖泊,否则我怀疑这是真的.如果你正在拍摄岩石的照片用作游戏中的纹理包装或反射可能是合适的.我确信在这里有一些重要的观点,关于包装和反射如何可能减少使用傅立叶变换产生的任何伪像.然而,这又回到了同样的想法:你有一个周期性的信号,你不希望通过引入虚假的新频率或过高估计现有频率的幅度来扭曲.

那么如果你在蓝天下过滤鲜红色岩石的照片,你会怎么做?很明显,你不想在蓝天上添加橙色的阴霾,在红色的岩石上添加蓝色的模糊.反射样本坐标是有效的,因为我们期望在反射坐标处找到相似的颜色...除非为了参数,我们想象滤波器内核是如此之大,以至于反射坐标将延伸超过地平线.

让我们回到框过滤器示例.使用此过滤器的另一种方法是停止考虑使用静态内核并回想一下此内核的用途.平均/盒滤波器被设计为对像素分量求和,然后除以求和的像素数.这个想法是这可以消除噪音.如果我们愿意在抑制边界附近的噪声方面降低效率,我们可以简单地将较少的像素相加并除以相应较小的数字.这可以扩展到具有类似于我将要调用的"标准化"术语的过滤器 - 与过滤器的面积或体积相关的术语.对于"区域"术语,您可以计算边界内的内核权重数,并忽略那些不是的权重.然后使用此计数作为"区域"(可能涉及额外的乘法).对于音量(再次:假设正权重!),只需求核心权重.这个想法对于衍生滤波器来说可能很糟糕,因为与噪声像素竞争的像素较少,而差分对噪声非常敏感.此外,一些过滤器已经通过数值优化和/或经验数据而不是来自ab-initio /分析方法得出,因此可能缺乏明显的"标准化"因子.