【问题标题】:Image Processing - Using Radon Transform for Pattern Recognition in MATLAB图像处理 - 在 MATLAB 中使用 Radon 变换进行模式识别
【发布时间】:2016-03-29 02:01:54
【问题描述】:

我正在尝试提取 Radon 签名以识别服装的图案(条纹、格子、不规则和无图案),如 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。

我的结果显示在右侧,而来自文章(以下引用)显示在左侧。

但是,我的结果应该至少显示 2 个不同的峰,如 acticle 的结果所示,但它们没有。

感谢您提供任何帮助。

算法来源:“视觉障碍人士的辅助服装图案识别”,IEEE 学生会员杨晓东、IEEE 高级会员袁帅和 IEEE 高级会员田英丽

【问题讨论】:

  • 文章中的这个数字似乎更像是一个涂鸦,而不是一个实际的科学数字。你确定要认真对待吗?你确定theta范围是一样的吗?
  • 从文章的图表中得到的主要内容是 2 个主峰。这也应该出现在我的结果中,但事实并非如此。我相信我的错误在于第一个算法步骤 1,但我不确定如何在 matlab 中执行此操作
  • 我无法帮助处理图像,但您应该在循环之前使用 vararray=zeros(1,size(theta,2)); 预先分配 vararray 并在循环内使用 vararray(j) 以提高速度。
  • var 在 Matlab 中计算方差。
  • 认为它就像使用直径等于图像最小尺寸的圆形遮罩一样简单。我认为这是因为,当你改变 Radon 变换的角度时,每个角度的图像范围将是一个常数。不幸的是,我无法使用这种方法产生所需的结果,但我也无法重现您上面的图表。这可能是因为我使用的是 Octave 而不是 MATLAB,所以您可能想尝试一下,看看您会得到什么。

标签: matlab image-processing pattern-recognition


【解决方案1】:

正如@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 伪像。经过良好的去噪(这里有点过分),例如,

你会得到更显着的结果。

【讨论】:

  • 你是如何去噪得到这个结果的?
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多