Tensorflow中是否有卷积函数可以应用Sobel滤波器?

5

在Tensorflow中是否有应用Sobel算子到图像img(类型为float32,秩为2的张量)上的卷积(convolution)方法?

sobel_x = tf.constant([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], 'float32')
result = tf.convolution(img, sobel_x) # <== TO DO THIS

我已经看过tf.nn.conv2d,但我不知道如何将其用于此操作。是否有一些方法可以使用tf.nn.conv2d来解决我的问题?

2个回答

14

也许我在这里缺少一些微妙之处,但您似乎可以使用tf.expand_dims()tf.nn.conv2d()将Sobel滤波器应用于图像,如下所示:

sobel_x = tf.constant([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], tf.float32)
sobel_x_filter = tf.reshape(sobel_x, [3, 3, 1, 1])
sobel_y_filter = tf.transpose(sobel_x_filter, [1, 0, 2, 3])

# Shape = height x width.
image = tf.placeholder(tf.float32, shape=[None, None])

# Shape = 1 x height x width x 1.
image_resized = tf.expand_dims(tf.expand_dims(image, 0), 3)

filtered_x = tf.nn.conv2d(image_resized, sobel_x_filter,
                          strides=[1, 1, 1, 1], padding='SAME')
filtered_y = tf.nn.conv2d(image_resized, sobel_y_filter,
                          strides=[1, 1, 1, 1], padding='SAME')

当我完成后,发现可以应用tf.squeeze(filtered_x)。谢谢! - axelbrz
2
你能再解释一下它是如何工作的吗? 我该如何对一个真实的图像进行卷积并显示它? - mavi
第二个"sobel_x_filter"(soble_x_filter)中有一个拼写错误。 - OliasailO
@OliasailO 谢谢你指出这个问题!我已经更新了代码。 - mrry
你的sobel_x滤波器不正确。 tf.constant([[1, 0, -1], [2, 0, -2], [1, 0, -1]], tf.float32) 最左边的必须与最右边交换。 - j35t3r

3

Tensorflow 1.8已经添加了tf.image.sobel_edges()函数,这是实现此功能的最简单且可能最可靠的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接