Обработка изображений - использование преобразования радона для распознавания образов в MATLAB

Я пытаюсь извлечь Подпись Радона, чтобы распознать образцы одежды (полосатые, плед, нерегулярные и без рисунков), как это сделано в 1.

Алгоритм, который будет реализован:

 1. Use sobel operator to compute the gradient map as f(x,y).
 2. Perform Radon transform based on maximum disk area.
 3. Compute the variance of r under all theta directions.
 4. Employ L2-norm to normalize the feature vector.
 5. Plot Radon Signature as a bar chart of var(r) for all theta values.

Я сделал следующее:

img = imread('plaid.jpg');
grey = rgb2gray(img);
img2 = edge(grey, 'sobel');
vararray=zeros(1,size(theta,2));
theta = -89:90;
for j = 1: size(theta,2)
     [R3,xp3] = radon (img2,theta(j));
     vararray(j) = var(R3);
end
vararray = vararray/norm(vararray);
figure(1), bar(theta,vararray),title('Radon Signature');

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

Мои результаты показаны справа, а из статьи (см. ниже) показано слева.

Результаты (слева: результаты статьи, справа: мои результаты Matlab)></a> <a href=Входное изображение

Однако мои результаты должны, по крайней мере, показывать 2 отличных пика, как показано в результатах действия, но они этого не делают.

Любая помощь приветствуется.

Источник алгоритма: "Признание вспомогательной одежды для людей с ослабленным зрением" Xiaodong Yang, учащийся, IEEE, Shuai Yuan и YingLi Tian, ​​старший член IEEE

Ответ 1

Максимальная площадь диска, как думает @beaker, определяется максимальной заполненной кружкой, которая помещается внутри ограничивающей рамки изображения. Это можно увидеть из рисунка 3 б) статьи.

Еще одна вещь, которую вы сделали неправильно, использует детектор края edge(grey, 'sobel'), в то время как вы должны использовать карту градиента или более формально градиентную величину. Здесь код, который создает кривую, близкую к тому, что показано на рис. 3d. Как определить его до шести пиков, остается вопрос.

A = imread( 'Layer-5.png' ); % image from the article
A = double(rgb2gray( A ));

% gradient magnitude
dx = imfilter(A,fspecial('sobel') ); % x, 3x3 kernel
dy = imfilter(A,fspecial('sobel')'); % y
gradmag = sqrt( dx.^2 + dy.^2 );

% mask by disk
R = min( size(A)/2 ); % radius
disk = insertShape(zeros(size(A)),'FilledCircle', [size(A)/2,R] );
mask = double(rgb2gray(disk)~=0);
gradmag = mask.*gradmag;

% radon transform
theta = linspace(0,180,180);
vars = zeros(size(theta));
for u = 1:length(theta)
    [rad,xp] =radon( gradmag, theta(u) );
    indices = find( abs(xp)<R );
    % ignore radii outside the maximum disk area
    % so you don't sum up zeroes into variance
    vars(u) = var( rad( indices ) );
end
vars = vars/norm(vars);
figure; plot( vars );

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

denoised image

вы получите гораздо более заметные результаты.