(Matlab) Выполнение гауссовой фильтрации с использованием imfilter на двоичном изображении

В настоящее время я пишу программу для отслеживания бегущей мухи в маленькой камере, и мне нужны координаты XY центра мухи. Для этого я сначала фильтрую каждый кадр гауссовым фильтром, используя fspecial('gaussian',[30 30],100) а также imfilter чтобы получить белое "облако", где муха. Мне нужно это, чтобы уменьшить шум от центра мухи. Я преобразовываю результат в двоичное изображение, используя im2bw с определенным порогом, чтобы получить белый шарик из вышеупомянутого облака. Чтобы получить координаты, я использую regionprops который находит центр тяжести белого шарика. Это уже работает нормально, но это занимает целую вечность - примерно 6 часов для 30 минут видео; частота кадров составляет 100 кадров в секунду, хотя.

Я понял, что фильтрация Гаусса занимает большую часть времени - могу ли я как-то настроить этот процесс? Я читаю о conv2, который, как говорят, быстрее, но он не работает на двоичных изображениях, не так ли? И преобразование моих двоичных изображений в одинарные или двойные портит их.

Я уже работал над производительностью кода на других уровнях, таких как настройка окна поиска и т. Д., Так что фильтрация - это то, что осталось, насколько я могу оценить.

заранее спасибо

1 ответ

Решение

Возможно, что сглаживающая часть не нужна, простая пороговая обработка вашего изображения приводит к довольно четкой идентификации мухи:

f=rgb2gray(imread('frame.png'));
BW=f>30;
props=regionprops(BW, 'BoundingBox');
imshow(f)
rectangle('Position',props.BoundingBox, 'LineWidth',2, 'EdgeColor','b');

Результат:

обнаруженная муха

Чтобы ответить на ваш вопрос о быстром сглаживании, вы можете использовать низкочастотную фильтрацию на основе БПФ вместо движущегося гауссова, чтобы сгладить ваши кадры намного быстрее. Пример для одного кадра (маску нужно сделать только один раз):

f=rgb2gray(imread('frame.png'));
D=30;
[x,y]=size(f);

%Generating a disc-shaped binary mask with radius D:

Mask = fspecial('disk',D)==0;
Mask = ~imresize(padarray(Mask, [floor((x/2)-D) floor((y/2)-D)], 1, 'both'), [x y]);

% (Apply this to all the frames:)

MaskedFFT=fftshift(fft2(f));.*Mask;
Filteredf=abs(ifft2(MaskedFFT));

Результат:

Оригинал (f)

оригинальная картинкаОтфильтровано (Filteredf)

сглаженный

Другие вопросы по тегам