图像处理 - 在 MATLAB 中使用 Radon 变换进行模式识别
Image Processing - Using Radon Transform for Pattern Recognition in MATLAB
我正在尝试提取 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 的结果所示,但它们没有。
如有任何帮助,我们将不胜感激。
算法来源:"Assistive Clothing Pattern Recognition for Visually Impaired People" IEEE 学生会员 Xiaodong Yang、Shuai Yuan 和 YingLi Tian,IEEE 高级会员
正如@beaker 所想,最大磁盘区域由适合图像边界框内的最大实心圆定义。从文章的图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 伪像。良好的去噪后(这里有点太多),例如
你会得到更显着的结果。
我正在尝试提取 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 的结果所示,但它们没有。
如有任何帮助,我们将不胜感激。
算法来源:"Assistive Clothing Pattern Recognition for Visually Impaired People" IEEE 学生会员 Xiaodong Yang、Shuai Yuan 和 YingLi Tian,IEEE 高级会员
正如@beaker 所想,最大磁盘区域由适合图像边界框内的最大实心圆定义。从文章的图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 伪像。良好的去噪后(这里有点太多),例如
你会得到更显着的结果。