Неправильная форма сравнения - PullRequest
5 голосов
/ 06 февраля 2012

Я пытаюсь придумать систему оценок для некоторых исследований поведенческой психологии.

Я прошу людей нарисовать письмо, а затем проследить его, как на графическом планшете.Я хочу оценить точность этого следа.Итак, вы рисуете любую букву («а»), затем делаете это снова, затем я оцениваю ее на основании того, насколько это было похоже на первый раз, когда вы нарисовали ее.Чертежи хранятся в пикселях.

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

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

Это должно было быть сделано раньше, но мне не повезло смои поиски.Любая помощь приветствуется!

--- Частичное решение с использованием метода, предложенного @Bill ниже.Не работает, так как градиент bwdist слишком крутой.Вместо хорошего второго изображения, которое показывает Билл, оно больше похоже на оригинал.

%% Letter to image 
im = zeros(1080,1920,3); % The screen (possible pixel locations) 
% A small square a bit like the letter 'a', a couple of pixels wide. 
pixthick = 5; 
im(450:450+pixthick,[900:1100],:) = 1; 
im(550:550+pixthick,[900:1100],:) = 1; 
im([450:550],900:900+pixthick,:) = 1; 
im([450:570],1100:1100+pixthick,:) = 1;
subplot(2,1,1); imagesc(im); %% atransbw = bwdist(im(:,:,1)<0.5); subplot(2,1,2); 
imagesc(atransbw);

Ответы [ 5 ]

3 голосов
/ 07 февраля 2012

Контексты форм - это мощный дескриптор признаков, основанный на «полярных гистограммах» форм.Страница Википедии является углубленной, но здесь - это еще одна страница с дополнительной информацией (и хорошим визуальным объяснением техники), а также демонстрационный код MATLAB .Сопоставление букв было одним из первоначальных применений метода, и демонстрационный код, на который я ссылаюсь, не требует от вас преобразования ваших векторов трассировки в изображения.

Более упрощенным методом может быть определение "разницы в изображениях"как эксклюзив или из двух букв.Это потребует преобразования ваших векторов трассировки в двоичные изображения.Что-то вроде:

x = xor(im1,im2);
d = sum(x(:)) / sum(im1(:)); %# normalize to the first image

Наконец, если ваши векторы трасс имеют одинаковое количество точек или могут быть сделаны путем выборки, анализ Procrustes может быть полезен.Идея анализа Прокруста состоит в том, чтобы найти оптимальное линейное преобразование (вращение, перемещение и масштабирование) методом наименьших квадратов между двумя наборами точек.Достоверность соответствия между двумя наборами точек определяется "статистикой прокруста" или другими показателями, такими как среднеквадратичное отклонение точек.

%# Whatever makes sense;
%# procrustes needs N x 2 matrices with (x,y) coords for N points.
coords1 = [x1 y1];
coords2 = [x2 y2];

%# This sampling may be too naive.
n = max( size(coords1,1), size(coords2,1) );
coords1 = coords1(1:n,:);
coords2 = coords2(1:n,:);

%# d is sum-of-squares error
%# z is transformed coords2
%# tr is the linear transformation
[ d, z, tr ] = procrustes( coords1, coords2 );

%# RMS deviation of points may be better than SSE.
n = size(coords1,1);
rmsd = sqrt((sum((coords1(:) - z(:)).^2) / n));
2 голосов
/ 06 февраля 2012

Вам может помочь преобразование расстояния , реализованное в MATLAB как bwdist. Это поощряет близость линий, даже если они не совпадают.

a_img_1 = imread('a.jpg');
imagesc(a_img_1);

enter image description here

a_img_1_dist_transform = bwdist( a(:, :, 1) < 250 );
imagesc(a_img_1_dist_transform);

enter image description here

Вы можете сделать то же самое со вторым изображением и суммировать разницу в значениях пикселей в преобразованных изображениях расстояния, что-то вроде:

score = sum( abs( a_img_1_dist_transform(:) - a_img_2_dist_transform(:) ) )

(Обратите внимание, что это даст более высокие оценки для менее похожих изображений и v.v.)

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

1 голос
/ 09 февраля 2012

Это мое последнее, слишком сложное решение, которое в основном использует метод Билла Читама.Спасибо за помощь!

% pixLet is the 2D vector contain locations where drawing occurred. First convert it to an image. 

im = zeros(1000,1000); % This is the image
for pix = 2:size(pixLet,1)
    y1 = pixLet(pix-1,2); x1 = pixLet(pix-1,1);
    y2 = pixLet(pix,2); x2 = pixLet(pix,1);
    xyd = round(pdist([x1 y1; x2 y2])*2);
    xs = round(linspace(x1,x2,xyd));
    ys = round(linspace(y1,y2,xyd));
    for linepix = 1:length(xs)
        im(ys(linepix),xs(linepix)) = 1;
    end
end

% Blur the image
blur = fspecial('gaussian',[sz sz],reach);
gausIm = conv2(im,blur,'same');

% I made a function of the above to do this for both the template and the trace.
score = sum(sum(abs(gausIm1-gausIm2)));
1 голос
/ 06 февраля 2012

Возможно, вы захотите найти аффинное преобразование, которое будет соответствовать какому-либо критерию ошибки, например среднеквадратичной ошибке.Таким образом, вы будете инвариантны к переводу и масштабированию.Или, если вы хотите оштрафовать перевод, вы также можете добавить стоимость перевода.(Это поможет нам помочь вам, если вы дадите больше информации о том, какие функции схожи или нет)

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

0 голосов
/ 06 февраля 2012

Я бы на самом деле предложил решение более высокого уровня.Найдите алгоритм машинного обучения OCR, который возвращает некоторую уверенность.Или, если у вас нет уверенности, проверьте расстояние между выходным текстом и фактическим.
Это похоже на человека, который следит за почерком и пытается его понять.Чем выше достоверность, тем лучше результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...