图像导数和FFT-Matlab

时间:2013-11-19 19:49:19

标签: image matlab derivative

我有一个RGB图像,我试图找到这个图像是焦点还是失焦。一开始我做了2D FFT,但是当我绘制径向光谱时,焦点图像和失焦图像之间没有明显区别。我被告知要使用图像的衍生物,但是当我绘制这个新光谱时,结果看起来并不像我预期的那样。 因为它是一个更大的程序的一部分,我在这里写一个伪代码,这不是完整的程序

 %read the file and the part of the image I am working on
  file='test1.jp2'
  image_part=imread(file,'PixelRegion',{[xpixmin xpixmax],[ypixmin ypixmax]});
 %derivatives
  dx=diff(double(image_part),1,1);
  dy=diff(double(image_part),1,2);
  ........
  created tapers with Slepian sequences (dpss), multiplied with dx and dy and 
  then new outcome is tap_dx,tap_dy
  .......   
 %FFT
  fft2_dx=fft2(tap_dx)
  fft2_dy=fft2(tap_dy)
 %magnitude and fftshift
  fft2_abs_dx=fftshift(abs(fft2_dx))
  fft2_abs_dy=fftshift(abs(fft2_dy))
  %to take the radial spectrum average the Fourier spectrum over the different   
  frequencies(fr)
   avg_dx=mean(fft2_abs_dx(fr))
   avg_dy=mean(fft2_abs_dy(fr))   
   plot(fr,avg_dx+avg_dy)

在我做导数之前,径向图从最大点开始,然后以单调方式下降到最小值。当我绘制导数虽然径向图从最大点开始然后到达最小点然后它再次增加,这似乎是不对的。有没有人试图使用这种技术找到图像是焦点还是失焦。我没有找到任何相关的参考资料。

项目的目的不是纠正图像的焦点,而是弄清楚图像是否失焦,以及是否要使用自动方式拒绝图像。
提前谢谢。

1 个答案:

答案 0 :(得分:1)

散焦通过光学系统瞳孔中的二次项表现出来。你需要选择一些基组,比如Zernike或Seidel,然后计算渐变w.r.t到与散焦相对应的coeff。

您收集的图像是系统点扩散函数(PSF)和您正在成像的真实对象的卷积:

ImageData = Image ** PSF + noise, where ** denotes convolution.

注意PSF由(PSF复振幅的复合面)给出:

PSF = PSF_ca *. conj(PSF_ca), 

,其中

PSF_ca  = FFT(pupil_complex_amplitude),

pupil_complex_amplitude = A*exp(-i*2*pi*pupil_phase), A is the aperture function.

和(i * i = -1):

pupil_phase = defocusCoeff*basisTerm;

您可以使用卷积定理处理ImageData表达式中的卷积,这样您就可以用FFT表示它并直接求解模糊内核(PSF)。这称为盲解卷积,因为您不知道真实对象或PSF。

一旦你有PSF,你就可以在PSF上进行相位检索以获得散焦,也就是说,如果你想要严格解决这个问题。

我认为在Matlab帮助文件中有一些解卷积的例子,你看过那里的例子吗?

实现“图像渐变”并不能解决图像散焦问题,为什么要这样做呢?