Производная изображения и FFT-Matlab
У меня есть изображение RGB, и я пытаюсь определить, находится ли это изображение в фокусе или не в фокусе. Вначале я сделал 2D БПФ, но когда я построил радиальный спектр, не было четкого различия между изображениями, которые находятся в фокусе, и изображениями, которые не в фокусе. Мне сказали использовать производные изображений, но когда я строю этот новый спектр, результаты не выглядят так, как я ожидал. Поскольку это часть более крупной программы, я пишу здесь псевдокод, это не полная программа
%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 ответ
Расфокусировка проявляется через квадратичный член в зрачке оптической системы. Вам нужно будет выбрать некоторый базисный набор, скажем, Zernike или Seidel, а затем вычислить градиент относительно коэффициента, соответствующего расфокусировке.
Изображение, которое вы собрали, представляет собой свертку функции рассеяния системной точки (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, используя теорему о свертке, таким образом вы можете выразить ее в терминах БПФ и решить непосредственно для ядра размытия (PSF). Это называется слепой деконволюцией, потому что вы не знаете ни истинного объекта, ни PSF.
Получив PSF, вы выполняете поиск фазы на PSF, чтобы получить расфокусировку, то есть, если вы хотите решить эту проблему строго.
Я думаю, что есть несколько примеров деконволюции в файлах справки Matlab, вы смотрели там примеры?
Реализация "градиента изображения" не решает проблему дефокусировки изображения, почему вы это делаете?