Лучше не беспокоиться о том, как выглядят фильтры. Просто следите за формой, чтобы убедиться, что они имеют смысл.
Вот пример применения 2 фильтров Собела к изображению:
from skimage import data
img = np.expand_dims(data.camera(), -1)
img = np.expand_dims(img, 0) # shape: (1, 512, 512, 1)
sobel_x = np.array([[-0.25, -0.2 , 0. , 0.2 , 0.25],
[-0.4 , -0.5 , 0. , 0.5 , 0.4 ],
[-0.5 , -1. , 0. , 1. , 0.5 ],
[-0.4 , -0.5 , 0. , 0.5 , 0.4 ],
[-0.25, -0.2 , 0. , 0.2 , 0.25]])
sobel_y = np.array([[-0.25, -0.4 , -0.5 , -0.4 , -0.25],
[-0.2 , -0.5 , -1. , -0.5 , -0.2 ],
[ 0. , 0. , 0. , 0. , 0. ],
[ 0.2 , 0.5 , 1. , 0.5 , 0.2 ],
[ 0.25, 0.4 , 0.5 , 0.4 , 0.25]])
filters = np.concatenate([[sobel_x], [sobel_y]]) # shape: (2, 5, 5)
filters = np.expand_dims(filters, -1) # shape: (2, 5, 5, 1)
filters = filters.transpose(1, 2, 3, 0) # shape: (5, 5, 1, 2)
# Convolve image
ans = tf.nn.conv2d((img / 255.0).astype('float32'),
filters,
strides=[1, 1, 1, 1],
padding='SAME')
with tf.Session() as sess:
ans_np = sess.run(ans) # shape: (1, 512, 512, 2)
filtered1 = ans_np[0, ..., 0]
filtered2 = ans_np[0, ..., 1]
Изображение правильно свернуто с 2 фильтрами, и получающиеся изображения выглядят как:
plt.matshow(filtered1)
plt.show()
plt.matshow(filtered2)
plt.show()