Độ chính xác của chương trình nhận dạng biển số xe phụ thuộc vào ánh sáng
môi trường. Tuy nhiên yếu tố này ta có thể điều chỉnh được. Do thời gian làm đề tài đồ án tốt nghiệp có giới hạn nên việc làm đồ án nhận dạng biển số xe này còn nhiều sai sót mong thầy cô thông cảm.
Chương trình được viết bằng MATLAB đã giải quyết được bài toán nhận dạng ký tự thông qua lý thuyết về xử lý ảnh, qua đó cũng giải quyết được yêu cầu của đề tài đồ án đề ra.
Để giải quyết các khó khăn của đề tài, người thực hiện xin đề xuất 1 số ý kiến
sau đây:
Sử dụng camera chuyên dụng.
Thiết lập môi trường ổn định xung quanh để làm tăng độ chính xác của
ảnh chụp ( xác định 1 vị trí cố định để chụp ảnh).
96 trang |
Chia sẻ: ngoctoan84 | Lượt xem: 1956 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Nhận dạng, phân loại, xử lý ảnh biển số xe bằng phần mềm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ểu cấu tạo của nơron sinh học và nơron nhân tạo để thấy được sự tương quan giữa chúng.
Cấu trúc Nơron sinh học:
Nơron sinh vật có nhiều dạng khác nhau như dạng hình tháp, dạng tổ ong, dạng rễ cây. Tuy khác nhau về hình dạng, chúng có cấu trúc và nguyên lý hoạt động chung. Một tế bào nơron gồm bốn phần cơ bản:
Các nhánh và rễ: Các nhánh và rễ là các bộ phận nhận thông tin, các đầu nhạy hoặc các đầu ra của các nơron khác bám vào rễ hoặc nhánh của một nơron. Khi các đầu vào từ ngoài này có sự chênh lệch về nồng độ K+ , Na+ hay Cl- so với nồng độ bên trong của nó thì xẩy ra hiện tượng thấm từ ngoài vào trong thông qua một cơ chế màng thấm đặc biệt. Hiện tượng thẩm thấu như vậy tạo nên một cơ chế truyền đạt thông tin với hàng ngàn hàng vạn lối vào trên một nơron sinh vật, ứng với hàng nghìn hàng vạn liên kết khác nhau. Mức độ thẩm thấu được đặc trưng bởi cơ chế màng tượng trưng bằng một tỷ lệ. Tỷ lệ đó được gọi là tỷ trọng hay đơn giản gọi là trọng (Weight).
Thân thần kinh (Soma): Thân thần kinh chứa các nhân và cơ quan tổng hợp protein. Các ion vào được tổng hợp và biến đổi. Khi nồng độ các ion đạt đến một giá trị nhất định, xảy ra quá trình phát xung (hay kích thích). Xung đó được phát ở các đầu ra của nơron. Dây dẫn đầu ra xung được gọi là dây thần kinh.
Dây thần kinh (Axon): Dây thần kinh là đầu ra. Đó là phương tiện truyền dẫn tín hiệu. Dây thần kinh được cấu tạo gồm các đốt và có thể dài từ micro mét đến vài mét tuỳ từng kết cấu cụ thể. Đầu ra này có thể truyền tín hiệu đến các nơron khác.
Khớp thần kinh là bộ phận tiếp xúc của đầu ra nơron với rễ, nhánh của các nơron khác. Chúng có cấu trúc màng đặc biệt để tiếp nhận các tín hiệu khi có sự chênh lệch về nồng độ ion giữa bên trong và bên ngoài. Nếu độ lệch về nồng độ càng lớn thì việc truyền các ion càng nhiều và ngược lại. Mức độ thẩm thấu của các ion có thể coi là một đại lượng thay đổi tuỳ thuộc vào nồng độ như một giá trị đo thay đổi được gọi là trọng.
Trong não người có khoảng 15 tỷ nơron, mỗi nơron được nối với nhiều nơron khác bằng những khớp thần kinh (synapses), một nơron có thể có đến hơn nghìn synapses, và số synapses tổng cộng lại được ước lượng khoảng 1 triệu tỷ. Tín hiệu được truyền qua thân nơron tới các synapses, và tuỳ theo trạng thái của chúng mà một hay nhiều nơron khác sẽ được kích thích để tiếp tục truyền tín hiệu. Đó là mức thấp nhất, nhưng từ đó tổ chức lên các tầng trên như thế nào, có thể có được một bản đồ chi tiết của một bộ não tới từng nơron không?
Mạng nơron sinh vật tổ chức thành từng lớp (layer). Ta có:
Mạng một lớp: là tập hợp các phần tử nơron có đầu vào và đầu ra trên mỗi một phần tử. Nếu mạng nối đầu ra của các phần tử này với đầu vào của phần tử kia gọi là mạng tự liên kết (autoassociative).
Mạng hai lớp: gồm một lớp đầu vào và một lớp đầu ra riêng biệt.
Mạng nhiều lớp: gồm một lớp đầu vào và một lớp đầu ra riêng biệt. Các lớp nằm giữa lớp đầu vào và lớp đầu ra gọi là lớp ẩn (hidden layers).
Mạng truyền thẳng: là mạng hai hay nhiều lớp mà quá trình truyền tín hiệu từ đầu ra lớp này đến đầu vào lớp kia theo một hướng.
Mạng truyền ngược: là mạng mà trong đó một hoặc nhiều đầu ra của các phần tử lớp sau truyền ngược tới đầu vào của lớp trước.
Mạng tự tổ chức: là mạng có khả năng sử dụng những kinh nghiệm của quá khứ để thích ứng với những biến đổi của môi trường (không dự báo trước). Loại mạng này thuộc nhóm hệ học, thích nghi không cần có tín hiệu chỉ đạo từ bên ngoài.
Bảng sau đây đưa ra những con số cụ thể để có thể so sánh những ưu việt của bộ não con người so với một máy tính cá nhân mức trung bình hiện nay.
Máy tính
Bộ não người
Đơn vị tính toán
Bộ xử lý trung tâm với 105 mạch logic
Mạng 1011 nơron
Bộ nhớ
109 bit RAM
1011 nơron
Bộ nhớ ngoài
Trên 1010 bit bộ nhớ ngoài
Với 1014 khớp nối thần kinh
Thời gian xử lý
10-8 giây
10-3 giây
Thông lượng
109 bit/giây
1014 bit/giây
Cập nhật thông tin
105 bit/giây
1014 nơron/giây
Bảng 2.5.5.2.1: So sánh khả năng làm việc của bộ não và máy tính
Những nghiên cứu trên đây là cơ sở mở đường cho con người nghiên cứu phương pháp mô phỏng lại mạng nơron sinh vật, đó chính là mạng nơron nhân tạo.
Cấu trúc nơron nhân tạo:
Trên cơ sở cấu trúc của nơron sinh học tổng quát người ta đề xuất mô hình nơron nhân tạo gồm 3 phần chính:
Bộ tổng liên kết đầu vào
Bộ động học tuyến tính
Bộ phi tuyến
Bộ tổng liên kết đầu vào:
Là bộ tổng hợp các liên kết tại đầu vào của một phần tử nơron, mô tả như sau:
Hình 2.5.5.2.2a: Mô hình nơron nhân tạo
Trong đó:
V(t): Tổng tất cả các đầu vào mô tả toàn bộ thế năng tác động ở thân nơron.
xkt: Các đầu vào ngoài; với k là chỉ số chạy, k=1,2m.
m: Số lượng đầu vào mô tả tín hiệu vào từ các đầu nhạy thần kinh
wk: Trọng liên kết ngoài giữa các đầu vào k tới nơron hiện tại.
y(t): Tín hiệu đầu ra nơron.
θ: Ngưỡng (là hằng số), xác định ngưỡng kích thích hay ức chế.
Bộ động học tuyến tính:
Đầu vào của phần động học tuyến tính là v(t), đầu ra của nó là u(t) gọi là đầu ra tương tự. Hàm truyền tương ứng của phần động học tuyến tính có thể mô tả dưới dạng:
H(s) = U(s)V(s)
Các hàm H(s) thường dùng được liệt kê trong bảng dưới đây:
Bảng 2.5.5.2.2b: Các hàm truyền H(s) thường dùng
Bộ phi tuyến:
Phần này sử dụng hàm quan hệ phi tuyến f(.) cho đầu ra y, để chặn tính hiệu ở đầu ra. Các hàm đầu ra thông thường là các hàm có giới hạn ngưỡng phù hợp với đặc điểm đầu ra của nơron sinh học. Hàm dạng này thường được gọi là hàm kích hoạt (activation) thể hiện đặc điểm kích hoạt hay ức chế của một nơron.
Ngoài ra còn một số hàm khác cũng được sử dụng như dạng hàm Gauss, hàm logarit, hàm mũ, hàm arctg.
CHƯƠNG III: TỔNG QUAN VỀ HỆ THỐNG NHẬN DẠNG BIỂN SỐ XE MÁY
Khái quát chung về hệ thống nhận dạng biển số xe máy:
Cũng như mọi hệ thống khác, hệ thống nhận dạng biển số xe máy này yêu cầu có phần cứng và phần mềm. Phần cứng có phần chính là WebCam để thu nhận hình ảnh và phần mềm sẽ phân tích hình ảnh đó để lấy ra các ký tự trên biển số xe.
Quá trình thu nhận biển số xe được thực hiện theo sơ đồ sau:
Hình 3.1: Sơ đồ quá trình nhận dạng biển số xe máy
Tách biển số: Khối này có chức năng tách biển số từ ảnh chụp bằng các phương pháp xử lý ảnh. Kết quả của khối là ảnh màu RBG (Red Green Blue) được cắt ra từ ảnh chụp. Đây là một công việc rất khó khăn vì ta không biết được vị trí chính xác của biển số. Ngoài ra, còn phụ thuộc vào độ sáng của ảnh chụp.
Phân đoạn ký tự: Sau khi tách biển số, chúng ta bắt đầu phân đoạn ký tự. Khối này thực hiện tách từng kí tự có trong biển số, tạo thành tập ảnh riêng biệt các ký tự phục vụ việc nhận dạng ký tự. Ảnh của mỗi ký tự là ảnh trắng đen.
Nhận dạng ký tự: Sau khi phân đoạn, tách được các ký tự trong biển số và tạo thành một chuỗi ký tự. Chuỗi này đưa vào khối nhận dạng dạng để tiến hành nhận dạng từng ký tự trong chuỗi
Chụp hình bằng camera:
Hình 3.2.1: Hình ảnh chụp từ camera
Đây là khâu quan trọng nhất của hệ thống bởi vì nếu ảnh chụp bị mờ hay nhiễu thì khi đưa vào nhận dạng sẽ không được. Để chụp ảnh thì ta có thể sử dụng camera hoặc WebCam. Khi lựa chọn thiết bị thì ta cần quan tâm tới các thông số quyết định tới chất lượng ảnh như:
Độ phân giải (resolution):
Độ phân giải (Resolution) của ảnh là mật độ điểm ảnh được ấn định trên một ảnh số được hiển thị. Theo định nghĩa, khoảng cách giữa các điểm ảnh phải được chọn sao cho mắt người vẫn thấy được sự liên tục của ảnh. Việc lựa chọn khoảng cách thích hợp tạo nên một mật độ phân bổ, đó chính là độ phân giải và được phân bố theo trục x và y trong không gian hai chiều.
Ví dụ: Độ phân giải của ảnh trên màn hình CGA (Color Graphic Adaptor) là một lưới điểm theo chiều ngang màn hình: 320 điểm chiều dọc x 200 điểm ảnh (320x200). Rõ ràng, cùng màn hình CGA 12” ta nhận thấy mịn hơn màn hình CGA 17” độ phân giải 320x200. Lý do: cùng một mật độ (độ phân giải) nhưng diện tích màn hình rộng hơn thì độ mịn (liên tục của các điểm) kém hơn.
Độ phân giải càng lớn thì chất lượng hình ảnh càng nét. Thường thì trong các ứng dụng không cần thiết phải quan sát thật rõ nét thì độ phân giải 420 TV Lines là hoàn toàn có thể chấp nhận được.
Số điểm ảnh ( CCD Total Pixels ):
Thông số này nói lên chất lượng hình ảnh, số điểm ảnh càng lớn thì chất lưọng hình ảnh càng tốt, tuy nhiên, chất lượng hình ảnh càng tốt thì cũng đồng nghĩa với dung lưọng ảnh càng lớn, và sẽ tốn bộ nhớ lưu trữ cũng như ảnh hưỏng đến tốc độ đường truyền.
Hình 3.2.2: Số điểm ảnh (pixel)
Điều kiện hoạt động của thiết bị:
Cường độ ánh sáng nhỏ nhất ( Minimum Illumination ):Thường được tính bằng Lux. Thông số này nói lên rằng, WebCam(Camera) chỉ có thể hoạt động ở cường độ ánh sáng lớn hơn cường độ ánh sáng nhỏ nhất. Trong điều kiện quá tối, nếu không phải là Camera có chức năng hồng ngoại thì sẽ không hoạt động được.
Ánh nắng mặt trời: 4000 lux, có mây: 1000lux
Ánh sáng đèn tuýp: 500 lux, có mây: 300lux
Ánh sáng đèn tuýp đỏ 500 lux, trắng (300 lux) trắng sáng 1lux
Đêm không trăng: 0.0001 Lux
Chú ý: loại Camera quan sát có chức năng Auto Iris (Tự động hiệu chỉnh ánh sáng). Đặc điểm của Camera loại này là chỉ với 1 nguồn sáng nhỏ, nó có thể tự động khuyếch đại nguồn sáng đó lên để có thể quan sát được.
Nguồn cung cấp ( Power Supply ): Hiện nay đa số các WebCam đều sử dụng nguồn máy tính(Laptop),Camera quan sát đều dùng loại nguồn 12VDC, chỉ một số ít các Camera dùng nguồn khác. Tuy nhiên, bạn không phải lo lắng đến vấn đề nguồn 12VDC, vì phần lớn các công ty bán camera quan sát đều bán bộ chuyển đổi nguồn, do đó bạn có thể sử dụng trực tiếp nguồn 220VAC.
Dải nhiệt độ hoạt động (Operatinon Temperature): Phần lớn các Camera quan sát đều cho phép hoạt động trong dải nhiệt độ -100C ~ 500C, nếu Camera của bạn được sử dụng trong những điều kiện khắc nghiệt như trong công nghiệp, khu vực có nhiệt độ cao thì bạn nên sử dụng các loại Camera quan sát chuyên dụng trong công nghiệp.
Độ ẩm cho phép (Operational Humidity): Thông thường, độ ẩm cho phép là 90% RH (độ ảm tương đối).
Tách biển số:
Tổng quan về tách biển số:
Tách biển số là một bước rất quan trọng trong quá trình nhận dạng biển số xe. Khối tách biển số xe được chia làm 2 giai đoạn chính:
Giai đoạn 1: định vị trí của biển số trong ảnh chụp từ webcam.
Giai đoạn 2: dùng các giải thuật để cắt biển số xe ra khỏi ảnh chụp và xoay biển số xe về phương ngang.
Ảnh RGB chỉ chứa biển số
Cắt và xoay biển số xe về phương ngang
Định vị trí của biển số xe máy
Ảnh RGB được chụp từ webcam
Hình 3.3.1a: Sơ đồ tổng quát của khối tách biển số
Việc định vị biển số xe dựa vào các tính chất của biển số như: hình dạng, màu sắc của biển số so với nền. Biển số xe có hình chữ nhật với kích thước chiều dài và rộng không thay đổi. Từ đó chúng ta có thể tìm các vùng có hình tứ giác trong hình, tính tỉ lệ giữa hai chiều của hình so với khoảng giá trị cho trước để xem thử vùng đó có chứa biển số hay không. Ngoài ra, định vị biển số còn dựa trên màu sắc của biển số. Hầu hết các biển số xe Việt Nam đều nền trắng, chữ đen. Kết hợp hai tính chất trên, chúng ta xác định được vùng chứa biển số.
Sau khi định vị biển số xe, chúng ta tiến hành cắt biển số xe. Biển số xe được cắt theo 2 bước. Bước đầu tiên là cắt vùng rộng hơn vùng chứa biển số. Sau đó tìm góc nghiêng của biển số và thực hiện xoay biển số về phương thẳng đứng. Bước hai là cắt biển số ra khỏi vùng trên. Thực hiện việc cắt biển số qua hai bước như trên làm tăng độ chính xác, biển số được cắt nguyên vẹn, không cắt phạm chữ, trừ trường hợp ảnh bị chói, độ tương phản không đều hoặc bị che khuất thì kết quả của việc tách biển số mới không chính xác.
Phần tách biển số sử dụng rất nhiều giải thuật và phương pháp xử lý đối với ảnh số như sơ đồ sau đây:
Ảnh RGB
Tìm vùng màu trắng
Biến đổi ảnh RGB ảnh trắng đen.
Đánh số các vùng màu trắng.
Tìm các vùng có diện tích phù hợp.
Xác định vùng chứa biển số
Dò các cạnh của biển số.
Tính tỉ lệ của chiều cao trên chiều ngang .
Chọn vùng có tỉ lệ thích hợp.
Cắt vùng chứa biển số
Cắt vùng lớn hơn biển số trong ảnh RGB.
Biến đổi sang ảnh xám.
Xử lý tăng độ tương phản.
Tìm góc nghiêng và xoay
Biến đổi ảnh xám sang đen trắng .
Dùng biến đổi Randon tìm góc nghiêng.
Xoay ảnh tuyến tính.
Phân tích giản đồ ngang dọc.
Xác định tọa độ cắt ngang, dọc.
Cắt chính xác biển số.
Cắt chính xác biển số
Ảnh RGB chỉ chứa biển số
Hình 3.3.1b: Sơ đồ chi tiết của khối tách biển số
Tìm vùng màu trắng:
Vì biển số màu trắng nên người thực hiện sẽ nhị phân hóa ảnh bằng cách gắn giá trị cho các pixel trắng là 1, còn ngược lại là 0. Đầu tiên, chúng ta sẽ biến đổi ảnh gốc thành ảnh xám (có mức sáng từ 0 đến 255), sau đó nhị phân hóa với một ngưỡng thích hợp. Nếu ảnh được chụp vào ban đêm hay ban ngày nhưng ít ánh sáng thì mức ngưỡng sẽ là 120. Còn ban ngày, nhiều ánh sáng là 190. Vấn đề ở đây là làm sao chúng ta nhận biết được đó là ảnh sáng hay ảnh tối? Người thực hiện đã dựa vào lược đồ mức xám ( histogram – tần số xuất hiện của mức xám ) của ảnh. Nếu tần số xuất hiện các pixel có giá trị <64 thì đó là ảnh tối, ngược lại là ảnh sáng.
Ví dụ cho hai ảnh gốc có biển số như sau:
Hình 3.3.2a: Ảnh tối và ảnh sáng
Ảnh sau khi nhị phân hóa sẽ như sau:
Hình 3.3.2b: Ảnh sau khi nhị phân
Xác định vùng chứa biển số:
Ảnh nhận được sau khi nhị phân hóa sẽ có nhiều vùng màu trắng, và biển số sẽ nằm trong vùng màu trắng thỏa điều kiện:
0.75 < chiều cao / chiều ngang < 0.91
16000 ≤ S_pixel_trắng ≤ 61000
≤ S_pixel_trắng / S_biển số ≤ 0.7
Với:
Chiều cao là H
Chiều ngang là W
Diện tích vùng trắng là S_pixel_trắng
Diện tích biển số là S_biển số
Tỉ số 2 kích thước của biển số là 0.75 nhưng khi bị nghiêng thì là 0.91
Hình 3.3.3a: Hình dạng biển số khi bị nghiêng
Sau điều kiện thứ nhất, sẽ có những vùng trắng không chứa biển số nhưng có tỉ số giữa chiều cao và chiều ngang phù hợp thì vẫn được chọn. Ta sẽ loại bỏ những vùng này bằng điều kiện thứ hai – diện tích vùng trắng. Vì khoảng cách từ webcam tới xe cố định (ta lấy trước khoảng cách chụp ) nên số lượng pixel trắng chứa trong biển số cố định.
Đối với điều kiện thứ ba, nếu biển số nằm ngay ngắn thì tỉ số là 0.7 còn nếu biển số bị nghiêng, sẽ xuất hiện pixel đen nên tỉ số này giảm còn 0.38.
Hình 3.3.3b: Biển số sau khi nhị phân
Cắt vùng chứa biển số:
Sau khi xác định được vùng nào chứa biển số, ta tiến hành cắt biển số trên ảnh màu RBG. Do sự tương đồng của ảnh nhị phân và ảnh màu RBG nên toạ độ một pixel trên ảnh nhị phân tương ứng tọa độ trên ảnh màu RBG. Do đó khi xác định được tọa độ trên ảnh nhị phân, ta dùng tọa độ này để cắt trên ảnh màu RBG.
Khi ta cắt biển số ra khỏi ảnh mà biển số bị nghiêng thì ta tiến hành cắt theo hình chữ nhật lớn hơn hình chữ nhật lớn thực sự một lượng biên an toàn để tránh việc mất thông tin biển số.
Hình 3.3.4a: Hình thể hiện vùng ảnh cần tách ra với biên an toàn
Trong chương trình, chọn vùng biên an toàn là 30 pixel.
Trong bước này, ta không cắt biển số ra khỏi ảnh ngay mà chỉ cắt vùng chứa biển số. Việc cắt này có thể xem như là cắt thô.
Hình 3.3.4b: Ảnh chụp ban đầu
Hình 3.3.4c: Ảnh sau khi cắt thô
Tìm góc nghiêng và xoay:
Biến đổi Radon:
Tổng quan về biến đổi Radon:
Biến đổi Radon dùng để biến đổi các ảnh trong không gian 2 chiều với các đường thẳng thành miền Radon, trong đó mỗi đường thẳng trong ảnh sẽ cho 1 điểm trong miền Radon.
Công thức toán học của biến đổi Radon:
R(θ,ρ)= -∞+∞A(ρcosθ-ssinθ,ρsinθ+scosθ)ds
Phương trình trên biểu diễn việc lấy tích phân dọc theo đường thẳng s trên ảnh, trong đó ρ là khoảng cách của đường thẳng so với gốc tọa đô O, và θ là góc lệch so với phương ngang.
Hình 3.3.5.1.1a: Phương pháp biến đổi Radon
Trong xử lý ảnh số, biến đổi Radon tính toán hình chiếu của ma trận ảnh dọc theo một hướng xác định. Hình chiếu của 1 hàm số 2 chiều là f(x,y) là tập hợp các tích phân đường. Hàm Radon tính toán tích phân đường dọc theo các tia song song theo các phương khác nhau ( bằng cách xoay hệ trục tọa độ xung quanh O theo các giá trị θ khác nhau ), chiều rộng của các tia là 1 pixel. Hình dưới đây biểu diễn 1 hình chiếu đơn giản theo 1 giá trị của góc θ .
Hình 3.3.5.1.1b: Hình chiếu đơn giản theo góc θ
Công thức tổng quát trên có thể viết lại như sau:
Rθ=-∞∞fx'cosθ-y'sinθ,x'sinθ+y'cosθdy'
Với: x'y'= cosθ sinθ-sinθ cosθ xy
Hình sau sẽ biễu diễn phương pháp biến đổi Radon dưới dạng hình học:
Hình 3.3.5.1.1c: Phương pháp biến đổi Radon dưới dạng hình học
Các bước thực hiện:
Biến đổi ảnh về ảnh nhị phân:
Hình 3.3.5.1.2a: Biến đổi ảnh về ảnh nhị phân
Thực hiện biến đổi Radon trên ảnh biên với θ = 0:180
Giá trị R của biến đổi Radon được biểu diễn như sau:
Hình 3.3.5.1.2b: Thực hiện biến đổi Radon trên ảnh biên
Tìm giá trị lớn nhất của R trong biến đổi Radon.
Vị trí các giá trị lớn nhất này tương ứng với các giá trị của đường thẳng trong ảnh ban đầu.
Tìm góc nghiêng và xoay:
Biển số được chụp với nhiều góc nghiêng khác nhau, do đó ta phải tìm góc nghiêng và xoay về phương thẳng. Đây là việc rất quan trọng, vì nếu không quay về phương thẳng thì khi cắt biển số sẽ bị phạm vào biển số. Chúng ta xác định góc nghiêng bằng phương pháp biến đổi Radon.
Trước khi biến đổi Radon, ảnh chứa biển số được biến đổi thành ảnh được tách biên nhị phân.
Hình 3.3.5.2a: Ảnh được tách biên biên nhị phân
Sau đó, ta tiến hành biến đổi Radon để tìm góc xoay. Thực hiện biến đổi Radon với góc θ chạy trong khoảng ( 0: 180), ta sẽ được một ma trận với các điểm R(θ) với từng góc θ và tọa độ pixel tương ứng.
Sau khi biến đổi Radon, chúng ta xác định được góc Rmax, ứng với Rmax thì ta có được θ max và góc lệch là ( 90˚ - θ max ). Sau đó ta sử dụng hàm Rotate trong MATLAB để xoay ảnh với góc lệch tìm được.
Hình 3.3.5.2b: Ảnh biển số sau khi xoay về phương thẳng đứng.
Và đây là giải thuật của bước này:
BEGIN
END
Góc của biển số so với phương ngang
Thực hiện biến đổi Radon
Lấy biên ảnh
Chuyển đổi thành ảnh đa mức xám
Biển số đầu vào
Hình 3.3.5.2c: Giải thuật tìm góc nghiêng biển số.
Cắt biển số chính xác:
Sau khi xoay biển số về phương thẳng đứng ta thực hiện việc cắt biển số. Đây là một việc rất quan trọng, kết quả của nó quyết định tới kết quả của hệ thống nhận dạng biển số.
Ta thực hiện lại việc chọn vùng biển số:
Hình 3.3.6: Biển số sau khi cắt hoàn chỉnh
Sau khi cắt được biển số ta tiến hành phân đoạn ký tự .
Phân đoạn ký tự:
Tổng quan về phân đoạn ký tự:
Kết quả của khối tách biển số là một ảnh màu RBG có chứa biển số xe. Để nhận dạng các ký tự trong biển số, ta tiến hành phân đoạn ký tự trong biển số. Phân đoạn ký tự là việc cắt các ký tự trong biển số xe .
Sau khi nhận kết quả của khối tách biển số, khối phân đoạn ký tự bắt đầu tiến hành tách từng ký tự trong biển số. Trước khi phân đoạn ký tự, ảnh của biển số được chuyển thành ảnh nhị phân. Ảnh nhị phân được chuẩn hóa về kích chuẩn, sau đó tiến hành cắt các ký tự. Kết quả của quá trình phân đoạn là một ma trận chứa các ảnh đen trắng của ký tự.
Nhị Phân Biển số xe
Chuẩn hóa biển số xe
Ảnh RGB của biển số
Ma trận chứa ảnh của từng ký tự
Phân đoạn ký tự
Hình 3.4.1: Sơ đồ khối phân đoạn ký tự
Nhị phân biển số xe:
Đây là bước quan trọng để nhận dạng biển số xe. Bước này sẽ tìm mức ngưỡng tối ưu, sau đó tiến hành nhị phân hóa ảnh với ngưỡng vừa tìm được ( nhằm làm tăng độ tương phản của ký tự với nền biển số ).
Hình 3.4.2: Ảnh sau khi được nhị phân.
Chuẩn hóa biển số:
Biển số được chuẩn hóa, sau đó được lấy bù:
Hình 3.4.3a: Ảnh biển số sau khi được chuẩn hóa
END
Định dạng kích cỡ
Lấy bù
Ảnh nhị phân của biển số
BEGIN
Hình 3.4.3b: Thuật giải chuẩn hóa biển số
Phân đoạn ký tự:
Ma trận nhị phân của biển số chính là ngõ vào của chương trình phân vùng ký tự. Trước khi phân vùng ký tự, ta chia ma trận ảnh biển số thành từng hàng và lần lượt đưa từng hàng vào chương trình phân vùng. Tuy nhiên, ở đây, ta chỉ tiến hành nhận dạng ký tự của hàng 2 nên ta chỉ ngỏ vào của chương trình phân vùng ký tự là ma trận của hàng 2.
Để phân chia thành nhiều ma trận ký tự từ ma trận biển số, ta dựa vào tổng số pixel mức 1 ( mức 1 là màu trắng- màu của ký tự, mức 0 là màu đen – màu của nền). Với ma trận của hàng 2 sau khi đã chia đôi, giữa 2 ký tự có rất ít pixel có mức 1 (trong trường hợp lý tưởng, thì sẽ là 0 ). Như vậy khi cộng giá trị các pixel theo từng cột, như hình sau, ta thấy giá trị tại các vùng giữa 2 ký tự rất thấp ( đây cũng là tổng số pixel mức 1). Từ đó, giải thuật phân vùng sẽ những vùng này dựa vào giá trị của nó nhỏ hơn những vùng lân cận và sẽ phân chia thành từng vùng. Ở đây, ta sẽ tìm 4 phân vùng tương ứng với 4 ký tự.
Hình 3.4.4a: Tổng số các bít theo 1 hàng của biển số
Chương trình có lựa chọn 2 thông số: Min_area và digit_width.
Min_area là diện tích cho phép nhỏ nhất của 1 ký tự, là tích của giá trị cột lớn
nhất với độ rộng của phân vùng đó.
Hình 3.4.4b: Hình thể hiện thông số Min_area
Digit_width là độ rộng tối đa cho phép của 1 phân vùng ký tự.
Hình 3.4.4c: Hình thể hiện thông số Digit_width
Sau khi phân vùng được các ký tự ta tiến hành cắt các ký tự ra khỏi biển số.
Hình 3.4.4d: Các ký tự được cắt khỏi biển số
BEGIN
Dưới đây là sơ đồ thuật giải khi phân vùng 9 ký tự trên biển số xe:
Biển số
x
Chương trình chia đôi biển số (Phân vùng ảnh)
Chuyển đổi thành ma trận ảnh
Chương trình phân vùng từng kí tự
Kí tự 1
Kí tự 2
Kí tự 9
END
............
Hình 3.4.4e: Giải thuật phân vùng ký tự
Chương trình chia đôi biển số:
Đây là chương trình đơn giản, biển số sau khi được chuẩn hóa về kích thước
[50 150] thì kích thước từng hàng sau khi chia đôi là [25 150].
Chương trình phân vùng từng ký tự:
Chương trình con này thực hiện việc tìm vùng ranh giới giữa 2 ký tự, tương ứng giữa 2 vùng ranh giới liên tiếp sẽ là vùng ký tự, chương trình sẽ trả về vị trí của vùng ký tự. Tuy nhiên, chương trình cũng có thể trả về số vùng ký tự lớn hơn 9 do ảnh hưởng của môi trường. Trường hợp này ta vẫn có thể tối ưu chuơng trình để tăng độ chính xác.
Với kết quả trả về nhỏ hơn 9, ta sẽ xóa các pixel tại các vùng ranh giới ( gắn các giá trị đó bằng 0 ). Điều này làm cho việc thực hiện chương trình chính xác hơn.
Với kết quả trả về lớn hơn 9 ( nghĩa là có 1 hay nhiều vùng không chứa ký tự ), ta sẽ lấy 9 vùng có diện tích lớn nhất ( vì thông thường, các vùng không có ký tự nhỏ hơn các vùng có ký tự ).
Nhận dạng ký tự:
Tổng quát nhận dạng ký tự:
Sau khi thực hiện phân vùng ta sẽ được 9 ma trận tương ứng với 9 ký tự trên 2 hàng biển số. Lần lượt từng ma trận ký tự sẽ được đưa vào chương trình nhận dạng. Kết quả cuối cùng sẽ là 9 ký tự số và chữ, chương trình sẽ hiển thị ký tự này dưới dạng text.
Thực chất, quá trình nhận dạng là quá trình đổi ma trận điểm ảnh của các ký tự thành mã ASCII tương ứng với ký tự đó. Để làm được điều này người ta đem so sánh ma trận của ký tự với tất cả các ma trận trong tập mẫu, ma trận mẫu nào có khả năng giống nhiều nhất thì có chính là ký tự cần tìm.
Trong lĩnh vực nhân dạng, có 2 phương pháp để nhận dạng là phương pháp cổ điển và phương pháp sử dụng mạng Nơron.
Lựa chọn phương pháp:
Phương pháp nhận dạng cổ điển:
Giới thiệu phương pháp:
Phương pháp này sẽ có 1 tập ma trận ký tự mẫu. Phương pháp này khá đơn giản: ma trận ký tự cần nhận dạng khá giống với ma trận ký tự đó trong tập mẫu. Ví dụ, ta nhận dạng các số từ 0 đến 9 thì trong tập mẫu, ta sẽ tạo ra các ma trận ký tự từ 0 đến 9. Giả sử ma trận cần nhận dạng là số 1 thì ma trận này nhìn bằng mắt thấy cũng khá giống sao với ma trận số 1 trong tập mẫu.
Ưu nhược điểm của phương pháp:
Phương pháp này tuy đơn giản nhưng hiệu quả trong trường hợp tập ảnh nhận dạng rõ nét, ít bị nhiễu. Nếu ảnh bị nhiễu thì ma trận đầu vào thay đổi, lúc này tập mẫu sẽ không còn chính xác. Trong 1 vài trường hợp biển số ban đầu bị nghiêng hoặc lệch, khi ta xoay và chuẩn hóa kích thước thì các ký tự bị nhiễu và khi so sánh với tập mẫu cũng không còn chính xác.
Phương pháp ứng dụng mạng Nơron:
Cũng như phương pháp cổ điển, ta nhận dạng các ký tự nhờ vào vị trí và hàng của ký tự đó trên biển số, nhưng ở đây ta sử dụng nhiều tập mẫu để so sánh qua đó làm tăng độ chính xác khi nhận dạng. Hơn nữa trong MATLAB, có TOOLBOX hỗ trợ về phần Nơron làm cho việc nhận dạng trở nên dễ dàng hơn.
Vì lý do trên mà khi tiến hành nhận dạng ký tự, em đã chọn phương pháp nhận dạng dùng mạng Nơron.
Giới thiệu về mạng Nơron ( neural networks):
Khái niệm về mạng Nơron:
Mạng nơron (Neural networks) phát triển từ các nghiên cứu về trí tuệ nhân tạo, dựa trên việc mô phỏng cấp thấp hệ thống Nơron sinh học – cố gắng bắt chước khả năng học và chấp nhận sai của bộ não có cấu trúc thấp.
Đích
KẾT QUẢ
So sánh
Mạng Nơron với các trọng số và ngõ vào tương ứng
Ngõ Vào Ngõ Ra
Điều chỉnh trọng số
Hình 3.5.3.1: Mô tả toán học tổng quát của mạng Nơron
Tín hiệu ngõ vào sau khi qua mạng nơron sẽ được tính toán và ngõ ra của mạng sẽ được so sánh với tín hiệu đích mong muốn. Mạng sẽ tiếp tục cập nhật và điều chỉnh trọng số và ngưỡng cho đến khi thỏa mãn ngõ ra yêu cầu và xuất ra kết quả mong muốn.
Mô hình của một mạng nơron nhân tạo:
Nơron nhân tạo có 1 số ngõ vào ( từ các dữ liệu gốc và từ ngõ ra của các nơron khác). Mỗi kết nối đến ngõ vào đều có 1 cường độ ( hay trọng số ). Ngõ vào của nơron có thể vô hướng hay hữu hướng. Mỗi nơron có 1 giá trị ngưỡng. Tín hiệu được truyền qua hàm kích hoạt ( hay là hàm truyền) tạo giá trị ngõ ra của nơron.
Σ
f
Ngõ vào Ngõ ra
Ngưỡng
Hình 3.5.3.2a: Nơron 1 ngõ vào
Σ
f
Ngõ vào Ngõ ra
Ngưỡng
Hình 3.5.3.2b: Nơron nhiều ngõ vào
Thiết kế 1 mạng Nơron:
Thu thập dữ liệu:
Trước hết ta cần xác định được tập dữ liệu – là tập bao gồm một số trường hợp, mỗi tập hợp chứa giá trị của ngõ vào và ngõ ra khác nhau. Sau đó xác định những biến nào sẽ được sử dụng, bao nhiêu trường hợp cần thu thập. Việc lựa chọn các biến được sử dung thường do trực giác quyết định và thường phụ thuộc vào công việc chuyên môn và lĩnh vực mà nó được ứng dụng.
Các bước thực hiện:
Chọn cấu hình ban đầu (thường là 1 lớp ẩn có số nơron ẩn bằng nửa tổng số nơron ngõ vào và ngõ ra).
Thực hiện lặp đi lặp lại số thí nghiệm của mỗi cấu hình, giữ lại mạng tốt nhất (thường dựa vào sai số).
Trong mỗi lần thí nghiệm nếu xảy ra việc học chưa đủ ( kết quả thí nghiệm không đạt được xác suất như yêu cầu ) thì thử tăng số nơron trong lớp ẩn. Nếu xảy ra việc học quá mức ( sai số ban đầu tăng lên ) thì hãy bỏ bớt 1 vài nơron ẩn ( có thể bỏ lớp ẩn).
Cơ sở ký thuyết và giải thuật cho huấn luyện mạng lan truyền ngược:
Cấu trúc mạng lan tryền ngược:
Các loại nơron: (tansig, logsig, purelin)
Một loại nơron có R ngõ vào thể hiện như sau:
Hình 3.5.3.4.1a: Cấu tạo 1 nơron
Mỗi ngõ vào tương ứng với 1 trọng số w. Tổng của giá trị ngưỡng b với tích của các ngõ vào và các trọng số sẽ là ngõ vào của hàm truyền f ( f(Wp+b) ). Nơron
dùng nhiều hàm truyền khác nhau để tính toán ngõ ra. Mạng nhiều lớp thường dùng
hàm truyền log-signoid (logsig).
Hình 3.5.3.4.1b: Hàm truyền logsig
Hàm logsig tính toán giá trị ngõ ra nằm trong khoảng 0 và 1 trong khi giá trị ngõ vào từ -∞ đến +∞.
Tiếp đến là hàm truyền tan-signiod ( tansig)
Hình 3.5.3.4.1c: Hàm truyền tansig
Hiếm khi hàm truyền tuyến tính (purelin) được sử dụng trong mạng lan truyền ngược ( thường chỉ sử dụng phổ biến trong mạng tuyến tính).
Hình 3.5.3.4.1d: Hàm truyền purelin (tuyến tính)
Cấu trúc các lớp trog mạng lan truyền ngược:
Mạng 1 lớp với S nơron logsig có R ngõ vào được thể hiện như hình bên trái,còn bên phải là sơ đồ khối các lớp
S: Số nơron trong 1 lớp
R: Số ngõ vào
Hình 3.5.3.4.1e: Cấu trúc mạng 1 lớp
Mạng lan truyền ngược với các nơron có hàm truyền đạt phi tuyến cho phép nơron học được những mối liên quan tuyến tính và phi tuyến giữa ngõ vào và ngõ ra.
Nếu giới hạn ngõ ra là 0 và 1 thì nên dùng hàm truyền logsig
Mô hình mạng 2 lớp như sau:
Hình 3.5.3.4.1f: Cấu trúc mạng 2 lớp
Huấn luyện mạng lan truyền ngược:
Mạng lan truyền ngược được huấn luyện để xấp xỉ 1 hàm phi tuyến , một mô hình liên kết hay phân lớp. Trong suốt quá trình huấn luyện, các trọng số và giá trị ngưỡng sẽ được điều chỉnh 1 cách hợp lý để làm tối thiểu giá trị hàm lỗi của mạng.
Hàm lỗi mặc định trong mạng lan truyền ngược là trung bình phương lỗi (mean square error hay mse ) – lỗi trung bình phương giữa ngõ ra thực tế và ngõ ra được tính toán. Sau đây là 1 vài thuật toán huấn luyện mạng lan truyền ngược. Tất cả các thuật toán đều dùng độ dốc (gradient) của hàm lỗi để điều chỉnh các trọng số sao cho tối thiểu được giá trị hàm lỗi. Độ dốc được tính toán dựa vào kỹ thuật lan truyền ngược.
Độ dốc Gradient:
Trong thuật toán lan truyền ngược, vector gradient của mặt phẳng sai số sẽ được tính toán. Vector này chỉ ra đường dốc nhất và vị trí hiện tại, vì thế nếu ta di chuyển theo nó 1 khoảng ngắn ta có thể đạt giá trị nhỏ nhất.
Tuy nhiên khó khăn ở đây là quyết định độ lớp của từng bước di chuyển. Bước lớn có thể hội tụ nhanh hơn nhưng có thể vượt quá điểm cần đến hay ra khỏi vùng có cực tiểu ( nếu mặt phẳng sai số bị lệch tâm). Ngược lại bước nhỏ có thể đi đến đúng hướng nhưng phải thực hiện lặp lại nhiều lần.
Quy tắc thích nghi:
Phương pháp thực ra rất đơn giản. Mỗi phương pháp có 1 hệ số học e khác nhau. Khi cập nhật trọng số, nếu hướng lỗi hiện hành cùng bước với hướng trước cho e lớn, còn ngược hướng cho e nhỏ.
Hướng lỗi được xác định là dấu của dm, là đạo hàm riêng của hàm lỗi theo trọng số ở bước m. Nếu dm dương, lỗi giảm khi trọng số giảm, nếu dm âm, lỗi giảm khi trong số tăng.
fm+1=θfm+ (1-θ) dm
Nếu ta cho f là trung bình trọng số của các đạo hàm hiện tại và quá khứ, θ là trọng số của các hàm quá khứ , (1-θ ) là trọng số của các hàm hiện tại. Nếu f dương thì đây là lỗi “ giảm khi trọng số giảm ” và ngược lại cũng như đối với đạo hàm.
Dựa vào f và ta có thể đo chính xác cả hướng của lỗi đang giảm lẫn hướng của lỗi vừa mới giảm. Nếu chúng cùng dấu, việc giảm lỗi xảy ra theo hướng cũ, chúng khác dấu, ngược hướng với hướng cũ.
Giảm độ dốc liên hợp:
Đây là thuật toán định hướng đường, bằng cách lấy ra 1 hướng nhạy để di chuyển theo chiều ngang đa chiều, rồi chiếu đường thẳng theo hướng đó để xác định điểm nhỏ nhất và lặp lại. Hướng nhạy là hướng có độ dốc lớn nhất . Ý tưởng ở đây là khi thuật toán đã được cực tiểu hóa dọc theo 1 hướng cụ thể hóa nào đó, thì đạo hàm bậc 2 dọc theo hướng đó phải giữ ở zero. Các hướng liên hợp được giữ đạo hàm bậc 2 này với giả thiết mặt phẳng này là parabol. Nếu điều kiện này được giữ, hàm sẽ đủ đạt được giá trị cực tiểu.
Levenberg – Marquardt:
Là kỹ thuật mô phỏng vùng tin cậy: thay vì theo 1 định hướng cố định, ta giả sử mặt phẳng có hình dạng đơn giản sao cho cực tiểu có thể định vị trực tiếp, nếu giả thiết đúng. Thử mô hình và xem xét mức độ tốt của điểm được chọn. Mô hình được giả sử rằng mặt phẳng có hình dạng tốt sẽ đúng nếu gần đạt được cực tiểu. Ngoài điểm đó giả thiết có thể bị vi phạm, và mô hình có thể chọn những điểm sai để di chuyển. Mô hình chỉ có thể được tin cậy trong 1 vùng của điểm hiện tại và kích thước của vùng này thì chưa biết. Do đó, chọn các điểm mới để kiểm tra với điểm được chọn. Nếu điểm mới tốt, di chuyển đến điểm đó và tăng cường vai trò của mô hình trong việc lựa chọn điểm mới, còn nếu xấu, không di chuyển và tăng cường vai trò của bước dốc gradient trong việc lựa chọn điểm mới.
Ứng dụng mạng lan truyền ngược vào nhận dạng ký tự :
Mạng lan truyền ngược được ứng dụng rộng rãi trong các vấn đề thực tế liên quan đến mạng nơron. Việc thiết kế đơn giản cũng nhưng giải thuật huấn luyện hội tụ nhanh đã thể hiện mạng lan truyền ngược là 1 công cụ rất mạnh và phổ biến, đặc biệt trong vấn đề nhận dạng ký tự có cùng font, do đó việc ứng dụng nó cho 1 kết quả khả quan.
Thiết kế mạng lan truyền ngược:
Các ký tự số sau khi được phân vùng sẽ được định chuẩn với kích thước 20×10. Sau đó ma trận ảnh của ký tự sẽ chuyển đổi thành ma trận một cột và trở thành ngõ vào của mạng nơron. Như vậy, ta dùng vị trí của giá trị lớn nhất của nơron ngõ ra, từ đó có thể biết được giá trị của ký tự số đó. Tập mẫu huấn luyện càng nhiều thì độ chính xác càng lớn.
Mạng nuôi tuyến lan truyền ngược gồm 2 lớp nơron trong đó:
Lớp vào : 200 ngõ vào ( tương ứng với ma trận ký tự 20×10 sau khi chuyển thành ma trận cột ).
Lớp ẩn: 20 nơron
Lớp ngõ ra : 10 nơron ( tương ứng để nhận dạng 10 ký tự số từ 0 đến 9)
Dùng hàm truyền logsig có nơron lớp ẩn và lớp ngõ ra.
Hình 3.5.4.1: Cấu trúc mạng dùng để nhận dạng ký tự số.
Quá trình nhận dạng:
Mạng sau khi được huấn luyện đưa vào sử dụng sẽ thực hiện nhận dạng đối với các ma trận ký tự số. Ví dụ, ma trận đầu vào lúc này là ma trận số 6. Như vậy, nếu mạng huấn luyện được kết quả tốt thì kết quả lan truyền ma trận này trong mạng là neural tương ứng với vị trí số 6 ( trong hình này là nơron thứ 6) sẽ có giá trị lớn nhất.
Hình 3.5.4.2: Hình minh họa hoạt động của mạng trong nhận dạng
Phương pháp tăng khả năng tổng quát của mạng:
Một trong những vấn đề xuất hiện trong việc huấn luyện mạng nơron được gọi là quá khớp. Lỗi trong tập huấn luyện có giá trị rất nhỏ nhưng khi đưa dữ liệu mới vào mạng thì lỗi lại quá lớn. Nghĩa là mạng có khả năng nhớ những tập huấn luyện rất tốt nhưng chưa có khả năng tổng quát đối với dữ liệu mới.
Hình sau thể hiện đáp ứng của mạng nơron được huấn luyện để xấp xỉ 1 hàm sin. Mạng như vậy sẽ quá khớp với dữ liệu và không có khả năng tổng quát.
Hình 3.5.4.3a: Trường hợp quá khớp
Có rất nhiều phương pháp để giải quyết vấn đề này, trong đó phương pháp ngừng học sớm được xem là phương pháp hiệu quả nhất.
Phương pháp ngừng học sớm:
Phương pháp này dùng 3 tập mẫu, một tập dùng để huấn luyện, một tập dùng để kiểm tra và một tập dùng để thử lại. Trong quá trình học tập mẫu huấn luyện thì lỗi của tập mẫu kiểm tra cũng được giám sát. Trong quá trình học tập thì lỗi của tập huấn luyện và kiểm tra đều giảm nhưng đến một lúc nào đó thì lỗi của tập huấn luyện bắt đầu tăng lên, lúc này xảy ra việc mạng nơron bắt đầu quá khớp với tập huấn luyện. Chính vì vậy ta cho dừng quá trình huấn luyện, thì tại thời điểm này, ta có mạng nơron có khả năng tổng quát nhất, lúc này lỗi của tập thử lại ( không có trong tập huấn luyện và tập kiểm tra) là lỗi của một dữ liệu mới.
Hình 3.5.4.3b: Hàm xấp xỉ khi mạng ngừng học sớm.
Huấn luyện mạng lan truyền ngược:
Việc huấn luyện có ý nghĩa quyết định đến độ chính xác cũng như sự thành công của chương trình. Kích thước của tập mẫu, số nơron của lớp ẩn, khả năng tổng quát hóa để tránh trường hợp quá khớp của mạng cũng cần được cân nhắc và tính toán kỹ lưỡng để tăng độ chính xác của quá trình nhận dạng ký tự. Để tăng khả năng tổng quát của nơron, ta sẽ có 3 tập mẫu: một tập để huấn luyện, một tập để kiểm tra, một tập để thử lại. Trong quá trình học, khi hàm lỗi của tập kiểm tra bắt đầu tăng thì cho dừng học, thời điểm này, nơron có khả năng tổng quát, và lỗi của tập mẫu thử lại cũng chính là lỗi của 1 đối tượng bất kì nào đưa vào mạng.
Số lượng mẫu của các tập mẫu như sau:
Tập mẫu huấn luyện gồm 30 mẫu cho mỗi ký tự số từ 0 đến 9.
Tập mẫu dùng để kiểm tra gồm 5 mẫu cho mỗi ký tự.
Tập mẫu dùng để thử lại gồm 5 mẫu cho mỗi ký tự.
Hình 3.5.4.4: Hàm lỗi khi ngừng học sớm để huấn luyện mạng.
CHƯƠNG IV: KẾT QUẢ MÔ PHỎNG CHẠY BẰNG PHẦN MỀM
MATLAB VÀ CODE CỦA CHƯƠNG TRÌNH
Kết quả mô phỏng chạy bằng phần mềm matlab:
Giao diện giới thiệu của chương trình:
Hình 4.1.1: Giao diện giới thiệu của chương trình chạy bằng matlab
Giao diện chính của chương trình:
Hình 4.1.2: Giao diện chính của chương trình chạy bằng matlab
Hướng dẫn sử dụng chương trình:
Nhấn vào “Main” để bật giao diện chính của chương trình
Hình 4.1.3: Hướng dẫn bật giao diện chính
Test bằng ảnh trong thư viện:
Chọn “ Ảnh trong thư viện”
Hình 4.1.3.1a: Hướng dẫn chọn ảnh trong thư viện
Chọn một ảnh trong thư viện Nhấn “Open”
Hệ thống sẽ tự động nhận dạng và xuất ra kết quả dạng text.
Hình 4.1.3.1b: Chọn một ảnh trong thư viện
Kết quả nhận được:
Hình 4.1.3.1c: Kết quả nhận dạng
Kết quả khi xuất ra file Excel:
Hình 4.1.3.1d: Kết quả khi xuất ra file Excel
Test ảnh bằng camera:
Chọn camera “1”
Hình 4.1.3.2a: Chọn camera
Chọn “Mở camera”
Hình 4.1.3.2b: Chọn mở camera
Chọn “Chạy” để nhận dạng biển số
Hình 4.1.3.2c: Chọn chạy để nhận dạng biển số
Kết quả khi xuất ra file Excel:
Hình 1.3.2d: Kết quả xuất ra Excel
Code chương trình:
Code hiển thị giao diện của chương trình:
function axes2_CreateFcn(hObject, eventdata, handles)
% hObject handle to axes2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
imshow('logoa.jpg');
function axes3_CreateFcn(hObject, eventdata, handles)
% hObject handle to axes3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
imshow('logokhoa.jpg');
% Hint: place code in OpeningFcn to populate axes3
Code chương trình chính:
Chương trình test bằng camera:
Chương trình khi nhấn chọn camera
% --- Executes on button press in get_camera.
function get_camera_Callback(hObject, eventdata, handles)
% hObject handle to get_camera (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of get_camera
global vid
if get(hObject,'value')
if ~isempty(vid)&& strcmp('on',get(vid,'Running'))
set(handles.run_button,'enable','on');
set(handles.off_line_,'enable','off');
set(handles.analysic_button,'enable','off');
set(handles.radiobutton1,'value',0);
else
errordlg('Camera chua san sang, chon lai camera!');
set(hObject,'value',0);
end
else
set(handles.run_button,'enable','off');
set(handles.off_line_,'enable','on');
set(handles.analysic_button,'enable','on')
end
Chương trình chụp ảnh từ camera
% --- Executes on button press in pushbutton40.
function pushbutton40_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton40 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
stop(handles.timer1);
global ID;
global vid;
global data
vid=videoinput('winvideo',ID,'YUY2_640x480','returnedcolorspace','rgb');
vid.TriggerRepeat = Inf;
triggerconfig(vid, 'manual');
set(vid,'Framespertrigger',1);
start(vid);
set(handles.run_button,'enable','on');
start(handles.timer1);
data.check=1;
Chương trình nhận dạng khi test bằng camera
% --- Executes on button press in run_button.
function run_button_Callback(hObject, eventdata, handles)
% hObject handle to run_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global data;
global vid
stop(handles.timer1);
trigger(vid);
data.rgb=getdata(vid);
try
xu_ly(hObject,eventdata,handles);
catch e
errordlg(e.message);
start(handles.timer1);
end
start(handles.timer1);
Chương trình xuất kết quả ra Excel
% --- Executes on button press in pushbutton39.
function pushbutton39_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton39 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global data;
set(hObject,'Enable','off');
pause(0.25);
xlswrite('data.xls',data.TD);
winopen('data.xls');
set(hObject,'Enable','off');
Lưu kết quả trong Excel
% --- Executes on button press in save_button.
function save_button_Callback(hObject, eventdata, handles)
% hObject handle to save_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
s=get(handles.name_edit,'string');
s=sprintf('%s.xls',s);
xlswrite(s,handles.result);
set(handles.open_button,'enable','on');
Chương trình cắt biển số xe máy:
% --- Executes on button press in recognize_button.
function recognize_button_Callback(hObject, eventdata, handles)
% hObject handle to recognize_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
X='';
for i=1:length(handles.digits1)
x=my_num_recog(handles.digits1{i},handles.numbers,handles.chars,1);
X=cat(2,X,x);
end
Y='';
for i=1:length(handles.digits2)
y=my_num_recog(handles.digits2{i},handles.numbers,handles.chars,2);
Y=cat(2,Y,y);
end
s=sprintf('%s - %s',X,Y);
handles.count=handles.count+1;
handles.result{handles.count,1}=s;
set(handles.result_text,'string',s);
set(handles.save_button,'enable','on');
guidata(hObject,handles);
Chương trình tách biển số:
function [im1,im2]=tach1( rgb )
%TACH1 Summary of this function goes here
% Detailed explanation goes here
g=rgb2gray(rgb);
g=imadjust(g);
% g1=255-g;
g1=imadjust(g,[0 1],[1 0],2);
g1=imadjust(g1);
g1=imclearborder(g1,8);
g1=imadjust(g1);
bw=edge(g1,'canny');
bw=imdilate(bw,[0 1 0; 1 1 1; 0 1 0]);
bw=imfill(bw,'holes');
bw=imopen(bw,strel('disk',2));
stat=regionprops(bw,'Area','Image','BoundingBox','Centroid');
count=0;
for i=1:length(stat)
a=stat(i).Area; % Dien tich cac doi tuong
b=stat(i).Image;% anh crop cua cac doi tuong
d=stat(i).BoundingBox(1:2);% Khung bao cua cac doi tuong
[r,c]=size(b);% Lay kich thuoc
if r>c && c>0.2*r&& c<0.55*r
count=count+1;
t(count,1)=a;% luu lai dien tich
t(count,2)=i;% luu lai vi tri
t(count,3)=round(r*c);% lay kich thuoc anh
t(count,4:5)=[d(2),d(1)];% Lay Vi Tri ?i?m ??u
end
end
n=length(t);
t=sortrows(t,1);% Xep theo dien tich tang dan
count=0;
if n>=9 % truong hop phat hien nhieu hon 9 doi tuong
ts=t(end-8:end,:);% lay 9 doi tuong co dien tich lon nhat
su=sum(ts(:,3))/9;
for i=1:9
if ts(i,3)>0.2*su;
count=count+1;
ts1(count,:)=ts(i,:);
end
end
else
ts1=t;
end
ts1=sortrows(ts1,4);
t1=ts1(1:4,:);
t1=sortrows(t1,5);
t2=ts1(5:end,:);
t2=sortrows(t2,5);
n1=size(t1,1);
im1=cell(1,n1);
n2=size(t2,1);
im2=cell(1,n2);
for i=1:n1
a=(stat(t1(i,2)).BoundingBox);
b=imcrop(rgb,a);
b=rgb2gray(b);
b=imadjust(b);
b=imadjust(b,[0 1],[1 0],2);
b=im2bw(b);
b=my_BwTrim(b);
b=imopen(b,strel('disk',1));
im1{i}=b;
end
for i=1:n2
a=(stat(t2(i,2)).BoundingBox);
b=imcrop(rgb,a);
b=rgb2gray(b);
b=imadjust(b);
b=imadjust(b,[0 1],[1 0],2);
b=im2bw(b);
b=my_BwTrim(b);
b=imopen(b,strel('disk',1));
im2{i}=b;
end
end
Chương trình biến đổi ảnh vào thành ảnh nhị phân
function y = inputanh(rgb)
%INPUTANH Summary of this function goes here
% Detailed explanation goes here
gray=rgb2gray(rgb); % chuyen anh mau thanh anh xam
gray=imadjust(gray);% can bang cuong do sang
[row,col]=size(gray);% Lay kich thuoc anh
cp=[round(row/2),round(col/2)];% toa do diem tam
de=round(0.01*row);% khoang cong tru
cm1=cp(1)-de:cp(1)+de;% khoang thoa man theo hang
cm2=cp(2)-de:cp(2)+de;% khoang thoa man theo cot
doituongnho=round(0.02*row*col);% so diem anh doi tuong nho
biensonho=[round(0.08*row),round(0.08*19*row/14)];% bien so duoc cho la nho
thresh=0; % khoi tao nguong
check=0; % khoi tao kiem tra
while check==0
thresh=thresh+0.01;
if thresh==1
msgbox('Khong phat hien duoc bien so');
break;
else
bw=im2bw(gray,thresh);
bw=bwareaopen(bw,doituongnho);
bw=imfill(bw,'holes');
bw=imclearborder(bw,4);
bw=imopen(bw,strel('rectangle',biensonho));
[L,n]=bwlabel(bw);
% close all;imshow(bw);
if n>0
for i=1:n
[row1,col1]=find(bw==i);
a=sum(ismember(cm1,row1));
b=sum(ismember(cm2,col1));
stat=regionprops((L==i),'BoundingBox');%xac dinh hinh chu nhat bao quanh
try
mat=stat.BoundingBox;
if a>0&&b>0&&mat(4)<mat(3)
check=1;
% bw=(L==i);
break;
else
check=0;
end
catch e
msgbox(e.message);
end
end
end
end
end
%img la anh nhi phan cua bang so
if thresh<1
rgbcrop=imcrop(rgb,mat);
y=rgbcrop;
else
y=rgb;
end
end
Chương trình điều chỉnh góc xoay của biển số:
function y= angle(rgb )
%ANGLE Summary of this function goes here
% Detailed explanation goes here
gray=rgb2gray(rgb);
BW=edge(gray,'canny');
BW=imclose(BW,strel('line',10,90));
[H,theta,rho] = hough(BW);
P = houghpeaks(H,1,'threshold',ceil(0.3*max(H(:))));
lines = houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7);
% figure, imshow(rgb), hold on
max_len = 0;
p=0;
for k = 1:length(lines)
% xy = [lines(k).point1; lines(k).point2];
% plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
% Plot beginnings and ends of lines
% plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
% plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
p=k;
end
end
A=lines(p).point1;
B=lines(p).point2;
goc=atan2(B(2)-A(2),B(1)-A(1));
goc=rad2deg(goc);
if goc <80
y=imrotate(rgb,goc,'crop');
end
end
Chuỗi ký tự số và chữ cái của biển số:
function y= ind2char( ind )
%IND2CHAR Summary of this function goes here
% Detailed explanation goes here
y='NaN';
switch ind
case 1
y='0';
case 2
y='1';
case 3
y='2';
case 4
y='3';
case 5
y='4';
case 6
y='5';
case 7
y='6';
case 8
y='7';
case 9
y='8';
case 10
y='9';
case 11
y='A';
case 12
y='B';
case 13
y='C';
case 14
y='D';
case 15
y='F';
case 16
y='G';
case 17
y='H';
case 18
y='K';
case 19
y='L';
case 20
y='M';
case 21
y='N';
case 22
y='P';
case 23
y='S';
case 24
y='T';
case 25
y='U';
case 26
y='V';
case 27
y='X';
case 28
y='Y';
case 29
y='Z';
end
end
Chương trình test bằng ảnh trong thư viện:
% --- Executes on button press in off_line_.
function off_line__Callback(hObject, eventdata, handles)
% hObject handle to off_line_ (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global data
if strcmp('on',get(handles.timer1,'Running'))
stop(handles.timer1);
data.check=1;
end
set(hObject,'Enable','off');
pause(0.25);
for i=1:8
set(gcf,'CurrentAxes',handles.tren{i});
imshow(ones(90,40));
set(gcf,'CurrentAxes',handles.duoi{i});
imshow(ones(90,40));
end
set(gcf,'CurrentAxes',handles.axes2);
imshow(ones(90,40))
oldFolder=cd;
if exist('a.mat','file')
load a.mat
[fName, dirName] = uigetfile({'*.bmp;*.tif;*.jpg;*.tiff;*.png'},'Chon Anh',dirName);
else
[fName, dirName] = uigetfile('*.bmp;*.tif;*.jpg;*.tiff;*.png');
end
if dirName~=0
save('a.mat','dirName');
end
if fName
cd(dirName);
data.rgb=imread(fName);
cd(oldFolder);
set(gcf,'CurrentAxes',handles.axes1);
imshow(data.rgb);
end
%% Xu Ly
try
xu_ly(hObject,eventdata,handles);
catch e
errordlg(e.message);
end
set(hObject,'enable','on');
if data.check==1
start(handles.timer1);
end
guidata(hObject,handles);
%%
function xu_ly(hObject,eventdata,handles)
load data.mat;
global data
for i=1:5
set(gcf,'CurrentAxes',handles.tren{i});
imshow(ones(90,40));
set(gcf,'CurrentAxes',handles.duoi{i});
imshow(ones(90,40));
end
set(gcf,'CurrentAxes',handles.axes2);
imshow(imread('wait.jpg'));
pause(0.15);
pause(0.15);
[r,aaa]=size(data.rgb);
if r>640
data.rgb=imresize(data.rgb,[680 NaN]);
end
y=inputanh(data.rgb);
y=angle(y);
set(gcf,'CurrentAxes',handles.axes2);
imshow(y);
[im1, im2]=tach1(y);
n1=length(im1);
if n1>0
S1='';
for i=1:n1
set(gcf,'CurrentAxes',handles.tren{i});
im1{i}=imresize(im1{i},[90,40]);
switch i
case 1
x=my_num_recog(im1{i},numbers);
S1=cat(2,S1,x);
case 2
x=my_num_recog(im1{i},numbers);
S1=cat(2,S1,x);
case 3
x=my_num_recog(im1{i},chars);
S1=cat(2,S1,x);
case 4
x=my_num_recog(im1{i},numbers);
S1=cat(2,S1,x);
end
imshow(im1{i});
end
end
n2=length(im2);
if n2>0
S2='';
for i=1:n2
set(gcf,'CurrentAxes',handles.duoi{i});
im2{i}=imresize(im2{i},[90,40]);
x=my_num_recog(im2{i},numbers);
S2=cat(2,S2,x);
imshow(im2{i});
end
end
set(handles.result_text,'string',sprintf('%s-%s',S1,S2));
data.count=data.count+1;
a=clock;
s1=sprintf('%d - %d - %d',a(3),a(2),a(1));
s2=sprintf('%d:%d:%d',a(4),a(5),round(a(6)));
data.TD{data.count,1}=num2str(data.count-1);
data.TD{data.count,2}=s1;
data.TD{data.count,3}=s2;
data.TD{data.count,4}=sprintf('%s-%s',S1,S2);
set(handles.uitable1,'Data',data.TD);
pause(0.25);
KẾT LUẬN
Độ chính xác của chương trình nhận dạng biển số xe phụ thuộc vào ánh sáng
môi trường. Tuy nhiên yếu tố này ta có thể điều chỉnh được. Do thời gian làm đề tài đồ án tốt nghiệp có giới hạn nên việc làm đồ án nhận dạng biển số xe này còn nhiều sai sót mong thầy cô thông cảm.
Chương trình được viết bằng MATLAB đã giải quyết được bài toán nhận dạng ký tự thông qua lý thuyết về xử lý ảnh, qua đó cũng giải quyết được yêu cầu của đề tài đồ án đề ra.
Để giải quyết các khó khăn của đề tài, người thực hiện xin đề xuất 1 số ý kiến
sau đây:
Sử dụng camera chuyên dụng.
Thiết lập môi trường ổn định xung quanh để làm tăng độ chính xác của
ảnh chụp ( xác định 1 vị trí cố định để chụp ảnh).
Qua đề tài này một lần nữa em xin chân thành cảm ơn thầy Th.s Nguyễn Tường Thành đã tận tình hướng dẫn và chỉ bảo em trong suốt khoảng thời gian qua để em có thể hoàn thành tốt đề tài đồ án tốt nghiệp của mình. Bản thân em cũng đã có rất nhiều cố gắng để tìm hiểu các nội dung nghiên cứu. Tuy nhiên, việc nghiên cứu đề tài này cũng phức tạp và do thời gian có hạn nên việc nghiên cứu cặn kẽ tất cả các khía cạnh của đề tài là rất khó khăn. Do vậy chắc chắn đồ án này sẽ không tránh khỏi những thiếu sót. Rất mong sự đóng góp ý kiến của các thầy cô giáo cùng các bạn để đồ án của em được hoàn thiện hơn.
Em xin chân thành cảm ơn!
Sinh viên thực hiện đề tài
Hồ Xuân Hiền
TÀI LIỆU THAM KHẢO
[1] PGS.TS Nguyễn Quang Hoan (2006), Giáo trình xử lý ảnh, Học viện công nghệ bưu chính viễn thông, Xuất Bản Hà Nội.
[2] Lương Mạnh Bá, Nguyễn Thanh Thủy (2000), Nhập môn xử lý ảnh số, Đại Học Bách Khoa Hà Nội, Giáo dục.
[3] Thầy Nguyễn Thanh Hải, Giáo trình Xử lý ảnh (tiếng Anh), Đại học Sư phạm kỹ thuật thành phố Hồ Chí Minh.
[4] IPLab Project, , Xem 3/12/2018
[5] , Xem 25/10/2018
[6] , Xem lần cuối 10/12/2018
[7] , Xem 14/11/2018
Các file đính kèm theo tài liệu này:
- nhandangbiensoxe_4978_2104759.docx