Luận văn Đếm số đối tượng trên Video dùng FPGA

Luận văn : Kiểm soát đối tượng trên Video dùng FPGA Hệ thống Nhúng đã và đang phát triển rất nhanh tạo ra vô số thành tựu có mặt trong rất nhiều các thiết bị ở ngay cạnh chúng ta hằng ngày phục vụ đời sống con người. Trước kia việc nghiên cứu và phát triển Hệ thống Nhúng cần phải đầu tư rất nhiều và không phải là sân chơi cho các nghiên cứu có ít tiền. Đơn giản bởi muốn tạo ta một Chip cần thông qua nhiều bước chỉnh sửa, rút kinh nghiệm, mỗi lần phải chế tạo thực tế rồi kiểm tra, gặp sai sót lại sửa, dần dần mới hoàn chình, chi phí cho việc này không hề nhỏ. Tuy nhiên FPGA ( Field-Programmable Gate Array ) ra đời tạo một bước phát triển nhảy vọt. Việc cấu hình thử nghiệm trở nên đơn giản hơn rất nhiều, công đoạn nghiên cứu dễ dàng hơn . Hệ thống Nhúng đã và đang phát triển rất nhanh tạo ra vô số thành tựu có mặt trong rất nhiều các thiết bị ở ngay cạnh chúng ta hằng ngày phục vụ đời sống con người. Trước kia việc nghiên cứu và phát triển Hệ thống Nhúng cần phải đầu tư rất nhiều và không phải là sân chơi cho các nghiên cứu có ít tiền. Đơn giản bởi muốn tạo ta một Chip cần thông qua nhiều bước chỉnh sửa, rút kinh nghiệm, mỗi lần phải chế tạo thực tế rồi kiểm tra, gặp sai sót lại sửa, dần dần mới hoàn chình, chi phí cho việc này không hề nhỏ. Tuy nhiên FPGA ( Field-Programmable Gate Array ) ra đời tạo một bước phát triển nhảy vọt. Việc cấu hình thử nghiệm trở nên đơn giản hơn rất nhiều, công đoạn nghiên cứu dễ dàng hơn. Do đó, chúng em đã quyết định thực hiện một ứng dụng trên FPGA, cụ thể là xử lý ảnh dùng board Xilinx ML402. Các môn học về VGA, xử lý ảnh, giao tiếp máy tính . đã tạo nên nền tảng kiến thức cơ bản giúp phát triển nhiều ứng dụng phong phú. Dẫu vậy cũng vẫn là chưa đủ cho một hệ thống hoàn chỉnh thực tế, nên chúng em chỉ thực hiện một công đoạn khá quan trọng trong quá trình xử lý ảnh là xác định các đối tượng trong ảnh. Mục đích của đề tài là xác định, nhận ra các đối tượng trong khung ảnh đồng thời phải đảm bảo thời gian thực. Khi đó, công đoạn này mới có thể đưa vào trong một hệ thống hoàn chỉnh nhận dạng ra một đối tượng cụ thể mong muốn. Sau khi xác định, ta có được các thông số quan trọng về các đối tượng, nhằm thể hiện điều đó, đề tài sẽ đếm số vật thể trong ảnh, hiển thị trên màn hình monitor. Khái niệm xử lý ảnh ngày nay không còn xa lạ với nhiều người vì tính đa dụng và những thuận lợi mà nó mang lại. Chỉ với một chiếc WebCam, người ta có thể đăng nhập vào máy tính của mình mà không cần gõ user name và password. Một nhân viên cảnh sát có thể biết danh tín tên tội phạm qua dấu vân tay để lại chỉ trong tích tắc mà không phải cậm cụi dò từng dấu vân tay và nhiều ứng dụng khác mà xử lý ảnh mang lại : nhận dạng khuôn mặt, chữ viết, vật thể Dù đã cố gắng hết sức nhưng cũng khó tránh khỏi sai sót trong đề tài, chúng em rất mong nhận được các ý kiến đóng góp của thầy cô nhằm rút kinh nghiệm, bổ sung kiến thức và phát triển đề tài nếu như có thể.

doc63 trang | Chia sẻ: maiphuongtl | Lượt xem: 3498 | Lượt tải: 5download
Bạn đang xem trước 20 trang tài liệu Luận văn Đếm số đối tượng trên Video dùng FPGA, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
trong đó x,y là hai biến không gian, t là biến thời gian và λ là bước sóng. Hàm c(x,y,t, λ) được gọi là thông lượng bức xạ trên ( diện tích x bước sóng) hoặc lượng bức xạ trên bước sóng. Bước sóng λ liên quan với tần số f được tính theo công thức λ = c/f c là vận tốc của sóng điện từ, khoảng 3.108m/s trong chân không và không khí.Ánh sáng khác với các sóng điện từ khác ở chỗ mắt thường có thể nhận biết được nó. Mắt nhạy cảm với những sóng điện từ trong một dải cực hẹp của λ, đó là khoảng từ 350nm đến 750 nm Hình 2.1 : Dãy sóng điên từ 2.2 Màu sắc 2.2.1 Hệ màu Ta có hai hệ màu cơ bản là hệ màu cộng và hệ màu trừ. Khi tổ hợp hai ánh sáng c1(λ) va2 c2(λ), ánh sáng nhận được là c(λ) được tính theo: c(λ) = c1(λ) + c2(λ) Khi ánh sáng cộng vào nhau như ở công thức trên ta được hệ màu cộng ( additive color system). Đem cộng nhiều nguồn sáng với những bước sóng khác nhau ta sẽ tạo ra được nhiều màu khác nhau. Ví dụ màn đèn hình tivi màu được phủ với những chấm photpho rực rỡ xếp thành từng cụm 3 màu. Mỗi nhóm gồm một điểm màu đỏ, một điểm màu lục và một điềm màu lam. Người ta sử dụng 3 màu đó là vì khi tổ hợp một cách thích hợp chúng tạo ra môt dãy màu rộng hơn mọi tổ hợp của những dãy màu khác, đây là những màu cơ bản của hệ màu cộng. Màu của những ánh sáng đơn sắc thay đổi từ từ và khó xác định được những bước sóng riêng ứng với đỏ (R), lục (G) và lam(B). CIE chọn λ = 700nm cho màu đỏ, λ = 546,1 nm cho màu xanh lục và λ = 435,8 nm cho màu lam. Ba màu cơ bản của hệ màu cộng được biểu diễn trên hình 1.5. Trong hệ màu cộng, sự trộn lẫn các màu lam và màu lục với số lượng bằng nhau sẽ tạo ra màu lục lam (cyan). Sự trộn lẫn màu đỏ và màu lam với số lượng bằng nhau sẽ tạo ra màu tím(magenta) và sự trộn lẫn màu đỏ và màu lục với số lượng bằng nhau sẽ tạo ra màu vàng. Ba màu vàng (Y), lục lam (C) và màu tím (M) gọi là những màu thứ cấp của hệ màu cộng. Khi 3 màu R,G,B được kết hợp với số lượng bằng nhau sẽ tạo ra màu trắng. Do vậy khi các thành phần R,G,B được sử dụng trong màn hình Tivi màu với số lượng bằng nhau thì kết quả sẽ ra hình ảnh trắng đen. Đem kết hợp các thành phần R,G,B với số lượng khác nhau, có thể tạo ra được nhiều màu khác nhau. Ví dụ, sự trộn lẫn ánh sáng đỏ và ánh sáng màu lục yếu, không có ánh sáng màu lam sẽ tạo ra ánh sáng màu nâu. Hình 2.2 : Hệ màu cộng (RBG) Các màu sắc trong thiên nhiên mà chúng ta nhìn thấy thường được tạo ra bằng cách lọc bỏ đi một số bước sóng và phản xạ những bước sóng khác. Việc trừ bỏ bước sóng được thực hiện bởi những nguyên tử gọi là sắc tố (pigment), chúng hấp thụ những phần đặc biệt của phổ. Ví dụ, khi ánh sáng mặt trời gồm nhiều bước sóng khác nhau chiếu vào quả táo đỏ, hệ thống hàng tỉ phân tử sắc tố trên bề mặt của quả táo hấp thụ tất cả các bước sóng ngoại trừ bước sóng màu đỏ. Kết quả là ánh sáng phản xạ có hàm c() gây ra cảm nhận màu đỏ. Các sắc tố lấy đi những bước sóng và hỗn hợp của hai loại sắc tố khác nhau sẽ tạo ra ánh sáng phản xạ mà bước sóng ngăn hơn. Đó là hệ màu trừ (subtractive color system). Ví dụ, khi hai thứ mực có màu khác nhau được trộn để tạo một màu khác cũng được gọi là hệ màu trừ. Ba màu cơ bản của hệ màu trừ là vàng (Y), lục lam (cyan) và tím (M), chúng là những màu thứ cấp của hệ màu cộng. Ba màu này được biểu diễn trên hình 1.6. Bằng việc trộn các màu đó với những hàm lượng thích hợp, có thể tạo ra một dãy màu rộng. Trộn màu vàng và màu lục lam tạo ra màu lục. Trộn màu vàng và màu tím tạo ra màu đỏ. Trộn màu lục lam và màu tím tạo ra màu lam. Do vậy ba màu : đỏ, lục và lam, những màu cơ bạn cũa hệ màu cộng lại là những màu thứ cấp của hệ màu trừ. Khi tất cả 3 màu Y, C, M kết hợp với nhau theo số lượng bằng nhau sẽ tạo ra màu đen, các sắc tố hấp thụ tất cả các bước sóng ánh sáng nhìn thấy. Một điều cần chú ý là : hệ màu trừ khác một cách cơ bản với hệ màu cộng. Trong hệ màu cộng, khi chúng ta thêm các màu với các bước sóng khác nhau, ánh sáng nhận được gồm nhiều bước sóng hơn. Chúng ta bắt đầu với màu đen, tương ứng với không có ánh sáng. Khi chúng ta đi từ màu cơ bản (RGB) đến các màu thứ cấp (YCM) và rồi đến màu trắng, chúng ta làm tăng các bước sóng trong ánh sáng nhận được. Trong hệ màu trừ, chúng ta bắt đầu với màu trắng, tương ứng với không có sắc tố. Khi chúng ta đi từ màu cơ bản(YCM) đến các màu thứ cấp (RGB) rồi đến màu đen, chúng ta làm giảm những bước sóng trong ánh sáng phản xạ nhận được. Hình 2.3 : Hệ màu trừ (YCM) Trong một hệ màu cộng, chúng ta có thể coi ánh sáng đỏ, lục, lam là kết quả của ánh sáng trắng đi qua ba bộ lọc thông dải khác nhau. Trộn hai màu có thể coi như ánh sáng trắng đi qua một bộ lọc tổ hợp song song của hai bộ lọc thông dải tương ứng. Trong hệ màu trừ, chúng ta có thể coi các ánh sáng màu vàng, lục lam và tím như là kết quả của ánh sáng trắng đi qua ba bộ lọc chặn dải khác nhau. Trộn hai màu có thể coi là kết quả của ánh sáng trắng đi qua hai bộ lọc chặn dải tương ứng đặt nối tiếp 2.2.2 Biểu diễn màu Ánh sáng màu là tổ hợp của ánh sáng đơn sắc. Mắt thường chỉ có thể cảm nhận được vài chục màu, song lại có thể phân biệt được tới vài ngàn màu. Có 3 thuộc tính chủ yếu trong cảm nhận màu: Brightness: sắc màu, còn gọi là độ chói. Hue: sắc lượng, còn gọi là sắc thái màu. Saturation: độ bão hòa. Với bước sóng đơn sắc, độ hue tương ứng với bước sóng λ. Độ bão hòa thay đổi nhanh nếu ta thêm lượng ánh sáng trắng. Theo lý thuyết 3 màu, phân bố phổ mang năng lượng của một nguồn sáng màu kí hiệu là C(λ) và tổ hợp màu theo 3 nguyên tắc 3 màu được mô tả như sau: Vẽ hình 2.3 trang 19 sách Do đó, αi (C) = Si(λ)c(λ)d λ với i = 1,2,3. Trong đó αi (C) gọi là đáp ứng phổ (spectral resposes). Phương trình trên gọi là phương trình biểu diễn màu. Nếu C1() và C2() là hai phân bố phổ năng lượng tạo nên các đáp ứng phổ α1 (C1) và α2 (C2) mà αi (C1) = αi (C2) với i=1,2,3 thì hai màu C1 và C2 là như nhau 2.2.3 Hệ tọa độ màu Như đã nói ở trên một màu là tổ hợp của các màu cơ bản theo một tỉ lệ nào đấy. Như vậy một pixel ảnh màu kí hiệu Px được viết thành: Px = Người ta dùng hệ tọa độ 3 màu R-G-B (tương ứng với hệ tọa độ x,y,z) để biểu diễn màu như sau: Hình 2.4 : Hệ tọa độ màu Trong cách biểu diễn này ta có công thức: đỏ + lục + lơ = 1. Công thức này gọi là công thức Maxwell. Trong hình vẽ trên, tam giác tạo bởi ba đường đứt đoạn gọi là tam giác Maxwell. Ta cũng có thể chuyển từ hệ tọa độ 3 màu về hệ tọa độ x-y-z. Hệ tọa độ màu do CIE đề xuất có tác dụng như một hệ quy chiếu và không biểu diễn hết các màu. Trên thực tế, phụ thuộc vào các ứng dụng khác nhau người ta đưa ra các hệ biểu diễn màu khác nhau. Thí dụ: Hệ RGB Hệ CMY (Cyan Magenta Yellow): thường dùng cho in ảnh màu; Hệ YIQ: cho truyền hình màu. 2.3 Các thiết bị thu nhận ảnh và kỹ thuật phân tích màu. Hai thành phần cho công đoạn này là linh kiện nhạy với phổ năng lượng điện từ trường, loại thứ nhất tạo tín hiệu điện ở đầu ra tỷ lệ với mức năng lượng mà bộ cảm biến (đại diện là camera); loại thứ hai là bộ số hoá. 2.3.1 Thiết bị thu nhận ảnh Máy chụp ảnh, camera có thể ghi lại hình ảnh (phim trong máy chụp, vidicon trong camera truyền hình). Có nhiều loại máy cảm biến (Sensor) làm việc với ánh sáng nhìn thấy và hồng ngoại như: Micro Densitometers, Image Dissector, Camera Divicon, linh kiện quang điện bằng bán dẫn. Các loại cảm biến bằng chụp ảnh phải số hoá là phim âm bản hoặc chụp ảnh. Camera Divicon và linh kiện bán dẫn quang điện có thể cho ảnh ghi trên băng từ có thể số hoá. Trong Micro Densitometer phim và ảnh chụp được gắn trên mặt phẳng hoặc cuốn quang trống. Việc quét ảnh thông qua tia sáng (ví dụ tia Laser) trên ảnh đồng thời dịch chuyển mặt phim hoặc quang trống tương đối theo tia sáng. Trường hợp dùng phim, tia sáng đi qua phim. Camera thường có hai kiểu: kiểu camera dùng đèn chân không và kiểu camera chỉ dùng bán dẫn. Trong lĩnh vực thu nhận ảnh, camera bán dẫn thường được dùng hơn camera đèn chân không. Camera bán dẫn cũng được gọi là CCD camera do dùng các thanh ghi dịch đặc biệt gọi là thiết bị gộp (Charge-Coupled Devices- CCDs). Các CCD này chuyển các tín hiệu ảnh sang từ bộ cảm nhận ánh sáng bổ trợ ở phía trước camera thành các tín hiệu điện mà sau đó được mã hóa thành tín hiệu TV. Loại camera chất lượng cao cho tín hiệu ít nhiễu và có độ nhậy cao với ánh sáng. 2.3.2 Thiết bị nhận ảnh. Chức năng của thiết bị này là số hóa một băng tần số cơ bản của tớn hiệu truyền hình cung cấp từ một camera, hoặc từ một đầu máy VCR. Ảnh số sau đó được lưu trữ trong bộ đệm chính. Bộ đệm này có khả năng được địa chỉ hóa (nhờ một PC) đến từng điểm bằng phần mềm. 1. Thiết bị có khả năng số hóa ảnh ít nhất 8 bit (256 mức xám) và ảnh thu được phải có kích thước ít nhất là 512×512 điểm hoặc hơn. 2. Thiết bị phải chứa một bộ đệm ảnh để lưu trữ một hoặc nhiều ảnh có độ phân giải 512×512 điểm ảnh. Như đã nói ở trên các thiết bị thu nhận ảnh thông thường gồm camera cộng với bộ chuyển đổi tương tự số AD (Analog to Digital) hoặc máy scanner. Các thiết bị thu nhận ảnh này có thể cho ảnh trắng đen B/W (Black & White) với mật độ từ 400 đến 1600 dpi (dot per inch) hoặc ảnh màu 600dpi. Với ảnh B/W mức màu z là 0 hoặc 1. Với ảnh xám đa cấp, mức xám biến thiên từ 0 đến 255. Ảnh màu mỗi điểm lưu trữ trong 3 byte nên ta có 28x3 = 224 màu (khoảng 16,7 triệu màu) Khi dùng scanner, một dòng photodiot sẽ quét ngang qua ảnh và cho ảnh với độ phân giải ngang khá tốt. Đầu ra của scanner là ảnh ma trận số mà ta quen gọi là bản đồ ảnh (Bitmap). Với ảnh màu có nhiều cách hiển thị màu khác nhau. Theo lý thuyết màu do Thomas đưa ra năm 1802, mọi màu sắc đều có thể tổ hợp từ 3 màu cơ bản : Red (đỏ), Green (lục), Blue (lơ). Nhìn chung, các hệ thống thu nhận ảnh thực hiện hai quá trình: Cảm biến: biến đổi năng lượng quang học thành năng lượng điện Tổng hợp năng lượng điện thành năng lượng ảnh 2.4 Lấy mẫu và lượng tử hóa ( Image Sampling and Quantization) Yêu cầu cơ bản nhất trong xử lý ảnh số là đưa ảnh về dạng biểu diễn số thích hợp, nghĩa là ảnh phải được biểu diễn bởi một ma trận hữu hạn tương ứng với việc lấy mẫu ảnh trên một lưới rời rạc và mỗi pixel được lượng hóa bởi một số hữu hạn bit. Ảnh số được lượng tử hóa có thể được xử lý hay chuyển qua bước biến đổi số tương tự - DA( Digital to Analog) để tái hiện trên thiết bị hiện ảnh. Một ảnh g(x, y) ghi được từ Camera là ảnh liên tục tạo nên mặt phẳng hai chiều. Ảnh cần chuyển sang dạng thích hợp để xử lí bằng máy tính. Phương pháp biến đổi một ảnh (hay một hàm) liên tục trong không gian cũng như theo giá trị thành dạng số rời rạc được gọi là số hoá ảnh. Việc biến đổi này có thể gồm hai bước: Bước 1: Đo giá trị trên các khoảng không gian gọi là lấy mẫu Bước 2: Ánh xạ cường độ (hoặc giá trị) đo được thành một số hữu hạn các mức rời rạc gọi là lượng tử hoá. 2.4.1 Lấy mẫu Lấy mẫu là một quá trình, qua đó ảnh được tạo nên trên một vùng có tính liên tục được chuyển thành các giá trị rời rạc theo tọa độ nguyên. Quá trình này gồm 2 lựa chọn: Một là: khoảng lấy mẫu. Hai là: cách thể hiện dạng mẫu. Lựa chọn thứ nhất được đảm bảo nhờ lý thuyết lấy mẫu của Shannon. Lựa chọn thứ hai liên quan đến độ đo (Metric) được dùng trong miền rời rạc. Khoảng lấy mẫu (Sampling Interval) Ảnh lấy mẫu có thể được mô tả như việc lựa chọn một tập các vị trí lấy mẫu trong không gian hai chiều liên tục. Đầu tiên mô tả qua quá trình lấy mẫu một chiều với việc sử dụng hàm delta: Tiếp theo chúng ta định nghĩa hàm răng lược với các khoảng Δx như sau: với r là số nguyên, Δx : khoảng lấy mẫu Như vậy, hàm răng lược là chuỗi các xung răng lược từ (-∞ đến +∞). Giả sử hàm một chiều g(x) được mô tả (gần đúng) bằng g(rΔx ) tức là: Khi đó tín hiệu lấy mẫu được mô hình hoá : Hoặc tương đương : Trong thực tế, r không thể tính được trong khoảng vô hạn (từ ∞ − đến +∞) mà là một số lượng NΔx mẫu lớn cụ thể. Như vậy, để đơn giản có thể nói hàm liên tục g(x) có thể biểu diễn trên một miền với độ dài NΔx mẫu thành chuỗi như sau: Khoảng lấy mẫu (Sampling Interval) Δx là một tham số cần phải được chọn đủ nhỏ, thích hợp, nếu không tín hiệu thật không thể khôi phục lại được từ tín hiệu lấy mẫu. Mặt khác (2-6) tương đương với tích chập trong miền tần số ω tức là biến đổi Fourier của gs(x) là Gs(ωx): trong đó ωx là giá trị tần số ứng với giái trị x trong miền không gian. Điều kiện khôi phục ảnh lấy mẫu về ảnh thật được phát biểu từ định lý lẫy mẫu của Shannon. Định lý lấy mẫu của Shannon Giả sử g(x) là một hàm giới hạn giải (Band Limited Function) và biến đổi Fourier của nó là G(ωx) = 0. Đối với các giá trị ωx > Wx . Khi đó g(x) có thể được khôi phục lại từ các mẫu được tạo tại các khoảng x Δ đều đặn. Tức là: Định lý lẫy mẫu của Shannon có thể mở rộng cho không gian hai chiều. Hàm răng lược hai chiều khi đó được xác định: Hàm lấy mẫu hai chiều thu được: và Δx, Δy được chọn thoả mãn các điều kiện tương ứng theo định lý lấy mẫu của Shannon khi đó sẽ: Tương tự như không gian một chiều, một tín hiệu ảnh hai chiều g(x,y) có thể xấp xỉ trong khoảng [N, M] có thể được ước lượng như sau : 2.4.2 Lượng tử hóa Định nghĩa: Lượng tử hoá là ánh xạ từ các số thực mô tả giá trị lấy mẫu thành một giải hữu hạn các số thực. Nói cách khác, đó là quá trình số hoá biên độ. Hình 2.5: Khuông lượng tử theo L mức xám. Giả sử Z là một giá trị lấy mẫu (số thực) tại vị trí nào đó của mặt phẳng ảnh, và Zmin<=Z’<=Zmax và giả sử chúng ta muốn lượng hoá giá trị đó thành một trong các mức rời rạc: l1, l2,…ln tương ứng với Zmin đến Zmax (Hình 2.5). Khi đó, quá trình lượng hoá có thể thực hiện bằng cách chia toàn bộ miền vào (Zmax – Zmin) thành L khoảng, mỗi khoảng là Δl và khoảng thứ i được đặt tại điểm giữa các khoảng liền kề li. họ các giá trị z được thực hiện và mô tả bằng li theo quá trình trên đây, khi đó sai số của quá trình lấy mẫu có thể được xác định theo : 2.4.3 Quét ảnh Phương pháp chung để lấy mẫu là quét ảnh theo hàng và mã hóa từng hàng. Về nguyên tắc, một đối tượng, phim hay giấy trong suốt sẽ được chiếu sáng liên tục để tạo nên một ảnh điện tử trên tấm cảm quang. Tùy theo loại camera mà chất liệu của tấm cảm quang này là chất quang dẫn hay chất quang truyền. Hệ thống camera ống sử dụng phương pháp scan-out-digitalizer; còn hệ thống camera CCD ( Charge Couped Device) cho ảnh ma trận. Camera CCD thực sự là thiết bị mẫu hóa tín hiệu hai chiều và gọi là phương pháp sefl-scanning matrix. Hình 2.6 Phương pháp số hóa Scan-out Hình 2.7 Phương pháp Self-scanning Chương 3 Các phương pháp xử lý ảnh Như đã biết, dữ liệu của hình ảnh sau khi thu nhận về sẽ được xử lý làm tiền đề cho các công đoạn điều khiển khác của hệ thống thị giác máy. Có rất nhiều phương pháp xử lý ảnh tùy thuộc mục đích và yêu cầu cảu hệ thống. Tuy nhiên, do cấu trúc ảnh là ma trận những điểm ảnh nên các phương pháp xử lý cơ bản đều thực hiện trên các điểm ảnh hoặc ma trận này. 3.1 Xử lý điểm ảnh : Ảnh thu về trước xử lý thông thường là những ảnh màu, nghĩa là một pixel bao gồm thông tin ba màu cơ bản là R ( đỏ ), G ( xanh lá ), B ( xanh biển ). Ba màu này được bố trí sát nhau tạo thành các màu khả kiến. Mỗi màu R,G,B được biễu diễn bởi 8 bits. Như vậy mỗi pixel sẽ có giá trị 24 bits, biểu diễn được khoảng 16,78 triệu màu. Dữ liệu ảnh thu về là ma trận gồm các giá trị 24 bits, điều này sẽ gây độ phức tạp rất lớn cho việc xử lý. Nhưng khi ta cần khôi phục ảnh, các pixel sẽ giữ được gần với nguyên gốc nhất. Việc có xử lý trực tiếp trên các pixel màu này hay không phụ thuộc vào mục đích khôi phục ảnh hay chỉ nhằm thu nhận dạng ảnh. Phần lớn trường hợp, dữ liệu ảnh được xử lý nhằm thực hiện một công việc điều khiển nào đó, do đó, ảnh không cần thiết phải khôi phục. Vì vậy, ta cần giảm số bit thông tin biểu diễn 1 pixel để việc xử lý thuận lợi hơn. 3.1.1 Biến ảnh màu thành ảnh xám : Trong ảnh xám, mỗi pixel có giá trị 8 bits thông tin. Ở mức này, cấu trúc ảnh vẫn giữ nguyên, giá trị ma trận ảnh đơn giản hơn rất nhiều. Phù hợp với quá trình xử lý chỉ quan tâm đến cấu trúc ảnh mà không cần đến màu sắc ảnh. Công thức được sử dụng phổ biến đổi ảnh màu thành ảnh xám là : P = aCr + bCb + cCg Trong đó Cr, Cb, Cg là các giá trị mức màu R,B,G. Tùy theo mức độ thu nhận ảnh màu gốc hoặc tùy theo các thiết bị thu nhận mà hệ số a,b,c có các giá trị khác nhau sao cho (a + b + c) <= 1. Ví dụ về ảnh xám : Hình 3.1: Chuyển ảnh màu thành ảnh xám 3.1.2 Lược đồ xám : Là một biểu đồ với trục tung là mức xám, trục hoành là các pixel. Lược đồ này biểu diễn tần suất xuất hiện của các mức xám trên ảnh. Do ảnh đôi khi được chụp ở nơi quá sáng hay quá tối sẽ làm cấu trúc ảnh không rõ ràng, dựa vào lược đồ xám, ta có thể làm nổi bật cấu trúc ảnh lên. Điều này rất cần thiết cho việc nhận dạng ảnh, nhất là với các ảnh chứa nhiều chi tiết thì lại càng quan trọng. 3.1.3 Nhị phân hóa ảnh : Đây là cách biến đổi các giá trị pixel của ảnh sang giá trị nhị phân ( đơn giản nhất) 0 hoặc 1. Khi đó ma trận ảnh sẽ ở mức tối thiểu giá trị giúp việc xử lý đơn giản nhất nhưng đôi khi gây sai lệch cấu trúc ảnh ( do các đường viền khác biệt nhỏ dễ bị đồng hóa). Đây chỉ là bước xử lý cho các ảnh có ít chi tiết. Để nhị phân hóa ảnh, ta dựa vào ngưỡng xám trung bình, nếu lớn hơn thì đưa giá trị về 1, nhỏ hơn thì đưa về 0 ( thực chất là mức 0 và 255, thể hiện 2 màu đen và trắng ). Hình 3.2 : Ảnh nhị phân và ảnh xám 3.2 Các phương pháp lọc ảnh : Hình ảnh sau khi thu nhận cần qua một bước tiền xử lý là lọc ảnh, đây là công đoạn gần như bắt buộc bởi ảnh nhận được hầu hết đều có nhiễu, mờ… 3.2.1 Lọc tuyến tính : Trong lọc tuyến tính, thông thường là sử dụng một mặt nạ cửa sổ 3x3, 5x5, 9x9… tùy vào thuật toán hay kích thước ảnh. Ma trận mặt nạ này chứa các giá trị pixel của ảnh, pixel trung tâm sẽ được thay đổi bằng các công thức toán với các pixel lân cận. Lọc tuyến tính tỏ ra rất hiệu quả cho công việc tách biên đối tượng bởi các thuật toán đạo hàm của nó được thực hiện ngay trên giá trị pixel như phương pháp Gradient hay Laplace. 3.2.2 Lọc phi tuyến : Lọc phi tuyến hay được sử dụng là lọc trung vị. Sử dụng mặt nạ trượt trên ảnh, những phần tử trong mặt nạ là một chuỗi các pixel, điểm quan tâm được thay thế bằng giá trị trung vị của chuỗi, đây là phương pháp khử nhiễu rất thành công. Cơ sở của các phương pháp lọc này là xem các giá trị pixel ở gần nhau sẽ có giá tri gần giống nhau, tức cùng có mức xám, màu sắc tương đồng… Hình ảnh sau khi lọc trở nên rõ ràng hơn, dễ nhận ra hơn bằng mắt thường và bằng giá trị pixel, giảm đáng kể các nhiễu… 3.3 Các phương pháp phát hiện biên : Có khá nhiều nghiên cứu về việc dò và tách biên đối tượng trong xử lý ảnh, cơ bản đều là phát hiện liên kết giữa 2 vùng có mức xám khác nhau. Tuy nhiên, chưa có phương pháp nào có thể hoàn toàn tìm được biên đối tượng mà chỉ mang tính tương đối. Sau đây là một số phương pháp thông dụng được sử dụng : Sobel, bộ tách biên Roberts, Prewitt… sử dụng cách tính vi phân tương tự Laplace. Hình 3.3: Lọc Biên 3.4 Phân vùng ảnh : Là bước xác định vật thể trong ảnh, bằng cách trích lọc ra vùng có cùng tính chất dựa vào sự đồng nhất về mức xám giữa những pixel. Sau khi phân vùng ảnh, ta sẽ có được vật thể xác định trên ảnh tách biệt với các chi tiết thừa trong hình. Hạn chế là ta chỉ nhận được các vật thể tách biệt nhau, còn với ảnh nhiều chi tiết, kết quả phân vùng ảnh sẽ không chính xác. Đối với cấu trúc ảnh nhị phân, các pixel chỉ mang giá trị 0 hoặc 1 nên việc phân vùng ảnh rất quan trọng nhằm loại bỏ nhiễu, phân tách các vật thể gần nhau hay định rõ một vật thể với các đường lien kết nhỏ. Phương pháp khà thi nhất cho việc phân vùng ảnh nhị phân là làm mảnh và làm đầy : Làm mảnh : loại bỏ hoàn toàn các nhiễu trong vật thể hay trên biên, tách biệt các vật với nhau. Làm đầy : đưa các vùng ảnh khôi phục như ban đầu. Tùy theo mục đích và yêu cầu hệ thống, ta có thể sử dụng một vài các bước trên để lấy thông tin cần thiết cho việc xử lý ảnh. Đó có thể chỉ đơn giản là nhận biết sự khác nhau giữa 2 hình nhằm xác định sự chuyển động, hoặc phức tạp cần đến độ chính xác cao như nhận biết dấu vân tay, đối tượng định trước…. 3.5 Các ứng dụng trong xử lý ảnh : 3.5.1 Nhận dạng chữ viết, số : Nhận dạng chữ viết ngày càng phát tiển và ngày càng trở nên quan trọng vì nhiều lý do như sự bất tiện của bàn phím, thời gian xử lý các văn bản cũ kéo dài nếu phải nhập lại bằng bàn phím, sự phát triển các thiết bị cảm ứng… Cơ bản của việc nhận dạng này là dùng các thuật toán để tìm ra các đặc điểm đặc trưng của cá thể riêng biệt trong quần thể, rồi xem đó ứng với mẫu kí tự tương tự nhất. Do đó, khi nhận dạng kí tự, nhất thiết phải tạo ra cơ sở dữ liệu từ điển của các kí tự ban đầu và trải qua các bước sau : Xử lý dữ liệu ban đầu : do các kí tự khi thu nhận về đều ở dạng thô, mờ, nhiễu…, nếu không xử lý làm rõ ràng thì xác suất thành công thấp. Phân tích dữ liệu để lấy ra các đặc điểm : là bước quan trọng nhất, ứng với từng loại kí tự khác nhau sẽ có những cách xử lý khác nhau. Tạo từ điển : sao lưu tạo thành cơ sở cho những xử lý sau này. 3.5.2 Nhận dạng vân tay : Đang được sử dụng rộng rãi trong nhiều lĩnh vực : an ninh, quân sự, bảo mật cá nhân. Ngày nay nhiều thiết bị đã được trang bị nhận diện vân tay để đảm bảo như cầu bảo mật dữ liệu cá nhân như: máy tính, điện thoại di động, mấy chấm công, các hệ thống cửa tự động … Vân tay giống như một tham số sinh học bất biến theo tuổi tác đặc trưng cho mỗi người. Ngoài đặc trưng về loại của vân tay (vân tay thường được chia thành 5 loại chính: Whorl, Left Loop, Right Loop, Arch, Tented Arch), các vân tay được phân biệt chủ yếu nhờ các điểm đặc biệt trên ảnh vân tay. Các điểm này gọi là các chi tiết điểm của ảnh vân tay. Có hai loại chi tiết điểm thường được sử dụng là kết thúc điểm (ending) và điểm rẽ nhánh (bifucation) 3.5.3 Nhận dạng khuôn mặt : Đây là công nghệ rất quen thuộc với những người sử dụng máy ảnh và máy tính cá nhân đặc biệt mà máy tính xách tay vì sự tiện lợi của nó, chỉ cần 1 chiếc webcam bạn có thể đăng nhập vào máy tính mà không cần gõ username và password. Nhưng độ bảo mật của phương pháp này không cao vì dễ bị virus tấn công. Chương 4: Giới thiệu Video Starter Kit 4.1 ML 402 Board : Để chạy một ứng dụng, ta sử dụng Board ML 402, chuyên về xử lý ảnh. Board hỗ trợ rất nhiều cổng thu nhận data ảnh thông dụng, cũng như thiết lập được các cấu hình cao hiện nay như 1024x768, 1280x1024 hay 1600x1200..., tốc độ khung hình lý tưởng mức xấp xỉ tần số 60 Hz mức độ phân giải cao nhất. Thực chất board ML 402 không đi riêng một mình mà sử dụng kèm card thu nhận ảnh là VIODC ( Video Input Output Daughter Card ) : Hình 4.1 : Video Starter Kit Do trong thực nghiệm ta không sử dụng nhiều đến board ML 402, chỉ sử dụng đến VIODC là đủ, nên để tránh dài dòng không cần thiết, board ML 402 chỉ giới thiệu qua, còn các tính năng hỗ trợ không nhắc đến. ( Tài liệu về ML 402 được đính kèm nếu muốn tham khảo ) 4.2 Video Input Output Daughter Card - VIODC : Card màn hình này tuy hỗ trợ các cổng ra vào cho board ML 402 nhưng vẫn có thể hoạt động độc lập đối với các ứng dụng không cần quá nhiều tài nguyên phần cứng. Đối với các cổng thu nhận và xuất data ảnh như trên hình, ta thấy rõ VIODC hỗ trợ rất nhiều chuẩn giao tiếp thông dụng hiện nay, tỉ như VGA, camera, SDI ... Đáng chú ý nhất là VIODC tích hợp sẵn Xilinx XCV2P7 FPGA để có thể cấu hình và hoạt động độc lập, lý tường cho các thí nghiệm và mô phỏng. Đề tài sử dụng dữ liệu lấy từ CPU thông qua cổng VGA input đi qua VIODC và trở ra ngõ VGA output đưa ra monitor. Sau đây là cấu tạo phần cứng ngõ vào VGA : Hình 4.2: VGA Input Chip AD9887A dùng để chuyển các tín hiệu Analog nhận được sang dạng Digital, theo bus data đưa sang cho FPGA. Đường tín hiệu I2C Control là bus giao tiếp trao đổi điều khiển giữa FPGA và AD9887A, các tùy chỉnh điều khiển này nằm trong diver có sẵn của board, ở đây ta không cần chú ý gì nhiều mà chỉ cần chỉnh cấu hình độ phân giải hoạt động cho board phù hợp với CPU. Đó chính là các switch. Hình 4.3 : VGA Output Tương tự như trên, chip ADV7123 dùng chuyển từ tín hiệu Digital sang Analog đẩy ra cổng VGA truyền đến cho monitor. Ở trên ngõ vào sau khi chuyển đổi chỉ bao gồm 8 bits một màu R, G, B, nhưng gõ ra lại là 10 bits mỗi màu. 2 bits chênh lệch này được thêm vào từ quá trình điều khiển riêng của driver. 4.3 Phần mềm ISE : Hỗ trợ mô phỏng cho lập trình nhúng của Xilinx. Cũng tương tự như nhiều công cụ khác, ISE tạo môi trường cho các ngôn ngữ lập trình nhúng như Verilog, VHDL,... kể cả công cụ mô phỏng ISE Simulator. Đề tài sử dụng phiên bản Xilinx ISE 10.1. Hình 4.4: Giao diện ISE Khi viết code project, ISE cũng hỗ trợ tạo ra các nhân IP Core tương tự như các module con để sử dụng, khi cấu hình, phần cứng tương ứng với core được ISE hỗ trợ cũng tự tạo ra tải xuống board. Điều này giúp giảm thời gian rất nhiều cho việc tạo ra các module hay sử dụng như Ram, Fifo, bộ tính toán,... Sau đây là một số IP Core được sử dụng trong đề tài : Hình 4.5 Giao diện ISE 4.3.1 First In First Out – Fifo : Bộ Fifo là vùng nhớ không bao gồm địa chỉ, hoạt động theo nguyên tắc data vào trước sẽ được lấy ra trước. Hai tín hiệu dùng điều khiển việc ghi vào, lấy ra là write_enable và read_enable. Write_enable cùng tích cực với data để lưu dữ liệu vào, read_enable tích cực để data output có giá trị lấy ra. Ngoài ra còn có tín hiệu khác như empty báo trống bộ nhớ, full báo đầy bộ nhớ,... Trong thiết kế, Fifo thường sử dụng cho việc lưu trữ tạm thời dữ liệu nhằm lấy ra sử dụng sau. Điều đương nhiên là tín hiệu ra đồng bộ theo clock, tức nếu yêu cầu đọc ra read_enable tích cực thì phải sau 1 clock data output mới có giá trị. Hình 4.6: Giao diện tạo Fifo 4.3.2 Random Access Memory – Ram : Là bộ nhớ được sử dụng nhiều nhất trong thiết kế phần cứng nói chung. Ram bao gồm địa chỉ chứa dữ liệu, thuận tiện cho việc lưu trữ và lấy ra theo ý muốn. Các tín hiệu của Ram đương nhiên là phải có data input và output, write_enable cho phép chi dữ liệu vào. Ram không cần tín hiệu cho phép đọc ra, bởi nó có sẵn đường tín hiệu vào ra riêng biệt, đồng thời dữ liệu trong Ram vẫn không mất đi cho đến khi được reset hoặc ghi đè lên. Bên cạnh đó còn một vài tín hiệu khác tùy theo yêu cầu sử dụng mà thêm vào hoặc bỏ bớt, thuận tiện cho nhiều mục đích khác nhau. Việc lấy data output trong Ram cũng phải đồng bộ theo clock, địa chỉ đọc ra thay đổi thì sau 1 clock, dữ liệu tại ô nhớ đó mới được đưa ra ngoài. Hình 4.7: Giao diện tạo Ram 4.3.3 Read Only Memory – Rom : Rom tương tự như Ram, khác biệt ở chỗ Rom chứa sẵn dữ liệu trong vùng nhớ, chỉ có thể đọc ra mà không thể ghi vào. Tín hiệu điều khiển Rom chỉ đơn giản bao gồm địa chỉ và data output. Điều này có nghĩa là khi ngắt nguồn, dữ liệu trong Ram sẽ mất đi nhưng trong Rom thì không. Khi tạo Rom, ta nạp dữ liệu vào theo dạng như sau : Hình 4.8: Tạo font chữ số làm dữ liệu cho Rom Hình 4.9: Tạo dữ liệu trong Rom Trong đó, “memory_initialization_radix = 2” khai báo hệ số của dữ liệu, dạng nhị phân 1 bit, nếu là 10 là dạng thập phân, 16 là dạng thập lục phân. Memory_initialization_vector chỉ dữ liệu trong Rom, dữ liệu này tạo thành từ font có sẵn. Hình 4.10: Giao diện tạo Rom Chương 5: Thực nghiệm 5.1 Sơ đồ khối xử lý ảnh : Dữ liệu hình ảnh được đi qua các bước xử lý chính như sau : Hình 5.1: Đường đi của data Signal Input là các tín hiệu hình ảnh thu nhận từ các thiết bị có khả năng truy xuất ảnh như camera, cổng VGA của máy tính… Trong đề tài này, ta lấy data từ cổng VGA của CPU, bởi khung hình nhận được sẽ không có nhiễu và chủ động hơn trong việc tinh chỉnh các thông số độ phân giải. Counter là module xử lý chính của đề tài. Tại đây số lượng vật thể được xác định và chứa đựng các thông số quan trọng khác dùng cho việc mở rộng đề tài nếu có sau này. Để ứng dụng thực tế hơn, ta có thể thêm vào bộ lọc giúp lấy được khung hình rõ ràng từ các camera, máy quay..., cụ thể là loại bỏ nhiễu hay thậm chí là các chi tiết thừa. Bộ lọc nếu có sẽ nằm giữa Signal Input và Counter. OSD ( On Screen Display ) là module hiển thị các kết quả mong muốn ra monitor. Chẳng hạn trong đề tài này, ta cần hiển thị các số biểu diễn số lượng vật thể, hoặc nếu cao hơn như đánh dấu vào các đối tượng cần xác định,... Cuối cùng hiển nhiên là Signal Output đưa data ra ngoài monitor để ta có thể nhìn thấy kết quả của đề tài. Trên đây chỉ là một vài các bước xử lý mà đề tài thực hiện, còn thực ra data phải đi qua các module khác nữa để có thể bắt tín hiệu, tinh chỉnh đồng bộ độ phân giải,... mà ta gọi chung là driver để đảm bảo board hoạt động tốt. Các module này được đi kèm theo board nên ta không cần phải làm mà chỉ cần bắt tín hiệu đúng chỗ và tinh chỉnh theo yêu cầu mong muốn. 5.2 Thu nhận dữ liệu ảnh : Cần nhắc lại một chút rằng tín hiệu nhận vào là dạng Analog, cấu hình board sẽ chuyển thành tín hiệu số Digital thuận tiện cho việc xử lý. Khi đưa ra thì ngược lại, tín hiệu Digital sẽ được chuyển thành Analog. Ớ quá trình xử lý, ta chỉ đề cập đến data Digital. Signal Input là chuỗi các bits nhị phân nối tiếp. Các bit này được chia thành từng byte, mỗi byte gồm 8 bits. Mỗi 3 byte liên tiếp thể hiện 3 màu R,G và B. Cứ 3 màu R,G,B thì tạo thành 1 pixel, như vậy mỗi pixel có giá trị 24 bits. Khi hiển thị, chuỗi pixels được sắp xếp thành ma trận tạo ra khung hình. Số lượng pixel trên một khung hình tùy thuộc độ phân giải ta sử dụng. Các tín hiệu quan trọng nhằm xác định vị trí các pixels này là vsync, hsync và data_valid. Cụ thể vsync xác định đầu cuối mỗi frame hình, hsync xác định đầu cuối mỗi line ảnh và data_valid cho biết đâu là các pixels ảnh có gía trị thật, đâu là bits vô nghĩa. Hình 5.2: Các signal quan trọng Trong đề tài này, ta sử dụng độ phân giải 1024x768, nghĩa là có 1024 pixels trên mỗi line và có 768 lines trên 1 hình. Thời gian giữa các lines và giữa các frames hình được xác định ở mức như sau : Hình 5.3: Thời gian đồng bộ giữa các signal. Đề tài thực hiện xử lý theo thời gian thực, nghĩa là quá trình xử lý phải đảm bảo nằm trong khoảng thời gian cho phép nào đó. Cụ thể ở đây là thời gian trống không có pixels thực giữa các lines, tức 24 + 136 + 160 = 320 pixel clock. Hoặc giữa các frames hình, thời gian này thì nhiều hơn ( 38 lines trống ) nhưng lại cần nhiều tài nguyên hơn bởi phải lưu lại cả frame dành cho việc xử lý. Trước khi thực thi các thuật toán, công việc cần thiết dễ thấy nhất là phải giảm giá trị của các pixels, bởi mỗi pixel dài đến 24 bits. Tùy theo các yêu cầu của tiến trình, giá trị pixels sẽ được thay đổi khác nhau, nếu cần phải xác định tương đối chính xác chi tiết trong ảnh thì không nên giảm quá ngắn độ dài pixels, còn nếu yêu cầu không cần nhiều đến chi tiết thừa trong hình thì có thề giảm càng nhỏ độ dài pixels càng tốt. Đề tài này đi theo hướng thứ 2. Yêu cầu đề tài là không phân biệt cụ thể đối tượng nào trong ảnh, chỉ cần xác định tương đối các vật thể trong ảnh là đủ, đương nhiên điều này khá hạn chế về độ chính xác và không cụ thể rõ ràng nhưng có thể làm nền cho các ứng dụng phức tạp hơn về sau. Do cần phân biệt nền và vật thể nên màu sắc là yếu tố quan trọng nhất. Một pixel bao gồm 3 màu R, G, B, mỗi màu có giá trị nào đó tạo thành một màu cụ thể, giá trị càng lớn pixel càng sáng và ngược lại. Do đó, trên thực nghiệm, nền được xem như có màu sáng hơn và vật thể có màu tối hơn. Xét từng màu R, G hoặc B có độ dài 8 bits, nếu bất cứ màu nào lớn hơn 127, ta thay pixel đó bằng “0” ( là nền ), ngược lại cho màu tối, thay bằng “1” ( là vật thể ). Cách đặt giá trị này hơi ngược, giá trị lớn thay bằng 0, nhỏ thay bằng 1, nhưng thuận lợi cho việc xử lý sẽ nói ở sau. Hình ảnh được lấy từ CPU không có nhiễu nên các mảng màu tối xuất hiện trong hình đều có thề được xem là vật thể. 5.3 Thuật toán đánh nhãn : Khi nhận data hình, ta nhận từng pixel một, theo chiều từ trái sang phải, từ trên xuống dưới. Việc xử lý có thể được thực hiện giữa các lines hoặc giữa các frames hình. Do hạn chế về tài nguyên của board xử lý hình ảnh, mà cụ thể là Ram, ta không thể lưu cả 1 frame ảnh để dành đến cuối khung hình mới xử lý, vậy ta chọn cách thực thi thuật toán giữa các lines. Cấu trúc của đối tượng trong hình có thể đơn giản như hình vuông, chữ nhật... nhưng cũng có thể rất phức tạp như hình sao, @,... độ lớn cũng khác nhau, trải dài trên nhiều lines và ở mọi vị trí có thể trên ảnh. Ta lại chỉ có thể nhận và xử lý từng lines từ trên xuống, các lines đã qua ta không thể giữ lại nên nếu gặp một phần của đối tượng nằm ở line bất kỳ bên dưới, không thể dùng cách so sánh để biết nó có thuộc đối tượng nào ở trên hay không. Hình 5.4: Vật có cấu trúc đơn giản - hình vuông và phức tạp - hình xoắn ốc Cách giải quyết vấn đề này là đánh nhãn đối tượng. Với mỗi pixel nhận được, ta đánh số cho pixel đó, các pixels ở cạnh nhau mà cùng thuộc vật thể ( có giá trị “1” khi nhận từ bước tiền xử lý ) sẽ được gán củng một nhãn ( nhãn là một giá trị nào đó theo thứ tự số ). Vậy, cần lưu lại ít nhất 1 line ở trên để so sánh, điều này có thể thực hiện được bởi 1 line gồm 1024 pixels, không quá nhiều. Do hạn chế của cách hoạt động trên phần cứng, ta chỉ có thể so sánh mỗi pixel với các pixels ở trên và phía trước nó chứ không thể so sánh toàn bộ các pixels xung quanh. Ví dụ với các hình vuông và chữ nhật ở trên, với hình vuông gồm 9 pixels, 9 pixels đó đều mang nhãn số 1, tương tự cho hình vuông 4 pixels, 4 pixels đó đều mang nhãn là 2... Nhưng với hình xoắn ốc, cách đánh nhãn này không chính xác, bởi càng xuống phía dưới, nhãn đánh lên các pixel càng khác nhau. Nhằm thỏa vấn đề này, ta sử dụng cách đánh nhãn có giá trị. Với mỗi nhãn được đánh cho các pixels, ta đi kèm với nó một giá trị. Tức con số gán lên pixel là địa chỉ, địa chỉ này tất nhiên sẽ chứa ( hay chỉ đến, dạng con trỏ ) một giá trị khác. Như vậy, mục đích là tuy một vật thể mang nhiều nhãn khác nhau nhưng các nhãn đó đều có củng 1 giá trị, xét theo giá trị thì chúng cùng thuộc một đối tượng. Nếu hai nhãn khác nhau liền kề, ta chỉ cần cập nhật giá trị cho nhãn có số lớn hơn, do ưu tiên các số nhỏ. Sau đây là sơ đồ giải thuật của thuật toán, với các ghi chú : Pixel_in : pixel nhận vào theo thứ tự. Pixel_up : pixel ở bên trên pixel đang xét. Pixel_focus : pixel đang được xử lý. Pixel_pre : pixel phía trước pixel đang xét. Count : biến đếm dùng làm nhãn đối tượng. Hình 5.5 Lưu đồ giải thuật cho thuật toán đánh nhãn Thuật toán hoạt động cụ thể như sau : pixel lấy vào nếu có giá trị lớn hơn 127, tức thuộc nền, thay bằng pixel_in có giá trị “0”, ngược lại là “1” như đã nói ở trên. Nếu là nền thì bỏ qua, nhưng nếu là vật thể thì xét pixel_up ở trên, ở trên đã đánh nhãn rồi thỉ cứ theo đó mà gán giá trị vào, còn không phải vật thì xét pixel_pre ở trước, phía trước là vật thể thì theo đó đánh nhãn. Nếu cả bên trên và phía trước đều chưa có nhãn, ta đánh nhãn mới cho pixel này. Việc này thực thi tuần tự với mỗi pixel vào, không dừng lại cho đến khi dừng xử lý bởi người dùng. Việc cập nhật giá trị cho nhãn được thực thi khi pixel_focus gán theo nhãn pixel_up nhưng pixel_pre đã có nhãn. Đến đây pixel_focus và pixel_pre liền kề nhau mang nhãn khác nhau, vậy nhãn nào nhỏ hơn thì lấy giá trị nhãn đó chung cho cà hai. Nhãn là chuỗi số tăng dần có chứa giá trị, vậy trong phần cứng, đó chính là Ram. Còn để lưu lại cà một line rồi lấy dần ra làm pixel_up, bộ Fifo ( First in first out ) chính là lựa chọn tốt nhất. Việc sử dụng các pixel phía trên và phía trước này cụ thể như sau : Hình 5.6 Lưu đồ giải thuật cho thuật toán đánh nhãn Để dễ hiểu hơn việc cập nhật giá trị Ram cho các nhãn, ta xem thử vật thể sau : Hình 5.7: Vật thể màu đen đã được đánh nhãn Các nhãn liền kề bị khác nhau và cần cập nhật giá trị lại tại các vị trí “2!” và “1!”. Nhìn cách cập nhật giá trị này có vẻ phức tạp bởi ta có thể xét lại từ đầu line lần nữa và đổi giá trị các nhãn cần thay. Nhưng giả sử gặp phải vật thể kéo dài đến cuối mép phải khung hình mới phải cập nhật, ta cần khoảng 1023 clocks trong trường hợp xấu nhất, điều này là không thể đối với hệ thống xử lý thời gian thực. Ram được sử dụng trong trường hợp cụ thể này như sau : Hình 5.8 Mô phỏng thuật toán đánh nhãn Ô nhớ mang địa chỉ “0” trong Ram không được sử dụng bởi nó trùng giá trị với “giá trị nền” của pixel_in. Đây là lý do ta chọn nền là “0”, vật thể là “1”, giúp sử dụng hết các ô nhớ Ram. Số lượng vật thể đếm được cũng theo đó mà được tối ưu. Tỉ dụ như Ram sử dụng có độ dài 10 bits, ta có thể theo đó đếm được 1022 vật thể. Thực tế nếu trong hình có nhiểu đối tượng có cấu trúc phức tạp, hay nhiều đường cong, biến Count dùng để đánh nhãn sẽ nhanh chóng bị tràn cho dù có dùng độ dài bit lớn đến đâu đi nữa. Chẳng hạn với ví dụ trên ta có thề thấy một vật nhưng có đến 3 nhãn, điều này làm phung phí tài nguyên không cần thiết. Vấn đề nảy sinh tiếp theo là tìm cách sử dụng lại những nhãn không cần thiết nữa, một đối tượng dùng một nhãn là đủ. Cách giải quyết hiệu quả nhất là dùng bộ Fifo. Các nhãn đã được cập nhật thay đổi giá trị sẽ đưa vào Fifo lưu trữ, khi cần sẽ lấy ra theo thứ tự, điều này giúp các nhãn được sử dụng dồn hẳn về đầu Ram, tức các địa chỉ có giá trị nhỏ, theo kiểu sắp xếp, thuận lợi cho việc xác định vật thể sau này. Để đếm số lượng vật thể trong ảnh, ta đếm dựa vào các ô nhớ trong Ram. Xét lần lượt các địa chỉ của Ram, nếu địa chỉ ô nhớ giống với giá trị trong đó thì được một vật thể, trừ địa chỉ ô nhớ “0”. Việc này thực thi vào cuối mỗi frame hình, khi có cạnh lên hoặc xuống của vsync tùy theo thuật toán sử dụng sao cho phù hợp giữa chốt lấy giá trị biến đếm number và reset các biến. Hình 5.9: Số lượng vật được xác định đựa vào Ram Theo thí dụ trên đây, các nhãn 1,2,3 đều có chung giá trị 1, vậy chúng cùng thuộc 1 đối tượng, nhãn 4 thuộc đối tượng tiếp theo, cứ thế cho đến ô địa chỉ Ram cuối cùng. 5.4 On Screen Display ( OSD ) : Kết quả số lượng vật thể được xác định sẽ đưa sang cho module OSD cuối mỗi frame. Tất nhiên con số này ở dưới dạng nhị phân ( hoặc thập phân theo cách hiểu khi coding ), ta cần hiển thị nó thành font chữ số lên màn hình. Để hiển thị font chữ theo ý muốn, ta cần thay đổi các pixels gần nhau với cùng một màu theo hình dạng nào đó và phải có độ lớn đủ để nhìn thấy được. Yêu cầu là phải định vị trí hiển thị ở một chỗ cố định, mỗi frame hình đều lặp lại cùng chỗ đó, tạo nên hiệu ứng thị giác nhìn thấy được với tốc độ hiển thị vào khoảng 60 hình/giây. 5.4.1 Tạo font chữ số : Trước hết tạo ra một font chữ có sẵn, vị trí ngay chữ số, các pixel mang giá trị 1, các chỗ khác mang giá trị 0. Khi hiển thị, gặp bit 0 của font, pixel giữ nguyên như cũ, ngược lại gặp pixel 1 ta thay bằng 1 màu nhất định dễ nhìn. Font chữ này cũng được truy xuất nhằm hiển thị từ trái sang phải, từ trên xuống dưới theo đúng nguyên tắc của phần cứng. Ma trận font chữ này cũng giống như frame hình độ phân giải nhò nằm đè lên frame ảnh chính. Hình 5.10 : Tạo font hiển thị số 99 Như vậy font chữ thực chất là một ma trận các bit 0 hoặc 1 tạo thành cấu trúc chữ số, bộ nhớ Rom là lựa chọn hoàn hảo nhất. Đề tài sử dụng Rom có đường địa chỉ 12 bits, chứa font chữ : “0123456789QUANTITY OF OBJECTS :”, độ lớn chữ số là 12x16 pixels. Trong đó chữ “QUANTITY OF OBJECTS :” thì cố định đứng trước, phía sau là 3 chữ số được hiển thị tùy theo kết quả thuật toán đếm đối tượng. 5.4.2 Truy xuất từ Rom : Rom có địa chỉ để truy xuất từng bit trong đó, cho nên để thuận tiện việc đọc data từ Rom, ta sắp xếp font theo dạng như ví dụ trên sao cho mỗi số nằm gọn trong một khung ma trận 16x16 pixels. Khi muốn lấy ra chữ số nào ta đọc địa chỉ đầu mỗi khung đó và tăng dần đến hết khung ma trận cần thiết. Có lưu ý nhỏ, ta chọn kích cỡ 16 bởi nó được biểu diễn bằng 2³, dễ dàng lấy ra với phân đoạn địa chỉ 4 bis trong tổng số 12 bits. Cụ thể như sau : toàn địa chỉ address [12:0], address [12:8] chứa địa chỉ đầu các khung ma trận chữ số, address [7:4] chỉ chiều rộng của chữ 16 pixels ( chữ chiếm 12 pixels, còn lại 4 pixels là khoảng trắng giữa ), address [3:0] chỉ chiều cao 16 pixels. Khi hiển thị các số hàng trăm, chục và đơn vị, ta chỉ cần đưa thẳng số đó vào làm địa chỉ đầu của khung address [12:8]. Nhưng có một vấn đề nảy sinh ở đây, từ một số cố định, ta muốn biết số hàng trăm bao nhiêu thì chỉ cần chia cho 100 và lấy làm chẵn, không tính số lẻ, đó chính là con số cần thiết, tuy vậy phép toán nhân, chia, lấy số lẻ này không tự động cấu hình tự động được. Khi mô phỏng mà dịch code thì không có lỗi, nhưng map chân cấu hình các cổng logic thì hoàn toàn không được. Muốn thực thi các phép toán phức tạp này, cần sử dụng bộ tính toán, một core có sẵn để hỗ trợ, giống như tạo Ram hay Fifo vậy. May mắn là phép cộng, trừ có thể cấu hình không cần dùng đến bộ core này. Nhằm tránh độ phức tạp và các thời gian trễ không cần thiết khi sử dụng bộ core, ta sử dụng phép cộng, trừ để thực thi tìm ra các số hàng trăm, chục và đơn vị. Hàng trăm : so sánh trong khoảng, < 99 thì gán số hàng trăm là 0, < 199 là 1,... tuy hơi dài nhưng phù hợp cấu trúc toán tử rất mạnh của verilog là A = B ? C : D. Hàng đơn vị : dùng phép trừ 10 liên tiếp, đến khi nhỏ hơn 10, còn lại số đơn vị cần thiết. Trường hợp xấu nhất ta phải thực hiện 100 phép trừ, mất thời gian 100 clocks, vẫn rất nhanh. Hàng chục : được xác định sau cùng bởi phép tính cần đến số đơn vị. Hai công đoạn tính toán ở trên chỉ cần trong 1 line là hoàn tất. Trừ 100 liên tiếp cho đến khi nhỏ hơn 100, rồi trừ đi hàng đơn vị xác định được ở trên, ta được con số chia hết cho 10 nhỏ hơn 100. Lấy số này trừ liên tiếp cho 9 đến khi nhỏ hơn 10, ta được số hàng chục. 5.4.3 Định vị trí hiển thị trên monitor : Cách đơn giản nhất là dùng biến xCount đếm số pixels trên 1 line, yCount đếm số lines trên 1 frame ảnh, 2 biến đó chính là tọa độ để ta đặt khung chữ vào. Đề tài đặt khung chữ tại vị trí xCount = 10 ( pixel 10 ), yCount = 31 ( line 31 ). Có một chú ý nhỏ ở đây, ta reset biến xCount, yCount về 0 khi xCount = 1023, yCount = 768. Cách này hoàn toàn không chính xác trong thực tế dẫu đúng theo lý thuyết độ phân giải 1024x768. Khung chữ bị trôi liên tục trên màn hình, không thể cố định một chỗ. Bởi khi đo bằng mức điện áp các tín hiệu hsync, vsync và data_valid thì hsync có chu kỳ không đổi bất chấp vsync ở mức cao hay thấp. Tuy data_valid chỉ tích cực khi có vsync, nhưng độ phân giải lại không khớp, tức có đến 770 lines trên 1 frame. Vậy cách tốt nhất là reset xCount và yCount theo cạnh của tín hiệu hsync, vsync, data_valid. Số hiển thị ra màn hình chỉ có hàng trăm, mà biến đếm sử dụng độ dài 10 bits, tức 1024, khi đó nếu số lượng vật thể lớn hơn 999, hàng trăm vẫn chỉ có thể hiển thị số 9. Thực tế, số lượng vật thể đếm được tối đa là 1022, do ô nhớ 0 không sử dụng, ô nhớ cuối cùng 1023 liên tục bị thay đổi giá trị nếu nhãn này được đánh bởi đây là nhãn cuối củng sử dụng cho tất cả các đối tượng thừa ra trong ảnh. Nếu đếm được 1021 vật, màn hình sẽ hiển thị số 921. Đề tài chỉ có thể đếm và hiển thị chính xác tối đa 999 đối tượng. 5.5 Mô phỏng thuật toán : Nhằm đảm bảo thời gian xử lý phù hợp thực tế, cần tạo mẫu ảnh gồm một hay nhiều đối tượng có cấu trúc phức tạp nhiều đường cong, xiên và mô phỏng dạng sóng tạo được. Ta sử dụng phần mềm ISE để code thuật toán cho board thực nghiệm Xilinx ML 402 VIODC, dùng ISE Simulator để mô phỏng và cả tạo mẫu ảnh. Hình 5.11 : Giao diện tạo mẫu Hình 5.12: Vật mẫu màu đen trong khung ảnh 12x10 Kết quả mô phỏng, pixels được đánh nhãn chính xác, quá trình xử lý bị chậm 3 clocks tính từ lúc nhận được data, vẫn đảm bảo trong thời gian cho phép. Hình 5.13 : Kết quả đánh nhãn line 1 Hình 5.14 : Kết quả đánh nhãn line 2 Hình 5.15 : Kết quả đánh nhãn line 3 Hình 5.16 : Kết quả đánh nhãn line 4 Hình 5.17 : Kết quả đánh nhãn line 5 Hình 5.18 : Kết quả đánh nhãn line 6 Hình 5.19: Kết quả đánh nhãn line 7 Hình 5.20 : Kết quả đánh nhãn line 8 Hình 5.21 : Kết quả đánh nhãn line 9 Hình 5.22 : Kết quả đánh nhãn line 10 Hình 5.23 Kết quả sau khi đánh số Giá trị các nhãn trong Ram như sau : Hình 5.24 : Sau khi dán nhãn, giá trị trong các ô nhớ đã sử dụng đều có cùng giá trị Thời gian trễ 3 clocks ở trên là do quá trình truy xuất dữ liệu của Ram, Fifo đây là hạn chế không tránh khỏi nhưng vẫn có thể khắc phục khi đẩy lùi toàn bộ các tín hiệu lại 3 clocks, giữ được sự đồng bộ cần thiết. 5.7 Áp dụng thuật toán thực tế trên board : Sau khi mô phỏng thành công, ta áp dụng thực tế trên board. Code được dịch ra file .bit nạp xuống cấu hình cho VIODC. Kết quả, thuật toán xác định được chính xác số lượng vật thể trên ảnh, tuy còn lỗi về đồng bộ, gây ra viền đen bên phải và bên dưới khung hình. Độ trễ vài clocks nên vẫn không ảnh hưởng nhiều, thị giác không nhận ra sai biệt này. Hình 5.25 : Giao diện project ISE Mẫu đưa vào từ CPU là phông nền màu trắng, vật thể màu đen hoặc có màu sắc đậm nét. Kích cỡ vật phải không quá nhỏ, bởi đối với các chi tiết nhỏ như nhiễu, thuật toán hoạt động bị sai. Đề tài thực hiện công đoạn xác định đối tượng trong ảnh, là một phần trong quá trình nhận dạng vật cụ thể, do đó yêu cầu data vào vẫn phải đảm bảo một số tiêu chuẩn, thay cho bộ lọc phía trước. 5.8 Đề xuất mở rộng đề tài : 5.8.1 Ưu điểm : Đáp ứng yêu cầu xử lý thời gian thực, đồng bộ giữa tín hiệu vào ra, có thể chèn vào quá trình xử lý nào đó hoặc gỡ bỏ mà không ảnh hưởng đến timing. Tối ưu hóa tài nguyên sử dụng, xác định chính xác tối đa số lượng nhãn gán lên đối tượng, cụ thể là 1022/1024 ( 10 bits ). Hoạt động chuẩn xác với bất cứ hình dạng phức tạp nào của vật thể mà không cần lưu cả khung ảnh, giảm thiểu tối đa tài nguyên sử dụng. 5.8.2 Khuyết điểm : Chưa xác định chính xác các vật thể kích thước nhỏ, nét mảnh cụ thể như sau : Hình 5.26 : Số 1 dạng a và b Đề tài so sánh pixel đang xét và các pixels bên trên, phía trước nó nên với số dạng b, pixel liền kề không nằm theo phương thẳng, kết quả xác định là 2 đối tượng. Còn với số dạng a, đương nhiên thuật toán hoạt động chính xác. 5.8.3 Hướng phát triển : Khắc phục việc xác định sai các chi tiết nhỏ, ta mở rộng so sánh các pixel liền kề, cụ thể là toàn khung 2x2, 4x4 hay 8x8... Trong khung, diện tích đối tượng chiếm nhiều hơn tất nhiên sẽ xem đơn vị khung đó thuộc vật thể, ngược lại thì bỏ qua. Phương pháp này giống với làm đầy và làm mảnh trong bước tiền xử lý nhị phân hóa của hệ thống xử lý tín hiệu thực. Sở dĩ đề tài chưa ứng dụng phương pháp này vào là vì thời gian hạn chế và sẽ gây phức tạp thuật toán hơn bởi cần sử dụng nhiều tài nguyên hơn, đồng thời phải đảm bảo đồng bộ gần như tuyệt đối các tín hiệu vào ra, điều này vẫn còn là hạn chế chưa khắc phục được của đề tài như đã nói ở trên. Tuy nhiên trong thời gian tới, độ phân giải của ảnh được nâng cao, một nhóm các pixels liền kề nhau mới có thể tạo thành hình dạng thấy được, do đó thuật toán sẽ hoạt động chuẩn xác hơn. Sau quá trình này, ta biết được các thông số rất quan trọng của đối tượng, như vị trí trên hình, chu vi, diện tích trong ảnh,... Dựa vào đó ta có thể mở rộng một số ứng dụng sau : Nhận dạng mã vạch trên các thẻ, theo chiều rộng và khoảng cách giữa chúng. Nhận dạng biển số xe cho hệ thống gửi xe tự động, bởi font các số đều cùng một dạng và kích cỡ tương đương. Trong máy chấm các bài thi trắc nghiệm, các ảnh scan của chấm tròn là dữ liệu lý tưởng cho thuật toán nhận dạng. KẾT LUẬN Xử lý ảnh là quá trình phức tạp bao gồm nhiều bước khác nhau nhằm đạt đến mục đích riêng cho từng ứng dụng cụ thể. Có thể đó là nhận dạng mặt người, nhận dạng chữ viết tay, tìm đối tượng mong muốn... Đây là lĩnh vực rất hay, thu hút và nhiều hướng phát triển, ứng dụng vào các mặt khác nhau phục vụ cuộc sống con người. Đề tài chỉ thực hiện một bước nhỏ trong tiến trình này, nẳm trong công đoạn tiền xử lý ảnh. Để có thể thực hiện một công việc nhận dạng cụ thể đối tượng nào đó đòi hỏi toàn quá trình hoàn chỉnh phức tạp mà thời gian chưa cho phép đề tài thực hiện được. Thành công lớn nhất là đảm bảo dữ liệu trước và sau xử lý đồng bộ nhau, tức có thể dùng cho các ứng dụng khác nhau mà không ảnh hưởng cả quá trình về mặt thời gian, yêu cầu tối quan trọng trong xừ lý thời gian thực. Kết quả của đề tài cung cấp thông số cần thiết cho các ứng dụng về sau, dựa vào nhãn từng pixel trên đối tượng. Địa chỉ Ram sử dụng làm nhãn và giá trị trong Ram cũng hoàn toàn đúng, số lượng theo đó đếm được cũng không sai. Tuy vậy việc hiển thị số lượng vật thể trên màn hình được xem như thể hiện kết quả đề tài chứ chưa phải là ứng dụng cụ thể dựa vào các thông số trên. Tuy vẫn còn hạn chế về việc xác định chính xác đối tượng nhưng vẫn còn cách khắc phục tương đối trong tương lai, dẫu sao nhận dạng ảnh là quá trình không thể mang tính tuyệt đối bởi chính thị giác và não người là hệ thống xử lý ảnh hoàn hảo nhất, chưa một cỗ máy nào hiện nay mô phỏng được. Mở rộng đề tài hơn, ta có thể xác định chính xác hình dạng cụ thể của đối tượng nào đó, từ đơn giản đến phức tạp. Hai mặt quan trọng nhất trong khung ảnh là hình dạng và màu sắc thì một mặt đã được giải quyết khá tốt, tạo nên nền tảng cho các ứng dụng rộng rãi về sau. Cụ thể như nhận dạng vân tay, tái tạo hình ảnh, dò theo đối tượng mong muốn, ... So với hệ thống phần cứng đang ngày càng hỗ trợ được nhiều hơn, tài nguyên càng ngày càng mở rộng, sức mạnh và tốc độ xử lý tăng chóng mặt, thì việc tạo ra hệ thống nhận dạng đạt đến rồi vượt qua thị giác người không còn xa. Mặt xử lý không chỉ là “hiểu” dữ liệu có sẵn mà còn là tạo ra dữ liệu ảnh đáp ứng nhiều nhất trong lĩnh vực giải trí nghe nhìn. Tài liệu tham khảo : [1] Xilinx Inc, Video Starter Kit-User Guide, UG217 ( v1.5 ) October 26, 2006. [2] Xilinx Inc, Video Input/Output Daughter Card, UG235 ( v1.2.1 ) October 31, 2007, pages 33-42. [3] Marco Groeneveld, Lancerlot_User_Manual, September 12, 2004. [4] Xilinx Inc, ISE In-Depth Tutorial, pages 99-111. [5] 2230 Corporate Circle, Henderson, NV89014, Evita_Verilog, 1988, www.aldec.com [6] Lương Mạnh Bá, Nguyễn Thanh Thuỷ. Nhập môn xử lý ảnh số. Nhà xuất bản . Nhà xuất bản Khoa học và Kỹ thuật, 2003. [7] Võ Đức Khánh, Hoàng Văn Kiếm. Giáo trình xử lý ảnh số. Nhà xuất bản Đại học Quốc gia Thành phố Hồ Chi Minh. [8] Willam K. Pratt. Digital Image Processing: PIKS inside, Third Edition 2001, John Wiley & Sons, Inc. [9] Tow-Dimensional Signal and Image Processing Jae S.Lim - người dịch GS. Nguyễn Văn Thọ [10] Và một số sách báo tài liệu tham khảo từ internet

Các file đính kèm theo tài liệu này:

  • docLuan Van.doc
  • rarCounter.rar
  • pdfise8tut.pdf
  • pdfLancelot_User_Manual.pdf
  • pdfVideo input, output daughter card.pdf
  • pdfVideo Starter Kit-User Guide.pdf