áp dụng cấu trúc dữ liệu cây nhị phân trên không gian hai chiều và thuật toán tìm kiếm láng giềng gần nhất để đọc ảnh có kích thước lớn
Trang 1TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA TOÁN – TIN HỌC
BÁO CÁO ĐỀ TÀI CẤU TRÚC DỮ LIỆU
Nguyễn Hoàng Quốc 0811300 Giáo viên hướng dẫn TS Phạm Thế Bảo
Trang 2
ÁP DỤNG CẤU TRÚC DỮ LIỆU CÂY NHỊ PHÂN TRÊN KHÔNG GIAN HAI CHIỀU VÀ THUẬT TOÁN TÌM KIẾM LÁNG GIỀNG GẦN
NHẤT ĐỂ ĐỌC ẢNH CÓ KÍCH THƯỚC LỚN
1 Giới thiệu
Việc đọc ảnh kích thước là một nhu cầu thiết yếu trong nhiều ngành khoa học và đời sống hiện nay Tuy nhiên ta thường gặp nhiều khó khăn trong việc đọc trực tiếp những bức ảnh kích thước lớn Ảnh vệ tinh là một ví dụ Ta biết rằng ảnh chụp của một vệ tinh về một phần nào đó của một hành tinh hoặc vũ trụ đều là những ảnh có kích thước rất lớn Những ảnh này được truyền về mặt đất sau khi chụp và yêu cầu đầu tiên đặt ra cho những người tiếp nhận là làm sao đọc được nó Tất nhiên việc đọc trực tiếp là không thể, vì bộ nhớ của máy có giới hạn rất nhỏ so với kích thước ảnh Một ví dụ khác trong xử lý ảnh lớn là các ứng dụng bản đồ trên mạng (như diadiem.com, googleearth [1]), việc lưu trữ và đọc trực tiếp những bức ảnh bản đồ lớn bao quát một phần diện tích lớn trên mạng là điều khó khả thi
Trang 3Hình 1 Bản đồ trên mạng tại trang web www.diadiem.com
Bởi cách đọc trực tiếp gặp nhiều khó khăn, nên yêu cầu phải xây dựng một cấu trúc dữ liệu (CTDL) đọc ảnh kích thước lớn đã được đặt ra Đối với một bức ảnh lớn, thường thì người ta chỉ quan tâm một vùng nào đó trong ảnh, theo đó một
tư tưởng phổ biến trong việc xây dựng CTDL là cắt ảnh thành nhiều ảnh nhỏ hơn,
tổ chức lưu trữ chúng và khi cần xử lý ta sẽ chỉ lấy những bức ảnh thuộc vùng cần quan tâm lên để xử lý
Trong bài báo cáo này, chúng tôi sẽ trình bày về CTDL cây nhị phân trên không gian hai chiều (kd-tree in two dimentions) để lưu trữ hình ảnh và dùng thuật toán tìm láng giềng gần nhất (Nearest neighbor search) để truy cập tới những bức ảnh thuộc vùng cần quan tâm Các thuật toán sẽ được trình bày chi tiết ở dưới Phần đánh giá kết quả chúng tôi sẽ chạy chương trình minh họa thuật toán trên một bức ảnh 10Mb
2 Ý tưởng chung
Ảnh lớn ban đầu sẽ được cắt thành các ảnh hình vuông nhỏ có kích thước bằng nhau Mỗi ảnh nhỏ đó gọi là một ảnh đơn vị Tiếp đó, ta đánh dấu tọa độ của các ô vuông nhỏ đó trong bức ảnh lớn Như vậy là ta đã tiến hành cắt nhỏ tấm ảnh ban đầu
Sau khi chia nhỏ ảnh, ta sẽ xây dựng một CTDL để lưu trữ ảnh CTDL
chúng tôi chọn là CTDL cây nhị phân trên không gian 2 chiều Mỗi đỉnh trên cây
sẽ tương ứng tọa độ một tấm ảnh đơn vị Về chi tiết xây dựng cây chúng tôi sẽ trình bày kỹ ở phần dưới
Tiếp đó, chúng tôi sẽ tạo một khung nhìn gồm n2 ô vuông nhỏ (gọi là ô
vuông đơn vị) Mỗi ô vuông đơn vị sẽ tương ứng với một tấm ảnh đơn vị Khung nhìn có thể lớn hay nhỏ tùy theo việc chọn n Khi ta cần xử lý một vùng nào đó của ảnh lớn, ta chỉ việc tải n2
tấm ảnh đơn vị thuộc lân cận vùng cần xét lên khung nhìn
để xử lý
Trong chương trình minh họa, để đơn giản, chúng tôi chọn khung nhìn 32
ô như ở hình 2 Khi muốn xét một tọa độ nào đó trong ảnh lớn, ta sẽ phân tích tọa độ
đó thuộc ảnh đơn vị nào và tải ảnh đó củng 8 ảnh xung quanh lên khung nhìn để xử
lý Việc tìm tọa độ thuộc ảnh đơn vị nào sẽ được thực hiện bằng thuật toán tìm kiếm láng giềng gần nhất
Trang 4Hình 2 Khung nhìn để đọc ảnh
Sau khi tải ảnh lên, ta sẽ có một tấm ảnh ban đầu Trong khung nhìn sẽ có một số tọa độ cố định (chấm màu xanh trong hình 2) để làm chuẩn và một con trỏ đặt ở một vị trì mặc định nào đó, trong trường hợp này con trỏ đặt ở tâm khung nhìn Con trỏ này tượng trưng cho tọa độ trong ảnh lớn mà ta muốn quan sát Khi
ta muốn di chuyển khung nhình tới các vùng khác của ảnh (có 4 thao tác di chuyển khung nhìn: di chuyển lên, di chuyển xuống,di chuyển sang trái, di chuyển sang phải), ta chỉ việc thay đổi lại tọa độ con trỏ và tải lại các ảnh tương ứng với con trỏ mới lên khung nhìn
3 Xây dựng cây nhị phân trên không gian hai chiều
3.1 Giới thiệu về cây nhị phân trên không gian k chiều
Cây nhị phân trên không gian k chiều [2],[4] (kd tree hay k-dimentions tree)
là một cấu trúc dữ liệu phân hoạch không gian k chiều Theo đó, mỗi đỉnh của cây
sẽ chia không gian thành hai phần bằng một siêu phẳng k-1 chiều xác định bởi tọa
độ của đỉnh đó và một chiều nào đó trong k chiều Các chiều dùng để chia thay đổi tuần tự theo từng cấp của cây
Về bản chất đây là một cây nhị phân (vì mỗi đỉnh của cây sẽ có tối đa 2 nhánh con tương ứng với hai vùng không gian được chia) Điểm đặc biệt ở đây là các đỉnh của cây là những điểm phân chia không gian thành nhiều phần Việc phân chia không gian như vậy sẽ thuận tiện cho ta trong việc tìm kiếm những điểm trong cây gần với một điểm nào đó trong vùng không gian nhất Tức là khi muốn tìm
Trang 5những điểm thuộc cây gần với một điểm nào đó trong không gian ta sẽ dựa trên một số phép phân hoạch không gian để loại bỏ các vùng không gian không cần thiết, như vậy sẽ giúp thu hẹp được không gian tìm kiếm
Để minh họa rõ hơn cho các ý nói ở trên, chúng ta sẽ xét ví dụ với một cây nhị phân trong không gian hai chiều ở dưới đây Cây nhị phân trên không gian hai chiều là một trường hợp của cây nhị phân trên không gian k chiều với k có giá trị là
2
Trong không gian hai chiều, cho tập hợp các điểm sau: {(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)}
Hình ảnh của chúng
trong không gian
được mô tả như hình
bên
Đầu tiên, chúng ta sẽ
phân hoạch không
gian theo chiều x Ta
chọn (7,2) làm nút ở
cây và chia không
gian thành hai phần,
một phần có tọa độ x
nhỏ hơn 7, phần còn
lại có tọa độ không
nhỏ hơn 7
Tiếp đó, đối với hai
nhánh con của cây,
ta sẽ thực hiện phân
hoạch theo y Nhánh
bên trái lấy (5,4) làm
nút, nhánh bên phải
lấy (9,6) làm nút
Trang 6Cứ tiếp tục chia như
thể với x, y lần lượt
đổi vị trí cho nhau
đến khi không còn
chia được nữa, ta sẽ
thu được cây Khi
đó, các nút lá là các
điểm cô lập thuộc
một vùng không gian
nào đó
Với không gian đã phân hoạch như trên, giả sử, để tìm kiếm một điểm trong cây gần với một điểm trong không gian nhất, ta dùng một số phép toán để phân hoạch loại bỏ những vùng không gian không cần thiết Ví dụ, ta sẽ xét một hình cầu tâm là điểm trong không gian, bán kính là một khoảng cách từ điểm đó đến một đỉnh nào đó của đồ thị Khi đó, ta chỉ cần tìm kiếm những điểm trên các vùng không gian giao với hình tròn đó mà thôi Trong quá trình tìm kiếm, nếu gặp điểm
có khoảng cách tốt hơn, thì bán kính của hình cầu sẽ giảm, hình cầu co lại, các không gian giao với hình cầu sẽ giảm như vậy không gian tìm kiếm sẽ ngày càng hẹp lại
Ở hình 3, ta thầy hình tròn chỉ giao hai không gian màu xanh, không giao các không gian màu nâu nên ta chỉ việc tìm kiếm trên các không gian màu xanh mà không cần tìm ở không gian màu nâu
Hình 3 Minh họa đặc trưng tìm kiếm trên không gian của kd tree
Cây nhị phân nhiều chiếu giúp ta có thể lưu trữ ảnh theo các lớp Theo đó, ta
có thể tổ chức dữ liệu ở nhiều lớp khác nhau phục vụ cho nhiều mục đích, ví dụ một lớp là ảnh đơn vị lớn, một lớp chứa ảnh đơn vị nhỏ hơn (phục vụ cho thao tác
Trang 7phóng to, thu nhỏ ảnh) Do trong khuôn khổ của một đề tài môn học, chúng tôi chỉ xây dựng cấu trúc dữ liệu đọc ảnh nên chỉ sử dụng cây nhị phân trên không gian 2 chiều Tức là chỉ lưu trữ một lớp ảnh để tải ảnh lên để quan sát
3.2 Các phép toán
Vì cây nhị phân trên không gian hai chiều bản chất là một cây nên nó cũng
có các thao tác tương tự đối với cây như khởi tạo cây, thêm đỉnh, xóa đỉnh, duyệt cây Điểm khác là mỗi đỉnh lưu trữ một tọa độ trên không gian hai chiều nên ta phải lưu lại một giá trị chỉ chiều của đỉnh Ở phần này, chúng tôi chỉ trình bày một
số thao tác mà chúng tôi có sử dụng, các thao tác khác có thể xây dựng dễ dàng tương tự như ở cây nhị phân thông thường
3.2.1 Thêm một đỉnh vào cây
Việc thêm một đỉnh vào cây đơn giản giống như ở cây nhị phân tìm kiếm, nhưng ở đây ta thêm một ràng buộc là những đỉnh ở mức chẵn của thì ta sẽ so sánh theo y, những đỉnh ở mức lẻ của cây thì ta sẽ so sánh theo x Ví dụ, với một đỉnh (a,b) ở mức 3 thì nhánh con trái của nó sẽ chứa các đỉnh có hoành độ x nhỏ hơn a,
và nhánh con phải của nó sẽ chứa các đỉnh có hoành độ x không nhỏ hơn a
3.2.2 Tạo cây
Để có được cây nhị phân trong không gian hai chiều ta lần lượt thêm các đỉnh vào cây Nhưng việc thêm lần lượt hoặc bất kỳ các đỉnh vào cây dẫn tới một việc là cây sẽ bị mất tính chất cân bằng dẫn đến việc truy xuất dữ liệu, điển hình là hành vi tìm làng giềng gần nhất sẽ tốn một chi phí cao hơn và tính chất hiệu quả của cây bị giảm đi
Vì vậy người ta đề xuất phương pháp chọn trung vị để thêm lần lượt vào cây
để đảm bảo tính cân bằng của cây Trung vị là điểm có vị trí sao cho có thể chia cây thành hai phần có số đỉnh chênh lệch thấp nhất
Để rõ hơn, ta sẽ xét bộ dữ liệu sau {(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)} Đầu tiên, ta sắp xếp theo x: {(2,3), (4,7), (5,4), (7,2), (8,1), (9,6)}, sau đó ta phân chia tập hợp hành hai nhánh, lấy phần tử (7,2) làm gốc Vì chọn (7,2) sẽ làm cho 2 nhánh con có độ chênh lệch ít nhất
Trang 8Để ý thấy những điểm có x lớn hơn 7 sẽ được xếp bên phải, những điểm có giá trị x nhỏ hơn 7 sẽ được xếp bên trái Ta chon ra những phần tử là trung vị của mỗi phần để thêm vào cây, trường hợp ví dụ này thì trung vị của nhánh trái sẽ là (5,4) và trung vị của nhánh phải sẽ là (9,6)
Sau đó, lặp lại tương tự với mỗi nhánh với vai trò của x và y lần lượt thay đổi cho nhau và tiếp tục lấy các trung vị
Số lượng các đỉnh được chèn vào sẽ tăng theo dãy số cộng lũy thừa sau: Added_Đỉnh= 20+21+22+…+2k
với k là số bước lập Tiếp tục như thế cho đến khi cây được xây dựng xong
3.2.3 Cấu trúc lưu trữ cây
Để lưu trữ cây, chúng tôi xây dựng cấu trúc tại mỗi đỉnh như hình dưới: Trong đó, data là dữ liệu lưu trữ tọa độ của mỗi node, axis miêu tả vùng không gian của toàn bộ các node là node con của node đó, level miêu tả mức của node trong cây
Trang 9struct area {
int xmax,ymax,xmin,ymin;
};
struct location{
int x,y;
};
struct Node {
location Data;
area axis;
int level;
Node *Left;
Node *Right;
} ; struct KDTree {
Node *Root;
};
3.3 Dùng cây nhị phân trên không gian hai chiều để lưu trữ ảnh
Từ những ảnh đơn vị, ta tiến hành dùng phép toán tạo cây để lần lượt thêm các ảnh đơn vị vào cây Mội đỉnh của cây sẽ chứa tọa độ và con trỏ trỏ đến địa chỉ của ảnh đơn vị tương ứng
Do đối với một ảnh lớn sẽ có rất nhiều ảnh đơn vị nên việc xây dựng cây sẽ tốn khá nhiều thời gian Tuy nhiên đây chỉ là bước chuẩn bị nên thời gian có thể không cần quan tâm lắm Việc cần quan tâm là làm sao để truy cập nhanh đến những vùng ảnh mà ta quan tâm Chúng ta sẽ dùng thuật tóa tìm kiếm láng giềng gần nhất để thực hiện công việc đó
4 Thuật toán tìm kiếm láng giềng gần nhất
Đối với cây nhị phân k chiều, ta cần quan tâm tới việc với một điểm trong không gian (điểm tìm kiếm) thì node nào trong cây có khoảng cách tới nó là gần nhất Thuật toán tìm láng giềng gần nhất sẽ được sử dụng để giải quyết vấn đề này Thuật toán sẽ có hiệu quả nhanh chóng bằng cách sử dụng tính chất của cây để loại
bỏ phần lớn không gian tìm kiếm
Thuật toán được chúng tôi tham khảo tại [3], [4] và được sử dụng như sau :
Trang 10Bước 1: Bắt đầu từ node gốc, thuật toán sẽ xét hai nhánh con của node gốc,
sau đó so sánh khoảng cách 2 node con đến điểm cần tìm láng giềng, thuật toán sẽ duyệt xuống node nào có khoảng cách tới điểm cần tìm gần hơn
Trong quá trình tìm xét tới một node nào đó, thuật toán sẽ so sánh độ dài từ điểm tỉm kiếm đến node đó Nếu độ dài này là nhỏ nhất tới thời điểm hiện tại thì sẽ cập nhất lưu node đó thành điểm gần nhất tạm thời
Bước 2: Thực hiện bước 1 cho tới khi gặp một node lá thì dừng lại Khi đó
ta sẽ có một điểm gần nhất ứng với toàn bộ phần đã duyệt
Bước 3: Thự hiện dò ngược lại cây(bung đệ quy với các node còn lại được
so sánh khoảng cách lớn hơn) với các bước sau :
1 Nếu node đang xét có khoảng cách tới điểm tìm kiểm là nhỏ nhất hiện tại thì cập nhật nó là điểm gần nhất
2 Thuật toán sẽ tìm kiếm trong các phần còn lại của không gian bị chia cắt (các nhánh còn lại của cây) có node nào của cây có khoảng cách tới điểm đang xét là gần nhất hiện thời hay không Thực hiện bằng cách xét quả cầu có tâm
là điểm tìm kiếm, bán kính là khoảng cách gần nhất hiện thời xem nó có giao với các không gian bị chia cắt nào không rồi tiến hành so sánh với các điểm trong miền không gian đó
1 Đối với mỗi mặt phẳng giao với quả cầu, ta thực hiện duyệt phần nhánh con tương ứng với mặt phẳng đó
2 Đối với các nhánh không cắt quả cầu, thuật toán sẽ bỏ qua nhánh đó
Bước 4: khi quá trình duyệt quay trở về node gốc, thuật toán kết thúc
Mở rộng: tìm N điểm gần nhất
Trong trường hợp muốn tìm N node gần điểm tìm kiếm nhất, chúng ta có nhiều cách dựa trên thuật toán tìm láng giềng gần nhất đã được trình bày phía trên,
ở đây chúng tôi đề xuất cải tiến thuật toán như sau: Trong quá trình tìm kiếm, khi
đã tìm được láng giềng gần nhất ta tiến hành bung độ lớn của bán kính vòng tròn
để tìm và đánh dấu những điểm được cho là gần nhất tiếp theo điểm đã tìm được
Trang 11Để cho rõ hơn, chúng ta hãy quan sát minh họa ở hình 4 Quan sát hình 4.1, đây là quá trình thực hiện bước 1 và 2 của thuật toán Điểm màu xanh là điểm trong không gian mà chúng ta đang xét, các điểm còn lại là các điểm của cây Quan sát theo chiều từ trái sang phải, từ trên xuống dưới Thuật toán thực hiện theo mỗi bước sẽ chọn một vùng không gian thuộc một trong hai nhánh của cây để xét Ta thấy cứ sau mỗi bước vùng không gian tìm kiếm được giảm đi một nửa Không gian cứ giảm như thế cho đến khi không giảm được nữa (gặp nốt lá) Trường hợp ở hình 4.1, không gian sau cùng chỉ gồm 2 đỉnh Khi đó ta sẽ tìm trong không gian
đó một đỉnh gần với đỉnh cần xét nhất (đỉnh màu đỏ) Nhưng đỉnh tìm được đó chưa chắc là đỉnh gần nhất vì trong quá tình tìm kiếm ta đã loại bỏ khá nhiều
không gian Bởi vậy ta phải tìm kiếm trong những vùng không gian đã bị loại bỏ
có điểm nào tốt hơn không Tuy nhiên, để tránh việc tìm hết tất cả các vùng không gian, ta chỉ tìm ở những vùng không gian giao với hình tròn tâm là điểm tìm đang xét, bán kính là khoảng cách giữa điểm đó với đỉnh trong đồ thị mà ta vừa tìm được (hình tròn màu xanh hình dưới) Theo đó, ta tiến hành bước ba như trong hình 4.2
Trang 12Hình 4.1 Minh họa bước 1,2 thuật toán tìm kiếm láng giềng gấn nhất
Ở hình 4.2, ta thấy thuật toán bắt đầu duyệt lại các nhánh đã bỏ đi, ta thấy ở đây những điểm thuộc vùng không gian nào giao với hình tròn sẽ được biểu thị bằng màu đỏ Thuật toán chỉ tìm kiếm trên những điểm đó để phát hiện ra những điểm tối ưu Quan sát theo quá trình thực hiện ta thấy các điểm tối ưu sẽ được cập nhật mới và vòng tròn sẽ ngày càng nhỏ hơn Đối với những vùng không gian không giao với hình tròn, chúng ta sẽ bỏ qua luôn mà không xét tới (vùng tô màu xanh) Ta thấy ở hình cuối cùng, vùng màu xanh rất lớn trong khi những điểm màu
đỏ rất ít tức là ta đã thu hẹp không gian tìm kiếm rất nhiều