是否有可以检测图像中运动模糊的算法或库?

时间:2009-12-10 13:35:04

标签: image-processing

如果图像在图像中有运动模糊/相机抖动,任何人都知道可以返回模糊真/假的算法吗?

理想情况下, motion 模糊是特别的,因为集合中的大量图像可能会模糊(Bokeh)背景。

语言首选项是C,Perl,Shell Utility或Python,但我对任何事情都很开放。

凭借我目前对数学/编程的了解,我认为我真的没有希望编写这样的算法,只使用一个带有一些参数的算法......

4 个答案:

答案 0 :(得分:4)

Discrete wavelet transform是此类检测中的有用工具。 Here是来自卡内基梅隆大学计算机科学学院的论文,用于通过使用DWT检测和量化图像中的模糊。对于二元决策,您可以将金额阈值设置为所需级别,并且上面的所有内容都会模糊。

答案 1 :(得分:2)

有多种方法可以做到这一点,也许这里的一位影像大师有更好的答案。反正...

我的第一个镜头是对图像进行频率分析(读取:2d傅立叶变换)。然后为真/假定义高频的阈值(即,从一个像素到下一个像素的快速变化)。运动模糊滤除高频。您的里程可能会有所不同完全黑色的图片虽然没有模糊,但没有高频。根据所使用的镜头和光圈,图像的某些部分可能会模糊,因为它们位于背景中。我不认为这里有一个通用的解决方案。

答案 2 :(得分:1)

要检测模糊,可以将灰度图像与拉普拉斯内核进行卷积并计算方差。聚焦图像应具有较高的方差,而模糊图像应具有较低的方差。下面是执行此操作的代码:

def is_blur(image) :
   """
   This function convolves a grayscale image with
   laplacian kernel and calculates its variance.
   """

   thresold = #Some value you need to decide

   #Laplacian kernel
   laplacian_kernel = np.array([[0,1,0],[1,-4,1],[0,1,0]])
   laplacian_kernel = tf.expand_dims(laplacian_kernel, -1)
   laplacian_kernel = tf.expand_dims(laplacian_kernel, -1)
   laplacian_kernel = tf.cast(laplacian_kernel, tf.float32)

   #Convolving image with laplacian kernel
   new_img = tf.nn.conv2d(image, laplacian_kernel, strides=[1, 1, 1, 1], 
                          padding="SAME")

   #Calculating variance
   img_var = tf.math.reduce_variance(new_img)

   if img_var < thresold :
      return True
   else :
      return False

此函数将灰度图像作为输入,并且应为4-dim张量,因为tf.nn.conv2d接受4-d张量。下面是加载图像的代码:

image_string = tf.io.read_file(ImagePath)
#decoding image
image = tf.image.decode_png(image_string, channels=3)
#Converting image to grayscale
image = tf.image.rgb_to_grayscale(image)
# This will convert to float values in [0, 1]
image = tf.image.convert_image_dtype(image, tf.float32)
#Reshaping image since conv2d accepts a 4-d tensor.
image = tf.reshape(image, shape=[1, image.shape[0], image.shape[1], 1])

阈值设置应非常仔细。如果设置得太低,则可以将模糊图像声明为聚焦图像;如果设置得太高,则将无法将聚焦图像分类为模糊图像。更好的方法是计算每个图像的模糊度,然后通过绘制分布图来确定。

希望这会有所帮助:)

答案 3 :(得分:0)

您还可以使用Richardson-Lucy算法。它主要用于盲去卷积,但是你知道它需要移除运动模糊,RL算法应该花费更少的迭代来计算可行的重建。