代码之家  ›  专栏  ›  技术社区  ›  j35t3r

如何构造三维卷积的sobel滤波器?

  •  0
  • j35t3r  · 技术社区  · 8 年前

    在我的代码片段中,我想构造sobel过滤器,它分别应用于图像(rgb)的每一层,最后粘在一起(再次是rgb,但已过滤)。

    我不知道如何构造输入形状的sobel滤波器 [filter_depth, filter_height, filter_width, in_channels, out_channesl] ,我的情况是:

     sobel_x_filter = tf.reshape(sobel_x, [1, 3, 3, 3, 3]) 
    

    整个代码如下所示:

    import numpy as np
    import tensorflow as tf
    import matplotlib.pyplot as plt
    
    im0 = plt.imread('../../data/im0.png') # already divided by 255
    sobel_x = tf.constant([
    [[[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]],
     [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]],
     [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]],
    [[[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]],
     [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]],
     [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]],
    [[[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]],
     [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]],
     [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]]], tf.float32) # is this correct? 
    sobel_x_filter = tf.reshape(sobel_x, [1, 3, 3, 3, 3])
    image = tf.placeholder(tf.float32, shape=[496, 718, 3])
    image_resized = tf.expand_dims(tf.expand_dims(image, 0), 0)
    
    filters_x  = tf.nn.conv3d(image_resized, filter=sobel_x_filter, strides=[1,1,1,1,1], 
                              padding='SAME', data_format='NDHWC')
    
    with tf.Session('') as sess:
        sess.run([tf.global_variables_initializer(), tf.local_variables_initializer()])
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(sess=sess, coord=coord)
        feed_dict = {image: im0}
        img  =  filters_x.eval(feed_dict=feed_dict)
    
    plt.figure(0), plt.title('red'), plt.imshow(np.squeeze(img[...,0])),
    plt.figure(1), plt.title('green'), plt.imshow(np.squeeze(img[...,1])),
    plt.figure(2), plt.title('blue'), plt.imshow(np.squeeze(img[...,2]))
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Vijay Mariappan    8 年前

    你可以使用 tf.nn.depthwise_conv2d :

    sobel_x = tf.constant([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], tf.float32)
    kernel = tf.tile(sobel_x[...,None],[1,1,3])[...,None]
    conv = tf.nn.depthwise_conv2d(image[None,...], kernel,strides=[1,1,1,1],padding='SAME')
    

    tf.nn.conv3d :

    im = tf.expand_dims(tf.transpose(image, [2, 0, 1]),0)
    sobel_x = tf.constant([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], tf.float32)
    sobel_x_filter = tf.reshape(sobel_x, [1, 3, 3, 1, 1])
    conv = tf.transpose(tf.squeeze(tf.nn.conv3d(im[...,None], sobel_x_filter,
                        strides=[1,1,1,1,1],padding='SAME')), [1,2,0])