2012-03-28 73 views
5

Tôi tìm thấy một thực hiện các biến đổi Hough trong MATLAB tại Rosetta Code, nhưng tôi đang gặp khó khăn khi hiểu nó. Ngoài ra tôi muốn sửa đổi nó để hiển thị hình ảnh gốc và các đường được xây dựng lại (de-Houghing).Hough biến đổi trong MATLAB mà không sử dụng chức năng hough

Bất kỳ trợ giúp nào trong việc hiểu nó và khử Houghing đều được đánh giá cao. Cảm ơn

  1. Tại sao hình ảnh bị lật?

    theImage = flipud(theImage);

  2. Tôi không thể quấn quanh đầu tôi các chức năng tiêu chuẩn. Mục đích của nó là gì, và nó có thể tránh được không?

EDIT: tiêu chỉ là một từ đồng nghĩa với khoảng cách Euclide: sqrt (chiều rộng^2 + chiều cao^2)

rhoLimit = norm([width height]);

  1. Ai đó có thể cung cấp một lời giải thích như thế nào/tại sao rho, theta, và houghSpace được tính?

    rho = (-rhoLimit:1:rhoLimit);   
    theta = (0:thetaSampleFrequency:pi); 
    
    numThetas = numel(theta); 
    houghSpace = zeros(numel(rho),numThetas); 
    
  2. Làm cách nào để loại bỏ không gian Hough để tạo lại đường kẻ?

Gọi chức năng sử dụng một hình ảnh 10x10 của một đường chéo tạo ra bằng cách sử dụng danh tính (mắt) chức năng

theImage = eye(10) 
thetaSampleFrequency = 0.1 
[rho,theta,houghSpace] = houghTransform(theImage,thetaSampleFrequency) 

Chức năng thực tế

function [rho,theta,houghSpace] = houghTransform(theImage,thetaSampleFrequency) 

    %Define the hough space 
    theImage = flipud(theImage); 
    [width,height] = size(theImage); 

    rhoLimit = norm([width height]); 
    rho = (-rhoLimit:1:rhoLimit);   
    theta = (0:thetaSampleFrequency:pi); 

    numThetas = numel(theta); 
    houghSpace = zeros(numel(rho),numThetas); 

    %Find the "edge" pixels 
    [xIndicies,yIndicies] = find(theImage); 

    %Preallocate space for the accumulator array 
    numEdgePixels = numel(xIndicies); 
    accumulator = zeros(numEdgePixels,numThetas); 

    %Preallocate cosine and sine calculations to increase speed. In 
    %addition to precallculating sine and cosine we are also multiplying 
    %them by the proper pixel weights such that the rows will be indexed by 
    %the pixel number and the columns will be indexed by the thetas. 
    %Example: cosine(3,:) is 2*cosine(0 to pi) 
    %   cosine(:,1) is (0 to width of image)*cosine(0) 
    cosine = (0:width-1)'*cos(theta); %Matrix Outerproduct 
    sine = (0:height-1)'*sin(theta); %Matrix Outerproduct 

    accumulator((1:numEdgePixels),:) = cosine(xIndicies,:) + sine(yIndicies,:); 

    %Scan over the thetas and bin the rhos 
    for i = (1:numThetas) 
     houghSpace(:,i) = hist(accumulator(:,i),rho); 
    end 

    pcolor(theta,rho,houghSpace); 
    shading flat; 
    title('Hough Transform'); 
    xlabel('Theta (radians)'); 
    ylabel('Rho (pixels)'); 
    colormap('gray'); 

end 
+0

Câu hỏi hay hơn về [DSP.SE] (http://dsp.stackexchange.com/). – Phonon

+1

@Phonon Tại sao? Đây là câu hỏi về chi tiết triển khai của một thuật toán cụ thể. –

Trả lời

5

Các Hough transform là một "bầu cử "cách tiếp cận nơi mỗi điểm hình ảnh biểu quyết một phiếu bầu về sự tồn tại của một dòng nhất định (không phải một dòng phân đoạn) trong một hình ảnh. Việc biểu quyết được thực hiện trong không gian tham số cho một dòng: biểu diễn tọa độ cực của các vectơ thông thường.

Chúng tôi loại bỏ không gian tham số và cho phép mỗi điểm ảnh đề xuất các tham số tương thích với một đường thẳng qua điểm. Mỗi câu hỏi của bạn có thể được giải quyết theo cách không gian tham số được xử lý trong mã. Wikipedia có một bài viết hay với các ví dụ đã làm việc có thể làm rõ mọi thứ (nếu bạn gặp bất kỳ vấn đề khái niệm nào).

Đối với câu hỏi cụ thể của bạn:

  1. Hình ảnh lộn nên nguồn gốc là góc dưới bên phải. Theo như tôi có thể nói bước này là không cần thiết về mặt kỹ thuật. Nó thay đổi kết quả phần nào do vấn đề discretization. Các triển khai khác trên Mã Rosetta không lật hình ảnh.
  2. rhoLimit giữ bán kính tối đa của điểm ảnh trong tọa độ cực (nhớ lại chỉ tiêu của vectơ là độ lớn).
  3. rhotheta là các phép lọc của mặt phẳng tọa độ cực theo tỷ lệ lấy mẫu.houghSpace tạo một ma trận với một phần tử cho mỗi kết hợp có thể có của các giá trị rho/theta rời rạc.
  4. Biến đổi Hough không chỉ định độ dài của đường giả định; các đỉnh trong không gian biểu quyết chỉ xác định tọa độ cực của vec-tơ thông thường của đường thẳng. Bạn có thể "de-Hough" bằng cách chọn các đỉnh và vẽ các đường tương ứng hoặc có thể bằng cách vẽ từng dòng có thể và sử dụng số phiếu bầu làm trọng số thang độ xám. Không thể tạo lại hình ảnh ban đầu từ Biến đổi Hough, chỉ các dòng được xác định bởi biến đổi (và sơ đồ thresholding của bạn trên phiếu bầu).

Làm theo ví dụ từ câu hỏi tạo biểu đồ sau. Vị trí của các đường lưới và con trỏ datatips có thể là một chút gây hiểu lầm (mặc dù các giá trị biến trong 'tip là chính xác). Vì đây là hình ảnh của không gian tham số và không phải là không gian hình ảnh, tỷ lệ lấy mẫu chúng tôi chọn là xác định số lượng thùng trong mỗi biến. Với tốc độ lấy mẫu này, các điểm ảnh tương thích với nhiều hơn một dòng có thể; nói cách khác, các dòng của chúng ta có độ phân giải subpixel, theo nghĩa là chúng không thể được vẽ mà không chồng lên nhau trong một hình ảnh 10x10.

Khi chúng tôi đã chọn một đỉnh, chẳng hạn như tương ứng với dòng với bình thường (rho,theta) = (6.858,0.9), chúng tôi có thể vẽ đường đó trong một hình ảnh tuy nhiên chúng tôi chọn. Chọn đỉnh tự động, tức là đập để tìm các đường được bình chọn cao, là vấn đề riêng của nó - bạn có thể hỏi một câu hỏi khác về chủ đề trong DSP hoặc về một thuật toán cụ thể tại đây.

Ví dụ: các phương pháp xem mã và documentation của các chức năng houghpeakshoughlines của MATLAB.

enter image description here

+0

Cảm ơn. Tại sao chúng ta muốn nguồn gốc ở góc dưới cùng bên phải? Làm thế nào tôi đọc [output] này (http://i.imgur.com/LuVLI.png). Theta sẽ là 1 hay 1,5? Rho sẽ là 6.858 hay cái ở trên? hoặc là trung bình của những giá trị đó? Điều gì sẽ là một cách tốt để tìm kiếm tất cả các 'điểm nóng' trong biến đổi Hough? Điều gì sẽ là cách tốt nhất để vẽ các đường được tìm thấy? Từ wikipeida tôi có thể thấy rằng y = mx + b trong đó m = - (cos (theta)/sin (theta)) và b = r/sin (theta). Tôi sẽ chỉ vẽ một đường dựa trên các thông số đó? Cảm ơn – waspinator

+0

Dường như việc triển khai MATLAB có thể phát hiện sự khởi đầu và kết thúc của các dòng. Không cần thiết cho mục đích của tôi, nhưng thú vị. Tôi chỉ cần những điều cơ bản. Tôi vẫn còn nhiều điều phải làm trước khi tôi hiểu điều này, nhưng bạn đã giúp rất nhiều. Cảm ơn bạn. Trước khi tôi rời câu hỏi này, bạn có thể chỉ cần làm rõ lý do tại sao chúng tôi muốn nguồn gốc ở góc dưới cùng bên phải thay vì bên trái? – waspinator

+0

Để đoán tại điểm cuối của đoạn đường, bạn phải sử dụng thông tin khác từ hình ảnh. MATLAB xuất hiện để tìm các cặp pixel xa nhất đóng góp vào thùng và xem chúng là điểm kết thúc. –

Các vấn đề liên quan