如何正确应用卷积层的3x3滤镜?

时间:2018-04-22 15:41:08

标签: python tensorflow convolution

我试图将一个简单的拉普拉斯滤镜(3x3)应用于图像,但输出非常嘈杂

import tensorflow as tf
import PIL.Image as pil
import numpy as np

k = tf.constant([[1, 1, 1],[1, -8, 1],[1, 1, 1]], dtype=tf.float32)

image = tf.placeholder(dtype=tf.float32, shape=[None, None, None, 1])

kernel = tf.reshape(k, [3, 3, 1, 1], name='kernel')

res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "SAME"))
with tf.Session() as sess:
    img = pil.open('grey.png')
    array = np.asarray(img).reshape(1, img.size[0], img.size[1], 1)

    out = sess.run(res, feed_dict={image:array})
    reverted = ((pil.fromarray(np.uint8(out))).convert('L')).save('testing.png')

Noisy outputimage

1 个答案:

答案 0 :(得分:2)

正确应用卷积。问题在于图像反向转换。也就是说,您正在应用具有一些负值的过滤器,中间是 -8 。这意味着很多卷积像素将产生负的结果值,然后在完成后转换为np.uint8。因此, -1 将变为 255 ,从而 1 -1 将具有与之关联的极为不同的光照值。这会导致模式。

更改以下两行:

array = np.asarray(img, dtype = np.float32 ).reshape(1, img.size[0], img.size[1], 1) / 2

reverted = ((pil.fromarray(np.uint8(out + 128))).convert('L')).save('testing.png')

你会得到一个有意义的图像。当然,您可能会想出更好的方法来处理负值,将原始像素转换为 [0,127.5] ,然后添加 128 结果是一个快速而肮脏的解决方案,但它解决了这个问题。你真的需要考虑这个问题,因为如果中间像素为零而其他像素值很大,你也可能会出现溢出。

使用更改的代码,随机的Angelina Jolie图像会产生:

Angelina Jolie Laplacian filtered