Transform
Thuật toán Hough Transform cơ bản [3] :
Xét trường hợp cần nhận dạng các đường thẳng bất kỳ trong một ảnh nhị phân (với các hình ảnh trên hình được quy định có màu đen):
- Ta biết rằng với mỗi điểm đen bất kỳ trong không gian ảnh sẽ có vô số các đường thẳng đi qua điểm đó.
- Ta lại biết rằng mọi đường thẳng đều có thể biểu diễn được bằng phương trình sau:
y = mx + b
với m và b là 2 số thực bất kỳ, trong đó m xác định góc của đường thẳng so với trục hoành và b xác định vị trí đường thẳng cắt với trục tung.
Do đó, với một cặp điểm đen (x1,y1) xác định bất kỳ, ta sẽ có thể tìm ra được vô số cặp (m,b) ứng với các đường thẳng có thể đi qua điểm (x1,y1) đó, sao cho m và b thoả điều kiện sau:
b = y1 – mx1
Thuật toán Hough Transform cơ bản được thực hiện dựa trên ý tưởng như sau:
Mỗi cặp điểm (x,y) trong ảnh sẽ xác định trong không gian (m,b) một đường thẳng duy nhất tương ứng với cặp điểm (x,y) đó. Đường thẳng này giúp xác định các cặp điểm (m,b) mà giá trị của chúng giúp tạo nên các đường thẳng trong ảnh mà đi qua được cặp điểm (x,y). Với nhiều cặp điểm (x,y) sẽ xác định nhiều đường thẳng tương ứng trong không gian (m,b). Như vậy, trong không gian (m,b), nếu tại điểm (m,b) nào mà có số đường thẳng đi qua vị trí đó trong không gian (m,b) lớn hơn một giá trị cụ thể (tuỳ theo quy định chiều dài của đường thẳng lớn hơn bao nhiêu thì là được cho là đường thẳng), thì cặp giá trị (m,b) của điểm đó chính là 2 giá trị xác định nên một trong những đường thẳng cần được tìm thấy trong ảnh.
Cho mảng 2 chiều (m,b). Giá trị tại một vị trí trong mảng cho biết số lần đường thẳng được tạo bởi cặp giá trị (m,b) tương ứng với vị trí đó xuất hiện trong ảnh.
B1: quét qua tất cả các điểm cần xét trong ảnh.
B2: với mỗi điểm được xét, ta sẽ tính các cặp giá trị (m,b) thoả các đừơng thẳng đi qua điểm đó. Từ đó, ta tăng giá trị tại các vị trí (m,b) tương ứng trong mảng 2 chiều mô tả không gian (m,b) đó lên 1 đơn vị.
B3: sau đó xét tất cả các phần tử trong mảng 2 chiều mô tả không gian (m,b) đó, nếu tại phần tử nào mà có giá trị lớn hơn chiều dài quy định cần thiết để tạo nên một đường thẳng thì ta sẽ nhận dạng được một đường thẳng y = mx + b trong đó m,b xác định nhờ vào vị trí của phần tử đó.
Cải tiến cho thuật toán Hough Transform cơ bản áp dụng cho việc nhận dạng các đường thẳng:
Trong phần trên, ta thấy m, b trong công thức b = y – mx không bị giới hạn. Điều này có nghĩa rằng, khi m đến lên vô cực thì b cũng tương ứng đến vô cực. Do đó, việc sử dụng mảng 2 chiều (là có giới hạn) để mô tả không gian (m,b) (không có giới hạn), điều này là không tưởng trong việc lập trình. Ngoài ra, theo quy định, chỉ số của mảng không được âm.
Do đó, ta cần một công thức thay thế cho công thức biễu diễn đường thẳng: y = mx + b
sao cho việc xác định các tham số (như m và b chẳng hạn) nằm trong một khoảng giới hạn xác định.
Và công thức đó là:
Hình 2-15
trong đó:
- A là số độ của góc đuợc tạo bởi đường thẳng và trục hoành, giá trị kiểu số thực.
- B là khoảng cách từ đường thẳng đó đến gốc toạ độ (áp dụng trong đề tài là góc trên trái của ảnh), kiểu số thực.
Công thức này cũng có thể biễu diễn mọi đường thẳng bất kỳ trong không gian 2 chiều như công thức y = mx + b nhưng 2 tham số A và B của nó có giới hạn trong ảnh 2 chiều:
- A nằm trong khoảng từ -89 độ -> 90 độ.
- Vì thuật toán được áp dụng cho ảnh 2 chiều, nên B được giới hạn từ 0 -> chiều dài đường chéo của ảnh.
Để dùng mảng 2 chiều mô tả không gian (A,B) tương tự như không gian (m,b), bắt buộc A và B phải đựơc làm tròn đến một đơn vị nào đó, dẫn đến sai số trong việc xác định chính xác đường thẳng. Tuỳ theo độ chính xác đựơc yêu cầu mà A sẽ đựơc tính làm tròn tới 1 đơn vị hay nữa đơn vị, thậm chí thấp hơn nữa.
Ví dụ, đối với đường thẳng mà tham số A chỉ cần chính xác ở 1 đơn vị, thì mảng 2 chiều ta cần tạo sẽ có chiều dài chiều A là 180. Nhưng nếu tham số A cần chính xác đến nữa đơn vị (0,5) thì mảng 2 chiều cần tạo sẽ phải có chiều dài là 180/0,5=360. Tương tự, với độ chính xác n thì chiều dài chiều A sẽ là 180/n.
Ngoài ra, do mảng có chỉ số không được âm, nên thay vì A có giá trị từ -89 đến 90 độ, ta chuyển sang giá trị tương ứng từ 0 -> 179 (với 0 thực chất tương ứng cho -89, 90 tương ứng cho 179...)
Như vậy, ta sẽ áp dụng thuật toán Hough Transform để nhận dạng đường thẳng tương tự như phần đã trình bày ở trên, chỉ thay công thức:
y = mx + b bằng
x*cosA + y*sinA = B
cũng như thay các tham số m, b bằng A và B.
Ví dụ minh họa:
Hình 2-16
Hình 2-17
Trong không gian (A,B), tập hợp các đường thẳng đi qua mỗi điểm sẽ hình thành nên một đường hình sin tương ứng.
Hình 2-18
Ta thấy, giao điểm có tên là dòng 1 chính là giao điểm của 3 đường sin của 3 điểm 1, 3, 5. Cho nên, giao điểm dòng 1 chính là nơi mang giá trị cặp (A,B) hình thành nên đường thẳng đi qua 3 điểm 1, 3 và 5 trong không gian (x,y).
Tương tự, giao điểm tên dòng 2 chính là nơi mang cặp giá trị (A,B) tạo nên đường thẳng đi qua 3 điểm 2, 3, 4 trong không gian (x,y).
Áp dụng cho đề tài, ý nghĩa:
Thuật toán Hough Transform trong đề tài được áp dụng cho các vùng ảnh trích ra từ bốn góc của bài thi (bốn vùng ảnh này được lấy ra bằng thuật toán cắt ảnh - crop). Thuật toán giúp nhận dạng 4 vị trí đánh dấu ở 4 góc của bài thi, từ đó xác định vùng chấm thi phù hợp với mẫu chấm thi.