图像傅立叶变换的实现

Implementation of Fourier transformation on an image

我正在尝试复制中给出的算法 research paper regarding rating an image for a blur score

请在下面找到我创建的函数。我已经在评论中添加了关于我正在尝试做的事情的要点。

def calculate_blur(image_name):
    img_1 = cv2.imread(image_name) # Reading the Image
    img_2 = np.fft.fft2(img_1) # Performing 2 dimensional fft on the image
    img_3 = np.fft.fftshift(img_2) #findind fc by shifting origin of F to centre
    img_4 = np.fft.ifftshift(img_3)
    af=np.abs(img_4) #Calculating the absolute value of centred Fourier Transform
    threshold=np.max(af)/1000# calculating the threshold value where the max value is calculated from absolute value
    Th=np.sum(img_2>threshold) #total number of pixels in F/img_2 whose pixel value>threshold 
    fm=Th/(img_1.shape[0]*img_1.shape[1]) #calculating the image quality measure(fm)
    if fm>0.05 : #Assuming fm>0.05 would be Not Blur (as I assumed from the results given in the research paper)
        value='Not Blur'
    else:
        value='Blur'
    return fm,value

我看到当它是面部特写照片,光线适当时,即使图像模糊,IQM 分数也会大于 0.05,而对于单击的正常图像(与相机的适当距离),它会显示取得了不错的成绩。

我正在分享 2 张图片。

得分为 (0.2822434750792747, 'Not Blur')

得分为 (0.035472916666666666, 'Blur')`

我试图了解它在后端的工作原理,即在两者之间做出决定以及如何增强我的功能和检测。

您的代码似乎复制了论文中的工作。

不幸的是,要确定图片是否模糊一点也不容易。人们可以用它来比较同一场景的多张图像,看看哪张更清晰或更模糊。如果光照发生变化,或者场景内容发生变化,就无法再进行比较了。

我不知道有什么万无一失的方法可以在没有对焦图像与之进行比较的情况下区分失焦图像。所有这些方法都会失败,告诉您白墙的完美对焦图像失焦了。

最好的方法是比较较高频率和较低频率(例如,使用带通滤波器)的功率(频率分量幅度的平方)。这将告诉您图像是否包含任何锐边。当然,当场景仅包含平滑过渡而没有锐利边缘时,它会告诉您图像失焦。

This other Q&A 还有一些想法。


挑剔:

img_4 = np.fft.ifftshift(img_3) 撤消 img_3 = np.fft.fftshift(img_2) 所做的操作,因此 img_4 == img_2。尽管如此,在傅立叶域中移动原点不会影响任何后续处理,因此在计算中使用img_2img_3img_4无关紧要。