Mandykoh/Convolver:用于围棋的扩展并行图像卷积库

2020-08-14 22:48:24

卷积器是一个图像卷积库,它使用超出加权平均的聚合算子扩展了经典卷积。这允许表达更多的图像处理操作。卷积内核还允许分别为R、G、B和Alpha通道指定值,以便可以支持每通道操作。

卷积运算支持开箱即用的并行处理,允许为多核系统上的大多数线性加速指定并行度。

卷积从定义内核开始。内核有一个“半径”,它以像素为单位定义矩形面片的大小。例如,对于任何给定像素,半径为2的核在所有四个方向上延伸2个像素,总面片大小为5x5:

上面创建了一个空的5x5内核,其中所有权重都为零。当应用于图像时,每个输出像素都是内核覆盖的以相应输入像素为中心的像素聚合的结果。权重决定了这些像素中的每个像素对聚合结果的贡献程度。权重指定为浮点数,并且可以分别为R、G、B和Alpha通道指定。

使用这些权重,我们可以定义一个核来提取单独的颜色通道。下面指定半径为0的平凡核(表示它仅覆盖一个像素,而不考虑像素的邻居),其中输出完全受蓝色和Alpha通道(权重1)的影响,而红色和绿色通道没有影响(权重0)。因为核是1x1,所以在x(0),y(0)位置只有一组权重。

内核:=卷积器。KernelWithRadius(0)x,y,r,g,b,a:=0,0,0.0,0.0,1.0,1.0内核。SetWeightRGBA(x,y,r,g,b,a)。

一旦定义了内核,就可以使用给定的聚合函数(这里是求平均值,尽管这对于1x1内核实际上无关紧要)来应用内核:

PARALLELISM参数允许使用并行处理来应用内核,以利用多个CPU核心。将其设置为1表示内核处理是单线程的;将其设置为4表示处理将分布在四个线程上。

下面使用SetWeightsUniform方法,使用R、G、B和Alpha通道的单个统一权重,指定表示高斯模糊的5x5内核:

权重:=[]float32{1,4,6,4,1,4,16,24,16,4,6,24,36,24,6,4,16,24,16,4,1,4,6,4,1,}内核:=卷积器。KernelWithRadius(2)内核。SetWeightsUniform(权重)。

此内核可以应用于将平均化作为聚合运算符的图像,如下所示:

通过迭代地应用内核,可以有效地强调由许多内核表示的操作。例如,我们可以继续将高斯模糊内核再应用七次:

一个简单的锐化内核可以这样表示。权重强调像素与其四个相邻像素之间的对比度:

应用此内核(仍使用平均)的方式与前面相同:

边缘检测内核可能如下所示。请注意,与锐化不同,边缘周围的权重与中心的权重之和为零,这意味着在没有对比边的区域中,输出将为零:

例如,我们可以为内核定义一个简单的、均匀加权的5x5“圆”:

权重:=[]float32{0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,}内核:=卷积器。KernelWithRadius(2)内核。SetWeightsUniform(权重)。

但是,我们可以使用Max运算符来应用它,而不是使用Avg运算符(这会产生类似于简单模糊的结果):

MAX运算符聚合内核覆盖的像素,并为每个通道生成最大值。这意味着由内核覆盖范围规定的接近不透明像素(全Alpha)的透明像素(零Alpha)也将变得不透明。一如既往,权重为零表示这些像素对结果没有影响。

当然,该内核也可以应用于多通道。这是应用第二个过程后的结果(请注意在一个过程中厚度增加):

另一个聚合运算符是Min。其中Max查找内核覆盖的最大值,Min查找最小值。使用与上面的扩展完全相同的内核,我们可以改为应用最小聚合:

这会产生侵蚀效果,其中原始图像的特征会变细,如下所示:

而且,内核的其他应用程序将再次强调其效果。这是应用第二个过程后的结果:

通过组合卷积可以产生更复杂的运算。例如,通过进行扩张,然后进行侵蚀,我们可以产生闭合效果:

这具有平滑锐点、圆角和闭合孔洞的效果,并且对于在图像中生成平滑的“孤岛”非常有用。

我们还可以重复此操作以增强效果,先执行两次扩张,然后执行两次侵蚀: