Radon变换线检测

时间:2016-02-15 15:00:08

标签: matlab line transform

我正在尝试检测灰度图像中的线条。为此,我在MATLAB中使用Radon变换。我的m文件的一个例子如下所示。我可以使用此代码检测多行。我还使用线的移位和旋转属性绘制线条。但是,在得到 rho theta 值后,我不明白如何获得检测线的起点和终点。

Hough变换很容易,因为有一个叫做 houghlines()的函数可以返回给定峰值的行列表。有没有可以用于Radon变换的功能类似于这个功能?

    % Radon transform line detection algorithm
    clear all; close all;

    % Determine the path of the input image
    str_inputimg = '3_lines.png' ;

    % Read input image 
    I = imread(str_inputimg) ;

    % If the input image is RGB or indexed color, convert it to grayscale 
    img_colortype = getfield(imfinfo(str_inputimg), 'ColorType') ;
    switch img_colortype
       case 'truecolor'
         I = rgb2gray(I) ;
       case 'indexedcolor'
         I = ind2gray(I) ;
    end

    figure;
    subplot(2,2,1) ;
    imshow(I) ;
    title('Original Image') ;

    % Convert image to black white 
    %BW = edge(I,'Sobel');
    BW=im2bw(I,0.25) ;
    subplot(2,2,2) ;
    imshow(BW); 
    title('BW Image') ;

    % Radon transform 
    % Angle projections  
    theta = [0:179]' ;
    [R, rho] = radon(BW, theta) ;
    subplot(2,2,3) ;
    imshow(R, [], 'XData', theta, 'YData', rho, 'InitialMagnification', 'fit');
    xlabel('\theta'), ylabel('\rho');
    axis on, axis normal, hold on;

    % Detect the peaks of transform output  
    % Threshold value for peak detection
    threshold_val = ceil(0.3*max(R(:))) ;
    % Maximum nof peaks to identify in the image
    max_nofpeaks = 5 ;
    max_indexes = find(R(:)>threshold_val) ;
    max_values = R(max_indexes) ;
    [sorted_max, temp_indexes] = sort(max_values, 'descend') ;
    sorted_indexes = max_indexes(temp_indexes) ;

    % Get the first highest peaks for the sorted array
    if (length(sorted_max) <= max_nofpeaks)
        peak_values = sorted_max(1:end) ; 
        peak_indexes = sorted_indexes(1:end) ;
    else
        peak_values = sorted_max(1:max_nofpeaks) ;
        peak_indexes = sorted_indexes(1:max_nofpeaks) ;
    end
    [y, x]  = ind2sub(size(R), peak_indexes ) ;
    peaks = [rho(y) theta(x)] ;
    plot(peaks(:,2), peaks(:,1), 's', 'color','white');
    title('Radon Transform & Peaks') ;

    % Detected lines on the image
    subplot(2,2,4), imshow(I), title('Detected lines'), hold on

    x_center = floor(size(I, 2)/2) ;
    y_center = floor(size(I, 1)/2) ;
    for p=1:length(peaks)

        x_1 = [-x_center, x_center] ;
        y_1 = [0, 0] ;

        % Shift at first
        x_1_shifted = x_1 ;
        y_1_shifted = [y_1(1)-peaks(p,1), y_1(2)-peaks(p,1)] ;

        % Rotate 
        peaks(p,2) = 90 - peaks(p,2) ;
        t=peaks(p,2)*pi/180;
        rotation_mat = [ cos(t) -sin(t) ; sin(t) cos(t) ] ;
        x_y_rotated = rotation_mat*[x_1_shifted; y_1_shifted] ;
        x_rotated = x_y_rotated(1,:) ;
        y_rotated = x_y_rotated(2,:) ;
        plot( x_rotated+x_center, y_rotated+y_center, 'b', 'linewidth', 2 );
   end
   hold off;

1 个答案:

答案 0 :(得分:1)

math.SE的建议可能有所帮助。然后是一篇相当复杂的研究论文"Sharp endpoint estimates for the X-ray transform and the Radon transform in finite fields",这似乎只是为了显示估计准确性的某些界限。

从略读其他论文看,这似乎是一个非常重要的问题。我怀疑使用Sobel-operation的某些自适应来识别沿着被发现的线的高梯度点可能更简单(如果不太准确),并将其称为端点。