在TensorFlow中使用Gabor滤波器,或者使用其他滤波器替代默认的滤波器

4

我希望在我的CNN中使用Gabor滤波器。使用convolution2d函数,如何将其更改为将输入图像卷积到我的Gabor滤波器,而不是默认的高斯滤波器?

2个回答

4

以下是一些代码,您可以将其用作应用使用OpenCV库创建的常数(非学习)Gabor滤波器的指南:

import tensorflow as tf
import cv2

# Create a 3x3 Gabor filter
params = {'ksize':(3, 3), 'sigma':1.0, 'theta': 0, 'lambd':15.0, 'gamma':0.02}
filter = cv2.getGaborKernel(**params)
# make the filter to have 4 dimensions.
filter = tf.expand_dims(filter, 2)
filter = tf.expand_dims(filter, 3)

# Apply the filter on `image`
answer = tf.conv2d(image, filter, strides=[1, 1, 1, 1], padding='SAME')

谢谢。这对我很有帮助。 - Sesoin
有一个小问题。当我使用它时,它会出现错误:ValueError: Shape must be rank 4 but is rank 2 for 'LeviHassner/Conv2D' (op: 'Conv2D') with input shapes: [128,227,227,3], [5,5]。 我认为我应该将Gabor滤波器从2D更改为4D,但如何更改呢?@keveman - Sesoin
更新了代码以展示如何扩展filter的维度。在您的情况下,由于输入图像有3个维度,您可能需要调用3次getGaborKernel并连接结果。 - keveman

0
以下是执行相同操作的函数:
def gabor_filtering(image) :
   """
   Using Gabor Filters to repair
   motion blurriness in an image.
   """
   theta = [0, 45, 90, 135]
   filtered_images = []
   sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
   for th in theta :
      kernel = cv2.getGaborKernel(ksize = (3, 3), sigma = 5, lambd = 5, theta = th, 
               gamma = 0.25)
      kernel = tf.expand_dims(kernel, 0)
      kernel = tf.expand_dims(kernel, 0)
      kernel = tf.cast(kernel, tf.float32)
      filtered_images.append(tf.nn.conv2d(image, kernel, strides=[1, 1, 1, 1], 
                             padding='SAME'))
   final_img = tf.math.maximum(tf.math.maximum(filtered_images[0], 
   filtered_images[1]), tf.math.maximum(filtered_images[2], filtered_images[3]))

   #Sharpening the image
   sharpen_kernel = tf.expand_dims(sharpen_kernel, 0)
   sharpen_kernel = tf.expand_dims(sharpen_kernel, 0)
   sharpen_kernel = tf.cast(sharpen_kernel, tf.float32)
   return tf.nn.conv2d(final_img, sharpen_kernel, strides=[1, 1, 1, 1], 
                       padding='SAME')

在这里,我使用Gabor滤波器来处理图像中的运动模糊。我使用4个不同的内核,并具有不同的theta值。我保持其余参数相同,但您可以根据需要进行更改。

应用4个内核后,我正在取所有4个过滤图像的逐像素最大值。这样可以加强边缘并平滑非边缘部分。最后,我对图像进行锐化。

希望这有所帮助 :)


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