图像处理 - 在MATLAB中使用Radon变换进行模式识别

10

我试图提取Radon Signature以识别衣服的图案(条纹,格子,不规则和无图案),就像在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结果 输入图像

然而,我的结果至少应该显示两个明显的峰值,就像文章的结果一样,但它们并没有。

任何帮助都将受到赞赏。

算法来源:“面向视障人士的辅助服装图案识别”作者:Xiaodong Yang(IEEE学生会员),Shuai Yuan和YingLi Tian(IEEE高级会员)


1
在Matlab中,var函数用于计算方差。 - User404
你能发布你的源图像吗?此外,我建议您使用无损图像格式,如png,而不是jpg。 - beaker
2
我认为这很简单,只需使用直径等于图像最小尺寸的圆形掩模即可。我之所以这样认为,是因为随着Radon变换角度的改变,每个角度上图像的范围都是恒定的。不幸的是,我无法使用此方法产生所需的结果,但我也无法重现您上面的图表。可能是因为我正在使用Octave而不是MATLAB,所以您可能需要尝试一下并查看结果。 - beaker
@beaker,你的图表显示了两个明显的峰吗?因为这正是我希望得到的。正如我所提到的,我对步骤一和步骤二不确定。你是说要在图像上使用圆形掩模,然后执行Radon变换吗?但这是否与在最大圆盘区域上执行Radon变换相同? - User404
那应该是我的猜测,我按照你的代码进行了操作,但是没有在图表中得到两个峰值。 - beaker
显示剩余10条评论
1个回答

2

如@beaker所想的那样,最大磁盘面积是由适合于图像边界框内的最大填充圆所定义的。这可以从文章的Fig.3 b)中观察到。

你做错的另一件事情是使用了边缘检测器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 你会得到更加明显的结果。

你是如何进行去噪处理得到这个结果的? - User404

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接