2012-04-09 118 views
4

我试图让Hough变换在MATLAB中工作,但我遇到了问题。我有一个非常糟糕的方法来检测需要修复的峰,但在此之前,我需要能够逆转hough变换以正确再次创建线。这是东西我得到现在的类型:行hough变换

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(m*x+b, x); 

至于峰值检测,你可能想看看imregionalmax