2013-11-27 4 views
2

Я новичок в Matlab, и у меня есть проект, который включает обработку изображений.фокус изображения и FFT

У меня есть несколько изображений RGB, и мне нужно найти способ отделить фокус от фокусных изображений. Мне не нужно исправлять фокус вне фокуса, мне просто нужно найти, что не в фокусе, и удалить их. Я сделал FFT2, а затем использовал радиальное среднее изображение спектра мощности, чтобы увидеть, есть ли разница между фокусом или фокусом, но я не вижу разницы между ними.

я решил использовать градиент изображения

[gradx,grady]=gradient(image) 

, а затем принять величину

new_image=sqrt((gradx.^2)+(grady.^2)) 

и попытаться сделать FFT2 с помощью new_image Теперь вместо image. Спектр мощности не похож на то, что я ожидаю, поэтому я не уверен, должен ли я делать FFT2 по new_imagegradx и grady отдельно. У кого-нибудь есть какие-то мысли о том, правильно ли это сделать?

Я также думал, что вместо того, чтобы использовать градиент использовать Собел маска

mask=fspecial('sobel') 
mask_x=imfilter(image,mask) 
mask_y=imfilter(image,mask') 
new_image=sqrt((mask_x.^2)+(mask_y.^2)) 

, а затем сделать FFT2 в new_image но опять же спектр мощности не является правильным. Я ожидаю, что он начнется с нуля и вместо этого начнется с самого высокого значения и будет экспоненциально снижаться.

Кто-нибудь пытался классифицировать изображения, используя этот метод? Спасибо за чтение.

+1

Трудно представить себе, что именно означает «спектр мощности не прав». Я ожидаю, что он начнется с нуля, а вместо этого начнется с самого высокого значения и будет экспоненциально снижаться ». Но мне кажется, что вы можете отказаться от вызова FFTSHIFT перед проверкой результатов. – jez

+1

'fftshift' ваш спектр !! – Shai

+0

Извините за путаницу, я забыл, что уже использовал FFTSHIFT. – user3043257

ответ

0
fftimg = fft2(new_image); 
imagesc(abs(fftshift(fftimg(2:end,2:end)))) 

Здесь (2:end,2:end) позволит избежать отображения компонентов постоянных изображения, и fftshift щелкнет низкочастотные компоненты к центру.

Я думаю, что это хорошая попытка наблюдать высокочастотные сигналы в ваших фокусных и внефокусных изображениях, поскольку первые могут иметь более резкие края, что указывает на более высокочастотные компоненты. И фильтр sobel, который эквивалентно вычисляет градиент исходного изображения, часто используется для извлечения краев изображения, поэтому ваш подход имеет смысл. Тем не менее, я не думаю, что вам нужно получить gradx и grady соответственно, так как sobel уже sqrt(Dx.^2+Dy.^2), где Dx и Dy являются частично производными по направлениям x и y.

+0

Благодарим вас за ответ. Я не поставил его в свой первоначальный вопрос, но я уже сделал FFTSHIFT. Когда я добавляю бит (2: конец), он фиксировал спектр на малых частотах. Математически, я ожидаю, что спектр градиента начнется и закончится до нуля (как почти кривая колокола).Сейчас он начинается с нуля, но не поворачивается и не возвращается назад к нулю на высоких частотах. Любые другие предложения? – user3043257

+0

Является ли ваше изображение 2 или 3 мерным (RGB 3 канала)? Каков формат данных? unit8 или double? Я попробовал одно из своих изображений с одним выбранным каналом и преобразован в double перед обработкой, и я не заметил проблемы, с которой вы столкнулись. – lennon310

+0

Изображение 2D (RGB 3 канала), я преобразовал его в double, когда прочитал его с IMREAD. Я только что работал с красным каналом, чтобы попытаться заставить его работать. С образцом вашего образца вы видите колокольчик, подобный кривой, в частотный спектр градиента изображения? – user3043257

0

DCT вместо FFT/DFT избавится от любых высокочастотных разрывов между противоположными краями ваших изображений.

Смежные вопросы