Обнаружение чисел с использованием функции обнаружения ребер, FFT и SAD - PullRequest
0 голосов
/ 06 ноября 2019

Я делаю проект, в котором я хочу обнаружить рукописные 6, используя обнаружение краев, чтобы найти координаты замкнутого контура, а затем, используя FFT, обрезать более высокие частоты. После обрезания я сравниваю различные «цифры или символы» с, например, SAD в частотном пространстве, чтобы определить, является ли входное изображение числом 6 или нет.

После обнаружения края я получаю координаты в векторе и, нанося его на график, ясно вижу, что он выполняет свою работу:

Номер шесть нанесен на график:

Number six plotted

После этого я превращаю координаты X, Y в комплексные числа и выполняю БПФ для них (matlab). Так как я хочу обрезать, скажем, 70% самых высоких частот, плюс удалить часть постоянного тока (чтобы сделать ее трансляционно-инвариантной), выводится ли Matlabs FFT уже отсортированным по частотам?

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


im = X+1j*Y; %covert to complex numbers
list = fft(im); %perform fft

top30 = list(2:round(length(list)*usedPercent)); %remove dc part and only keeping a certain percentage of the output from fft

top30 = top30/norm(top30); %normalize to make scale-invariant
top30=abs(top30); % removing the angle to make it rotation-invariant

Приведенная выше часть используется в качестве функции для создания списка частот из разных изображений с различными номерами / символами, чтобы фактически сравнить его. Я использовал «эталонный» номер 6 и затем сравнил все входные данные. с этим с SAD, пример ниже:

test_six = sum(abs(var1(1:min(size(var1),size(var2)))-var2(1:min(size(var1),size(var2))))) 

% var1 is the frequencies obtained from my reference number six
% var2 is the frequencies obtained from another number six

Поскольку выходные частоты отличаются по размеру, я сравниваю только минимальные (n1, n2) частоты, я не уверен, является ли это правильным способом сделать SADхотя.

При сравнении моего ссылочного номера шесть с номером 7 значение SAD ниже, чем при сравнении его с другими шестью, это изображения:

Еще шесть построенных графиков:

Another six plotted

Номер семь нанесен на график:

Number seven plotted

Поскольку замкнутый контур не учитывается«дыра» в шестерке не так уж странно, что семерка довольно близка к шестой, но я все еще удивлен, что на самом деле она получает более низкое значение SAD, чем для других шести. Сравнивая повернутую шестерку (то есть очень похожую на девятку), я получаю очень низкое значение SAD, что, конечно, ожидается, поскольку оно не зависит от вращения.

Является ли все это хорошим подходом к проблеме, или яздесь вы делаете какие-то серьезные ошибки?

Вывод Matlabs FFT сортирует числа по частотам по умолчанию или мне приходится делать это вручную?

Правильно ли реализован способ сравнения SAD илиЕсть ли лучшие решения для сравнения результатов?

Большое спасибо заранее!

...