Cách thực hiện chuyển đổi Hough dựa trên độ dốc


9

Tôi đang cố gắng sử dụng biến đổi Hough để phát hiện cạnh và muốn sử dụng hình ảnh gradient làm cơ sở.

Những gì tôi đã làm cho đến nay, do ảnh Ikích thước [M,N]và hàm riêng của nó gx, gylà để tính toán góc gradient trong mỗi điểm ảnh như thetas = atan(gy(x,y) ./ gx. Tương tự tôi tính độ lớn gradient là magnitudes = sqrt(gx.^2+gy.^2).

Để xây dựng biến đổi Hough, tôi sử dụng mã MATLAB sau:

max_rho = ceil(sqrt(M^2 + N^2));
hough = zeros(2*max_rho, 101);
for x=1:M
    for y=1:N
        theta = thetas(x,y);
        rho = x*cos(theta) + y*sin(theta);

        rho_idx = round(rho)+max_rho;
        theta_idx = floor((theta + pi/2) / pi * 100) + 1;
        hough(rho_idx, theta_idx) = hough(rho_idx, theta_idx) + magnitudes(x,y);
    end
end

Biến đổi Hough kết quả trông có vẻ hợp lý (xem http://i.stack.imgur.com/hC9mP.png ), nhưng khi tôi cố gắng sử dụng cực đại của nó làm tham số cạnh trong ảnh gốc, kết quả trông ít nhiều ngẫu nhiên. Tôi đã làm điều gì sai trong việc xây dựng biến đổi Hough?

CẬP NHẬT : Tôi đã có một lỗi ngu ngốc trong mã của mình: rhođược tính như x*cos(theta)+y*cos(theta)thay vì x*cos(theta)+y*sin(theta). Đó là, tôi đã sử dụng hai cosin thay vì cosin và sin. Tôi đã chỉnh sửa mã ở trên và hình ảnh kết quả mới ở bên dưới. Điều này đã không cho các cạnh tốt hơn mặc dù.

@endolith: Để vẽ một cạnh, được cho một giá trị tối đa trong hough-matrix tại rho_idx, theta_idx, tôi dịch các chỉ số thành rho,thetacác giá trị:

theta = (theta_idx -1) / 100 * pi - pi / 2;
rho = rho_idx - max_rho;

Cuối cùng tôi vẽ cạnh như y= (rho - x*cos(theta)) / sin(theta).

Kết quả mới


"Khi tôi cố gắng sử dụng cực đại của nó làm tham số cạnh trong ảnh gốc" Bạn đang làm điều đó như thế nào?
endolith

@Jonas Do Vesterheden Chỉ cần tự hỏi đây có phải là hình ảnh tần số doppler của VS không? ...
Spacey

@Mohammad: Không phải tôi biết. Hình ảnh ban đầu là của một số bảng mạch. "VS" có nghĩa là gì?
Jonas Because Vesterheden

@JonasDueVesterheden 'VS' chỉ có nghĩa là 'so với'. (Thời gian so với tần số doppler ') :-)
Spacey

Bạn nên làm phẳng bản đồ hough của mình trước khi áp dụng ức chế Non max cho nó.

Câu trả lời:


2

Tôi hơi bối rối trước câu hỏi của bạn. Biến đổi Hough được sử dụng để phát hiện các đường, không phải các cạnh.

Nếu tất cả những gì bạn muốn là một bản đồ cạnh, bạn chỉ cần ngưỡng ngưỡng độ dốc hoặc sử dụng thứ gì đó lạ mắt hơn như máy dò cạnh Canny.

Nếu bạn muốn phát hiện các đường thẳng, tốt hơn hết là bắt đầu với một bản đồ cạnh, sau đó sử dụng houghchức năng nếu hộp công cụ Xử lý hình ảnh, nếu bạn có quyền truy cập vào nó. Vấn đề với việc thực hiện chuyển đổi Hough trên gradient là các pixel cạnh tạo thành một đường thẳng có thể có hướng gradient ngược lại. Ví dụ, hãy xem xét một mẫu bàn cờ. Một cạnh giữa hai hàng hình vuông lật hướng tùy thuộc vào việc bạn có hình vuông màu đen ở trên và hình vuông màu trắng bên dưới hay cách khác.

Khi bạn thực hiện, tôi nghĩ vấn đề là các thùng trong ma trận Hough của bạn quá nhỏ. Về cơ bản kích thước bin trong kích thước rho là 1 và kích thước bin trong kích thước theta nhỏ hơn 2 độ. Điều đó có nghĩa là các hướng dốc phải rất chính xác để tạo thành một đường, điều này hiếm khi xảy ra trong thực tế. Nếu bạn tính toán rho_idx và theta_idx để các thùng lớn hơn, điều đó sẽ làm cho trình phát hiện dòng của bạn dễ chịu hơn với các lỗi và bạn có thể có được các dòng tốt hơn.


1

Tôi không biết liệu đây có phải là một vấn đề hay không nhưng atan () chỉ cung cấp cho bạn các góc từ -90 đến +90 vì sự mơ hồ của góc phần tư. Để có được góc gradient đầy đủ (từ -180 đến 180), bạn cần sử dụng atan2 ().


Cám ơn vì sự gợi ý! Theo tôi hiểu, nên sử dụng các góc từ -90 đến +90 là đủ, vì "hướng" của các cạnh không quan trọng. Tôi đã thử sử dụng atan2, nhưng nó dường như không khắc phục được vấn đề.
Jonas Because Vesterheden
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.