Một phương trình đường thẳng có thể được biểu diễn bằng hai tham số chính đó là khoảng cách rho 𝜌 và góc theta 𝜃 (0 < 𝜃 <1800). Nếu muốn thử các đường thẳng mà mỗi đường chỉ lệch nhau 10 (đường 1 𝜃=00, đường 2 𝜃=10, đường 3 𝜃=20,…) thì ta sẽ có tới 180 đường thẳng có thể thử. Góc theta 𝜃 để mô tả một đường thẳng là chưa đủ, ta cần thêm giá trị khoảng cách rho 𝜌. Giá trị tối đa của khoảng cách rho 𝜌 chính bằng đường chéo của ảnh (diagonal_length), mà rho 𝜌 lại có thể mang giá trị âm, do đó khoảng cách rho 𝜌 có giá trị nằm trong đoạn từ [- diagonal_length, diagonal_length]. Để có thể đạt được kết quả tốt, ta thiết lập độ khít của rho 𝜌 = 1 pixel, khi đó tổng số giá trị rho 𝜌 có thể thử là 2 * int(diagonal_length/ 𝜌) + 1 (kể cả giá trị 0).
Hình 2. 28 Đường thẳng được xác định trong tọa độ cực
23
Khoa ĐT CLC – ĐHSPKT TP.HCM Từ đó, ta có thể xác định được ma trận thống
kê (khởi tạo các phần tử trong ma trận này có giá trị là 0) với kích thước: số trường hợp 𝜌 * số trường hợp 𝜃 (hình 2.29). Kích thước mảng càng lớn thì độ chính xác càng cao, thời gian tính toán vì thế cũng càng lâu. Tiếp theo, duyệt trên mỗi pixel cạnh xem có thể có bao nhiêu phương trình đường thẳng (xác định bởi cặp số (𝜌, 𝜃)) đi qua nó. Ý tưởng cho việc hiện thực là với mỗi pixel cạnh (x, y) ta tính giá trị rho 𝜌 tương ứng lần lượt
cho các giá trị theta 𝜃 (180 giá trị). Hình 2. 29 Mảng giá trị (𝜌, 𝜃)
Ví dụ, giả sử ta có 4000 pixel được cho là cạnh phát hiện bởi giải thuật Canny thì sẽ có 4000 cặp giá trị (x, y), mô tả chúng bằng ma trận A có kích thước [4000, 2]. Với mỗi cặp giá trị (x, y), ta thử 180 giá trị theta 𝜃 theo phương trình đường thẳng 𝜌 = x*cos𝜃 + y*sin𝜃 nhằm tìm ra 180 giá trị rho 𝜌. Để làm được điều này, ta dựng lên ma trận B có kích thước [2, 180] chứa cos𝜃 (dòng 1) và sin𝜃 (dòng 2) sau đó tính theo tích vô hướng nhằm thu được ma trận chứa các giá trị rho 𝜌 là C kích thước [4000, 180].
Ta chỉ cần duyệt mỗi phần tử trên ma trận C để “vote” vào ma trận thống kê bằng cách xác định dòng và cột phù hợp để +1 đơn vị. Giá trị rho 𝜌 nằm từ [-num_ 𝜌, num_ 𝜌] trong khi chỉ số các dòng của ma trận thống kê bắt đầu từ 0. Sau khi duyệt, để “vote” vào ma trận thống kê, ta lọc theo ngưỡng xác định trước để giữ lại các đường thẳng có trong ảnh và sẽ được các giá trị hàng và các giá trị cột. Từ các giá trị này, ta chuyển đổi về rho 𝜌 và theta 𝜃 (radian) để hàm cv2.line vẽ đúng đường thẳng.
24
Khoa ĐT CLC – ĐHSPKT TP.HCM