Hình 3.2: Sơ đồ khối phần tra cứu ảnh theo hình dạng
Ảnh mẫu đƣợc đọc vào cấu trúc DIB bằng hàm DisplayImage
Sử dụng thuật toán dò biên gián tiếp để phân vùng ảnh.
Thực hiện co/giãn (resample) để chuẩn hoá kích thƣớc (cả hai kích thƣớc đều là luỹ thừa của 2) trƣớc khi sao chép sang một ma trận số phức làm đầu vào của hàm biến đổi Fourier nhanh FFT.
Đọc ảnh mẫu Resample 256x256 FFT Tạo Véc tơ đặc trƣng Đọc ảnh từ cơ sở DL Resample 256x256 FFT Tạo Véc tơ đặc trƣng Tính k/c Euclide Thêm vào danh sách ở vị trí thích hợp Dò biên Dò biên
Hàm FFT trả lại một ma trận số phức.
Việc tạo véc tơ đặc trƣng của ảnh đƣợc thực hiện trên ma trận số phức này. Véc tơ đặc trƣng là một vector có 256 chiều.
Đọc từng ảnh trong cơ sở dữ liệu, thực hiện các bƣớc giống nhƣ với ảnh mẫu để đƣợc vector đặc trƣng của ảnh vừa đọc.
So sánh vector đặc trƣng của ảnh mẫu và ảnh đọc từ cơ sở dữ liệu bằng cách tính khoảng cách Euclide của 2 vector đặc trƣng bằng hàm
GetShapeDistance.
Thêm ảnh vừa đọc vào danh sách ảnh tìm thấy, ảnh có sai khác so với ảnh mẫu nhỏ hơn đƣợc xếp lên trên.
3.3.2.1. Đọc ảnh
Ảnh đƣợc đọc vào cấu trúc DIB và hiển thị bằng thủ tục DisplayImage, đầu vào là tên và đƣờng dẫn đến file cần đọc, nếu đọc ảnh thành công thủ tục DisplayImage hiển thị ảnh lên khung ảnh đƣợc chỉ định.
Việc thao tác với cấu trúc DIB đƣợc thực hiện thông qua cấu trúc DIBSection đã đƣợc định nghĩa trong thƣ viện GDI32 của Windows [14],[18].
3.3.2.2. Dò biên đối tƣợng ảnh
Phần dò biên đối tƣợng ảnh sử dụng thuật toán dò biên gián tiếp bằng cách xác định chu tuyến của đối tƣợng ảnh nhƣ đƣợc trình bày ở chƣơng 2.
3.3.2.3. Resample
Chúng ta đã biết là để thực hiện biến đổi Fourier nhanh thì kích thƣớc của dãy số đầu vào phải là luỹ thừa của 2. Tuy nhiên các ảnh cần đọc lại có số điểm ảnh khác nhau và thƣờng là không thoả mãn yêu cầu này, vì vậy thủ tục Resample phải thực hiện một phép nội suy để thêm/bớt điểm ảnh để đƣợc một ảnh mới có số điểm ảnh thoả mãn yêu cầu mà không làm thay đổi chất lƣợng ảnh. Các điểm ảnh đƣợc thêm vào theo nguyên tắc nội suy.
Màu và mật độ của các điểm ảnh nội suy đƣợc tính toán dựa trên giá trị của các điểm ảnh có sẵn ở trong ảnh.
Có nhiều cách để xây dựng thủ tục Resample, trong đó có 3 phƣơng pháp thông dụng nhất:
Nearest Neighbor: điểm ảnh mới đƣợc sinh ra dựa vào thông tin của các điểm ảnh ở một phía của điểm ảnh mới, đây là phƣơng pháp resample nhanh nhất nhƣng độ chính xác thấp nhất (trong 3 phƣơng pháp).
Bilinear: lấy thông tin từ những điểm ảnh phía trên và bên cạnh điểm ảnh mới. Chất lƣợng ảnh mới tốt hơn so với phƣơng pháp Nearest Neighbor.
Bicubic: Là phƣơng pháp chính xác nhất vì thông tin về điểm ảnh mới đƣợc suy ra từ 8 điểm ảnh xung quanh.
Trong chƣơng trình này chúng tôi sử dụng phƣơng pháp đơn giản nhất Nearest Neighbor. Kích thƣớc mảng dữ liệu đầu ra là 256×256 phần tử.
3.3.2.4. Biến đổi Fourier nhanh
Hàm biến đổi FFT đƣợc cải tiến từ chƣơng trình của Randy Crane liệt kê trong cuốn "A Simplified Approach to Image Processing" [4].
Đầu vào là một ma trận số phức 2 chiều đƣợc sinh ra từ ma trận điểm ảnh đã đọc bằng cách gán phần ảo của tất cả các số phức bằng 0, phần thực đƣợc gán bằng giá trị của điểm ảnh.
Đầu ra là ma trận số phức hai chiều biểu diễn khai triển Fourier của ma trận đầu vào.
Trong hàm FFT 2 chiều (hàm twoD_FFT() ), từng hàng của ma trận đầu vào đƣợc biến đổi Fourier bằng hàm biến đổi 1chiều (hàm oneD_FFT() ), sau đó mới tính FFT 1 chiều cho các cột.
Hai hàm cơ sở để xây dựng oneD_FFT là Scramble() và Butterflies(). Trong đó Scramble() sử dụng để sắp xếp lại dãy đầu vào theo thứ tự đảo bit, còn hàm Butterflies() là thuật toán cơ sở, đƣợc gọi đệ qui để tính FFT.
3.2.2.5. Tạo véc tơ đặc trƣng hình dạng cho ảnh
Véc tơ đặc trƣng của ảnh là một vector 256 chiều, chứa 256 giá trị số double. double* m_Signature;
m_Signature = new double[256]; Hàm sinh chữ ký GenerateSignature():
Đầu vào: Ma trận vuông kích thƣớc 256x256 các số phức (sinh ra do hàm biến đổi FFT 2 chiều twoD_FFT()) biểu diễn ảnh trong miền tần số.
Đầu ra: vector chữ ký 256 chiều hay là một mảng 256 số double là signature của ảnh.
Thuật toán:
Tính modul (magnitude) của từng phần tử trong mảng hai chiều 256x256 phần tử theo công thức: 2 2 ) , Im( ) , Re( ) , (i j i j i j Magnitude
trong đó: Magnitude(i,j) là modul của số phức tại vị trí hàng i, cột j của ma trận, Re(i,j) là phần thực của số phức tại vị trí hàng i và cột j, Im(i,j) là phần ảo của số phức tại vị trí hàng i, cột j.
Chia ảnh đầu vào thành những khối kích thƣớc 16x16. Khởi tạo mảng image_Signature[] gồm 256 phần tử Tính signature cho từng khối theo công thức:
15 0 15 0 ) ( ), ( _ i j j iBlockCol i iBlockRow Mag Signature block
Trong đó: block_Signature là giá trị signature của khối, iBlockRow (0 - 255) là chỉ số hàng của phần tử đầu tiên trong khối, iBlockCol (0 - 255) là chỉ số cột của phần tử đầu tiên của khối, i là chỉ hàng của phần tử trong khối (i = 0,...,15) , j là chỉ số cột của phần tử trong khối (j = 0,...,15). Mag[i,j] là modul của số phức tại vị trí hàng i, cột j của ma trận đầu vào.
Lƣu chữ ký block_Signature đƣợc lƣu vào mảng image_Signature[];
Sau khi tính xong signature cho cả 256 khối, tiến hành chuẩn hóa mảng image_Signature[].
3.3.2.6. So sánh ảnh bằng cách tính khoảng cách Euclide
Khoảng cách giữa ảnh Query_Image và ảnh Found_Image đƣợc định nghĩa là khoảng cách Euclide giữa hai chữ ký query_Signature[] và found_Signature[] theo công thức: 255 0 2 ]) [ _ ] [ _ ( i i Signature query i Signature found diff