3.5.3.1 Hàm hough
Cú pháp.
[H, theta, rho] = hough(BW)
[H, theta, rho] = hough(BW,ParameterName,ParameterValue) Mô tả.
Sử dụng hàm hough để xác định đường trong ảnh. Hàm trả về ma trận H, chính là ma trận Biến đổi Hough. Theta và Rho là các mảng giá trị của rho và theta mà qua đó hàm hough tạo nên ma trận H.
Khi PrameterName là ‘RhoResolution’, cần chỉ định một giá trị thực vô hướng nằm trong khoảng từ 0 đến norm(size(BW)). Khi PrameterName là ‘Theta’, thì giá trị chỉ định của nó là một vector các giá trị của theta trong ma trận biến đổi Hough.
Ví dụ: I = imread('circuit.tif'); rotI = imrotate(I,33,'crop'); BW = edge(rotI,'canny'); [H,theta,rho] = hough(BW); figure, imshow(imadjust(mat2gray(H)),[],'XData',theta,'YData',rho,... 'InitialMagnification','fit');
xlabel('\theta (degrees)'), ylabel('\rho'); axis on, axis normal, hold on;
28 Kết quả:
Hình 3. 7 Ảnh gốc mạch điện
Hình 3. 8 Ảnh dùng biến đổi Hough
3.5.3.2 Hàm Houghpeaks
Cú pháp
peaks = houghpeaks(H, numpeaks)
peaks = houghpeaks(..., param1, val1, param2, val2) Mô tả
Hàm xác định đỉnh trong ma trận H, numpeaks là một giá trị vô hướng để xác định số lượng tối đa các đỉnh, giá trị mặc định của numpeaks là 1.
29 Hàm trả về giá trị peaks, là một ma trận Qx2, trong đó nằm trong khoảng giá trị từ 0 đến numpeaks.
peaks = houghpeaks(..., param1, val1, param2, val2) quy định cụ thể cặp tham số - giá trị. Các tham số đó là:
Tham số Mô tả
’Threshold’ Giá trị vô hướng không âm xác định giá trị mà tại đó giá trị của H được xem như là đỉnh. Mặc định là 0.5*max(H(:)) ’NHoodSize’ Véc tơ gồm hai phần tử là số nguyên dương lẽ: [M N]. Xác
định khu vực lân cận xung quanh mỗi đỉnh. Mặc định là giá trị lẽ nhỏ nhất lớn hơn hoặc bằng size(H)/50.
Ví dụ: >> I = imread('circuit.tif'); BW = edge(imrotate(I,50,'crop'),'canny'); [H,T,R] = hough(BW); P = houghpeaks(H,2); imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
plot(T(P(:,2)),R(P(:,1)),'s','color','white') Kết quả:
30
Hình 3. 9 Kết quả dùng houghpeaks
3.5.3.3 Hàm Houghlines
Cú pháp
lines = houghlines(BW, theta, rho, peaks)
lines = houghlines(..., param1, val1, param2, val2) Mô tả
Hàm lines = houghlines(BW, theta, rho, peaks) trích xuất đoạn thẳng trong ảnh nhị phân BW dựa vào biến đổi Hough.
Hàm lines = houghlines(..., param1, val1, param2, val2) có xác định các cặp giá trị - tham số cụ thể:
Tham số Mô tả
’FillGap’ Giá trị thực dương xác định khoảng cách giữa hai đoạn thẳng liên quan đến biến đổi Hough. Khi khoảng cách giữa hai đoạn thẳng nhỏ hơn giá trị quy định, thì hàm houghlines sẽ kết hợp chúng thành một đoạn thẳng duy nhất. Giá trị mặc định là 20.
’MinLength’ Giá trị thực dương, xác định xem đoạn thẳng xác định được nên giữ hay bỏ đi. Đoạn thẳng ngắn nhỏ hơn giá trị quy định được bỏ đi. Giá trị mặc định là 40.
31 Ví dụ: I = imread('circuit.tif'); rotI = imrotate(I,33,'crop'); BW = edge(rotI,'canny'); [H,T,R] = hough(BW); imshow(H,[],'XData',T,'YData',R,... 'InitialMagnification','fit'); xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:)))); x = T(P(:,2)); y = R(P(:,1));
plot(x,y,'s','color','white'); % Find lines and plot them
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); figure, imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); % Plot beginnings and ends of lines
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); % Determine the endpoints of the longest line segment len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len) max_len = len; xy_long = xy; end
end
% highlight the longest line segment
32 Kết quả:
Hình 3. 10 Kết quả sử dụng Houghlines