“cv2.filter2D”与Keras“Conv2D”函数有什么区别

数据挖掘 机器学习 Python 深度学习 opencv
2022-03-11 02:31:28

当我必须使用 opencv 锐化图像时,我使用:

#Create our shapening kernel    
kernel_sharpening = np.array([[0,-1,0], 
                              [-1, 5,-1],
                              [0,-1,0]])# applying the sharpening kernel to the input image & displaying it.

sharpened = cv2.filter2D(image, -1, kernel_sharpening)

在上面的代码中锐化的是我们的结果图像。正如您在上面的代码中看到的,我使用名为 filter2D 的 opencv 函数来执行输入图像与内核的卷积,结果我得到了锐化的图像。

最近我浏览了这个关于图像超分辨率的链接(链接

并发现 Keras 有类似于 filter2D 的东西,Keras 称之为 Conv2D。

它的语法如下:

dis2 = Conv2D(filters=64, kernel_size=3, strides=2, padding='same')(dis1)

我的问题是 opencv filter2D 和 Keras Conv2D 有什么区别?

(我假设两者都对图像与内核进行卷积的作用相同,我可能错了,请纠正)

1个回答

因此,从架构的角度来看,您是对的,两者都是大小为 (3,3) 的 2D 卷积内核。

但是有一些主要的区别。虽然cv2.filter2D(image, -1, kernel_sharpening)直接对图像进行卷积,但dis2 = Conv2D(filters=64, kernel_size=3, strides=2, padding='same')(dis1)仅构建一个 Conv2D 层,它是图形(神经网络)的一部分。所以 Keras Conv2D 不是直接对图像进行卷积的操作。

还有权重不一样。在 cv2 部分[0,-1,0], [-1, 5,-1], [0,-1,0]是你的权重。

dis2 = Conv2D(filters=64, kernel_size=3, strides=2, padding='same')(dis1)

有标准的权重初始化器,它是 glorot 统一的。所以重量甚至不匹配。

此外,代表 Keras 方式的 Conv2D 层的权重将在神经网络的训练阶段学习。

然而,如果你的神经网络只有这个卷积层并产生与 cv2 卷积相同的权重,那么结果应该完全相同。