Giúp hiểu về biến đổi Hough


19

Tôi đang cố gắng để biến đổi Hough hoạt động trong MATLAB, nhưng tôi gặp vấn đề. Tôi có một cách thực sự tồi tệ để phát hiện các đỉnh cần được sửa, nhưng trước đó tôi cần có khả năng đảo ngược biến đổi hough để tạo lại các dòng một cách chính xác. Đây là loại công cụ tôi nhận được ngay bây giờ:

nhập mô tả hình ảnh ở đây

Trông giống như nó xoay 90 độ, nhưng tôi không chắc tại sao. Tôi không chắc liệu đó có phải là không gian Hough của tôi không, hay đó là cách tôi khử và vẽ các đường. Cũng có thể ai đó giúp cải thiện phát hiện cao điểm của tôi? Các hình ảnh được sử dụng trong mã ở đây

%% 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

Liên kết: Làm thế nào để thực hiện khử nhiễu của hình ảnh biến đổi Hough?


bạn đã quản lý để giải quyết vấn đề của bạn? tôi đang đối mặt với một vấn đề tương tự cảm ơn
Erez Posner

biến đổi de hough sous matlab pour détecter plusieurs ellipses

Câu trả lời:


11

Đầu tiên, Matlab có tích hợp Hough Transform : không cần phải phát minh lại bánh xe.

[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);

Mặc dù hình ảnh của bạn không nhất thiết yêu cầu phát hiện cạnh, bạn có thể cải thiện thời gian xử lý và hiệu quả của thuật toán mà tôi sử dụng. Tam giác của bạn có các vùng mỡ trắng và đen. Lý tưởng nhất là hình tam giác sẽ dày 1px đánh dấu các cạnh của hình tam giác. Sử dụng phát hiện cạnh Canny

BW = edge(Image,'canny');

kết quả là \ theta nằm trong phạm vi độ trong khi âm mưu của bạn là (hoặc ) nên trừ độ ( ).0 < θ < 180 0 < θ < π 90 π / 290<θ<900<θ<1800<θ<π90π/2

Có khả năng bạn chọn sai đỉnh vì có các đỉnh lân cận có thể lớn hơn trong ma trận tích lũy. Mặc dù có nhiều thuật toán ở đây là một thuật toán mà tôi đã thấy được sử dụng trong Hough Transforms trong quá khứ:

1) Define a region shape (typically its square) 
2) Define an accumulator threshold  
3) Select one pixel in the accumulator matrix
4) If it is a peak (i.e., larger than neighboring values above a threshold)
       a) look at the points within the region shape.
       b) If there is a larger value
              this is not a peak
          Else
              this is a peak
 5) Move to next pixel in accumulator matrix.

Nhìn vào HoughLines để hiển thị các dòng biến đổi của hough, kết quả:

http://www.mathworks.com/help/toolbox/images/ref/houghlines.html

Tác dụng của việc sử dụng máy dò cạnh Canny

Phát hiện cạnh có khả năng biến mỗi bên của tam giác thành hai đường.

Mục tiêu của phát hiện cạnh canny là tạo ra các cạnh mỏng / hẹp tối đa bằng cách sử dụng siêu áp không cực đại

Phát hiện cạnh Canny trong một Nutshell (Nguồn: Xử lý hình ảnh kỹ thuật số, Gonazalez)

1) Smooth input Image using a Gaussian Filter
2) Compute the Gradient magnitude and angle (Sobel, Perwitt or robert cross filters)
3) Apply Nonmaxima suppression (this is where the thinning happens) 
   a) Figure out which direction the edge is
   b) If the edge's magnitude is smaller than one of its two neighbors in the direction of the edge
          set the edge point to zero
      Else
          leave it alone
4) Use double thresholding and connectivity analysis to detect and link edges

Cảm ơn vi đa trả lơi. Tôi đang làm nó từ đầu để hiểu nó tốt hơn. phát hiện cạnh canny vẫn cho 2 hình tam giác. một cho cạnh bên trong, và ra cho cạnh ngoài. Tôi đã học lý thuyết từ wikipedia, trong đó nói rằng theta là 0: pi. Tôi biết rằng hàm tích hợp sử dụng -pi / 2: pi / 2, nhưng không nên có sự khác biệt thực sự?
waspinator

Ngay lập tức con dơi, phạm vi không nên làm cho một sự khác biệt. (bạn có thể cho biết sự khác biệt giữa một dòng đã được xoay 180 độ không?) TUY NHIÊN, điều này sẽ tạo ra sự khác biệt nếu bạn đang sử dụng biến đổi hough cho thuật toán chỉnh sửa ảnh. (Điều này có nghĩa là sự khác biệt giữa hình ảnh ngược dòng và hình ảnh lộn ngược)
CyberMen

Sẽ không phát hiện cạnh tạo ra 2 dòng mà bạn chỉ muốn tìm 1? Một cái gì đó tìm thấy trung tâm của một dòng dày sẽ tốt hơn.
endolith

@endolith Bao gồm một chút thảo luận về phát hiện cạnh trong bài viết gốc
CyberMen

'không cần phải sáng chế lại bánh xe'? Nói điều đó với người hướng dẫn của tôi ;-)
Nathan Schwermann

3
    if image(xi, yj) == 1 

cần phải đổi thành

    if image(yj, xi) == 1 

cho các dòng để làm việc trong dehough


1

Câu trả lời sử dụng 3 vòng ít hơn sau đó tối ưu và có thể được cải thiện, đây là cách tiếp cận / quan điểm trực quan hơn:

Mỗi cặp điểm hợp lệ đặt một & b duy nhất y = ax + b. Một dòng sẽ có rất nhiều cặp có cùng giá trị a & b, vì vậy một dòng dài sẽ có mặt như một đỉnh. Điều này cũng đúng với tọa độ r & teta cực.

Thay vì xử lý từng điểm riêng biệt, hãy sử dụng các cặp dấu chấm. Nếu bạn có thể lưu trữ tất cả các điểm (thường thưa thớt) trong một danh sách riêng thì tốt hơn, nhưng đó không phải là điều bắt buộc.

  1. Lấy từng cặp và tính a & b của nó. (làm tròn đến các giá trị rời rạc)
  2. Đi đến vị trí cụ thể trong mảng và thêm 1.

Hàng dài -> rất nhiều cặp có cùng a, b.
Điểm lẻ tẻ -> đếm nhỏ trong các ô cụ thể -> giống như sự lộn xộn hơn.


Một cách khác để xem xét nó là từ quan điểm Radon / chiếu.

  • Một dòng sẽ chiếu mạnh đến một "đường thu thập" vuông góc để có điểm cao.
  • Nếu góc giữa đường và "đường thu thập" không phải là 90 độ hoặc đường thu thập không thu thập tất cả các điểm đường được chiếu vào "đường thu thập" này, sẽ có điểm thấp hơn.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.