2012-04-09 8 views
4

私はMATLABで動作するようにハフ変換をしようとしていますが、問題があります。私は修正が必要なピークを検出するには本当に悪い方法がありますが、その前に、ハフ変換を元に戻して、再び線を正しく作成できるようにする必要があります。これは私が今取得していますものの一種である: hough transform for lines

enter image description here

はその90度回転のように見えますが、私はなぜわかりません。私はそれが間違っている私のハフスペースであるかどうか、またはそれが私がデハウとラインを描く方法であるかどうかは分かりません。また、ピーク検出の改善に役立つ人もいますか?コード内で使用

画像here

クロス掲示

%% load a sample image; convert to grayscale; convert to binary 

%create 'x' image (works well) 
a = eye(255); 
b = flipud(eye(255)); 
x = a + b; 
x(128,128) = 1; 

%image = rgb2gray(imread('up.png')) < 255; 
%image = rgb2gray(imread('hexagon.png')) < 255; 
%image = rgb2gray(imread('traingle.png')) < 255; 
%%% these work 
%image = x; 
%image = a; 
image = b; 

%% set up variables for hough transform 
theta_sample_frequency = 0.01;            
[x, y] = size(image); 
rho_limit = norm([x y]);             
rho = (-rho_limit:1:rho_limit); 
theta = (0:theta_sample_frequency:pi); 
num_thetas = numel(theta); 
num_rhos = numel(rho); 
hough_space = zeros(num_rhos, num_thetas); 

%% perform hough transform 
for xi = 1:x 
    for yj = 1:y 
     if image(xi, yj) == 1 
      for theta_index = 1:num_thetas 
       th = theta(theta_index); 
       r = xi * cos(th) + yj * sin(th); 
       rho_index = round(r + num_rhos/2);      
       hough_space(rho_index, theta_index) = ... 
        hough_space(rho_index, theta_index) + 1; 
      end 
     end 
    end 
end 


%% show hough transform 
subplot(1,2,1); 
imagesc(theta, rho, hough_space); 
title('Hough Transform'); 
xlabel('Theta (radians)'); 
ylabel('Rho (pixels)'); 
colormap('gray'); 

%% detect peaks in hough transform 
r = []; 
c = []; 
[max_in_col, row_number] = max(hough_space); 
[rows, cols] = size(image); 
difference = 25; 
thresh = max(max(hough_space)) - difference; 
for i = 1:size(max_in_col, 2) 
    if max_in_col(i) > thresh 
     c(end + 1) = i; 
     r(end + 1) = row_number(i); 
    end 
end 

%% plot all the detected peaks on hough transform image 
hold on; 
plot(theta(c), rho(r),'rx'); 
hold off; 


%% plot the detected line superimposed on the original image 
subplot(1,2,2) 
imagesc(image); 
colormap(gray); 
hold on; 

for i = 1:size(c,2) 
    th = theta(c(i)); 
    rh = rho(r(i)); 
    m = -(cos(th)/sin(th)); 
    b = rh/sin(th); 
    x = 1:cols; 
    plot(x, m*x+b); 
    hold on; 
end 

ありがとうされています https://dsp.stackexchange.com/questions/1958/help-understanding-hough-transform

答えて

5

をあなたの、再生画像を90度回転させ、あるいは裏返しに見える場合それは、プロットが期待どおりに起こっていないためです。あなたは、プロットの起源を移動するaxis ij;を試すことができ、および/または、あなたのplotコマンドを逆にすることができます:

plot(m*x+b, x); 

ピーク検出用として、あなたはimregionalmaxで見たいと思うかもしれません。