iệc đếm số lượng đối tượng là một nhiêm vụ khá phổ biến trong các ngành công nghiệp bằng các phương pháp khác nhau. Đếm số lượng đối tượng được sử dụng để thu được số lượng nhất định các yếu tố từ ảnh. Vì thế, bài toán đếm đối tượng trong ảnh là một đề tài khá mới mẻ và đang được chú ý để phát triển với phép đếm tự động bởi tầm nhin máy tính để tiết kiệm thời gian, công sức
Trang 1KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH -
ARDUINO HIỂN THỊ TRÊN LCD
GVHD: ThS Nguyễn Duy Thảo
SVTH: Phan Thành Hưng
MSSV: 13141125
Tp Hồ Chí Minh - 1/2018
Trang 2KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
ARDUINO HIỂN THỊ TRÊN LCD
GVHD: ThS Nguyễn Duy Thảo SVTH: Phan Thành Hưng
Tp Hồ Chí Minh - 1/2018
Trang 3KHOA ĐIỆN-ĐIỆN TỬ Độc lập – Tự do – Hạnh phúc
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
TP Hồ Chí Minh, ngày 15 tháng 1 năm 2018
BẢNG MÔ TẢ CÔNG VIỆC
Họ tên sinh viên 1: PHAN THÀNH HƯNG MSSV: 13141125
Lớp: 13141DT3A
Họ tên sinh viên 2: TRẦN VĂN THẠCH MSSV: 13141304
Lớp: 13141DT3A
Tên đề tài: ĐẾM ĐỐI TƯỢNG TRONG ẢNH.
1 MÔ TẢ MỤC TIÊU CỦA ĐỀ TÀI:
Mục tiêu của đề tài là xây dựng một hệ thống đếm đối tượng trong ảnh được chụp bằng camera, nhúng dữ liệu đếm được xuống kit Arduino để điều khiển LCD hiển thị kết quả đếm được
Đề tài sử dụng thuật toán đánh nhãn để đối tượng trong ảnh Xây dựng giao diện
để người dùng có thể dễ dàng thao tác Viết hướng dẫn thao tác sử dụng hệ thống
2 MÔ TẢ CÔNG VIỆC THỰC HIỆN ĐỀ TÀI CỦA TỪNG SINH VIÊN:
Họ tên Sinh viên 1: PHAN THÀNH HƯNG
Các công việc thực hiện trong đề tài:
1 Tham khảo tài liệu liên quan đến đề tài của những tác giả đã thực hiện
2 Viết chương trình đếm đối tượng( thuật toán đánh nhãn), điều khiển kit Arduino
3 Chỉnh sửa hệ thống
4 Viết báo cáo
Trang 4Các công việc thực hiện trong đề tài:
1 Tham khảo tài liệu liên quan đến đề tài của những tác giả đã thực hiện
2 Viết chương trình đếm đối tượng (thuật toán đánh nhãn), điều khiển kit
Arduino
3 Chụp ảnh phục vụ cho quá trình đếm đối tượng
4 Chỉnh sửa báo cáo
XÁC NHẬN CỦA GIẢNG VIÊN HƯỚNG DẪN
(Ký ghi rõ họ tên)
Trang 5BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
Tp HCM, ngày 15 tháng 1 năm 2018
NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP
Họ tên sinh viên: Phan Thành Hưng MSSV: 13141125
Trần Văn Thạch MSSV: 13141304Chuyên ngành: Kỹ thuật Điện Tử Truyền Thông Mã ngành: 01
Hệ đào tạo: Đại học chính quy Mã hệ: 1
Khóa: 2013 Lớp: 13141DT3A
I TÊN ĐỀ TÀI: THIẾT KẾ VÀ THI CÔNG HỆ THỐNG ĐẾM SỐ LƯỢNG TRONG
ẢNH SỬ DỤNG KÍT ARDUINO HIỂN THỊ TRÊN LCD
II NHIỆM VỤ
1 Các số liệu ban đầu:
Bộ ảnh đếm: 30 ảnh gồm 10 ảnh tế bào, 10 ảnh cây gỗ, 10 ảnh vỉ thuốc
Matlab phiên bản 2015a
Kit điều khiển chính: Arduino Uno R3, LCD 16x2
2 Nội dung thực hiện:
Đề tài thực hiện nội dung xây dựng hệ thống đếm đối tượng qua hình ảnh với đầu vào là ảnh chứa các đối tượng( tế bào, cây, vỉ thuốc) Kết quả đếm được sẽ được nhúng
dữ liệu điều khiển tương ứng xuống kit Arduino Nhóm sẽ thực hiện các nội dung như sau:
Tìm hiểu kit Arduino
Cài đặt nguồn thư viện cho kit Arduino, cách kết nối Arduino với Matlab
Tìm hiểu các thuật toán đánh nhãn
Xây dựng quá trình xử lý ảnh đầu vào
Xây dựng hệ thống đếm đối tượng trong ảnh, lập trình các ứng dụng nhúng dữ liệu trên kit Arduino
Đánh giá kết quả thực hiện
III NGÀY GIAO NHIỆM VỤ: 25/09/2017
IV NGÀY HOÀN THÀNH NHIỆM VỤ: 15/01/2018
V HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: ThS Nguyễn Duy Thảo
CÁN BỘ HƯỚNG DẪN BM ĐIỆN TỬ CÔNG NGHIỆP – Y SINH
Trang 6Bộ Môn Điện Tử Công Nghiệp – Y Sinh
Tp Hồ Chí Minh, ngày 15 tháng 1 năm 2018
Tên đề tài: THIẾT KẾ VÀ THI CÔNG HỆ THỐNG ĐẾM SỐ LƯỢNG TRONG ẢNH
SỬ DỤNG KÍT ARDUINO HIỂN THỊ TRÊN LCD.
GVHD Tuần 1,2 Tìm đề tài
Tuần 3 Tìm hiểu hoạt động Arduino và Matlab
Tuần 4 Cài đặt Matlab, kết nối Arduino với Matlab
Tuần 5,6 Lập trình Arduino với các chân I/O để nhúng dữ liệu
Tuần 7,8,9 Lập trình và xây dựng chương trình xử lý ảnh đầu vào
Tuần 10,11,12 Lập trình chương trình đếm đối tượng trong ảnh và
chương trình giao diện người dùng
Tuần 13,14 Hiệu chỉnh toàn bộ chương trình
Tuần 15,16,17 Viết báo cáo đồ án
Tuần 18 Chỉnh sửa, in đồ án
GV HƯỚNG DẪN (Ký và ghi rõ họ và tên)
Trang 7Chúng tôi cam đoan ĐATN là công trình nghiên cứu của bản thân chúng tôi dưới sự hướng dẫn của Thạc sỹ Nguyễn Duy Thảo
Các kết quả công bố trong ĐATN “Thiết kế và thi công hệ thống đếm số lượng trong ảnh sử dụng kít Arduino hiển thị LCD” là trung thực và không sao
chép hoàn toàn từ công trình nào khác
Trang 8LỜI CẢM ƠN
Trong quá trình làm đồ án tốt nghiệp, chúng em đã nhận được rất nhiều sự ủng
hộ, giúp đỡ đóng góp ý kiến và chỉ bảo nhiệt tình của thầy cô, gia đình và bạn bè
Chúng em xin gửi lời cảm ơn chân thành đến Th.S Nguyễn Duy Thảo - Trường
Đại học Sư phạm Kỹ thuật Tp.HCM đã tận tình hướng dẫn chỉ bảo trong suốt thời gian làm luận án tốt nghiệp Thầy đã tạo nhiều điều kiện và cho những lời khuyên quý báu giúp chúng em hoàn thành tốt khóa luận
Xin chân thành cảm ơn thầy cô giáo trong Trường Đại học Sư phạm Kỹ thuật Tp.HCM nói chung, các thầy cô trong Bộ môn Điện tử Công Nghiệp – Y Sinh nói riêng
đã tận tình giảng dạy, truyền đạt cho chúng em những kiến thức quý báu và tạo điều kiện giúp đỡ trong suốt quá trình học tập trong những năm học vừa qua, giúp chúng em
có được cơ sở lý thuyết vững vàng
Cuối cùng, chúng em xin chân thành cảm ơn gia đình và bạn bè, đã luôn tạo điều kiện, quan tâm, ủng hộ, giúp đỡ, động viên chúng em trong suốt quá trình học tập và hoàn thành đồ án tốt nghiệp
Chúng em xin chân thành cảm ơn!
Người thực hiện đề tài
Phan Thành Hưng Trần Văn Thạch
Trang 9Trang bìa i
Bảng mô tả công việc ii
Nhiệm vụ đồ án iv
Lịch trình v
Cam đoan vi
Lời cảm ơn vii
Mục lục viii
Liệt kê hình xi
Liệt kê bảng xiii
Tóm tắt xv
CHƯƠNG 1 TỔNG QUAN 1
1.1 Đặt vấn đề 1
1.2 Mục tiêu 2
1.3 Nội dung nghiên cứu 2
1.4 Giới hạn 2
1.5 Bố cục 3
CHƯƠNG 2 CƠ SỞ LÝ THUYẾT 4
2.1 Giới thiệu xử lý ảnh 4
2.2 Tổng quan về Matlab 5
2.3 Giới thiệu lịch sử hình thành Arduino 6
2.4 Giới thiệu về phần cứng 8
2.4.1 Kit Arduino Uno 8
2.4.2 Giới thiệu về LCD 16x2 10
2.4.3 Giao tiếp I2C 11
2.5 Một số phương pháp trong xử lý ảnh 12
2.5.1 Xử lý điểm ảnh: 12
2.5.2 Làm trơn nhiễu bằng lọc tuyến tính 15
2.5.3 Nhị phân hóa ngưỡng tự động 16
2.5.4 Phân vùng ảnh: 17
2.5.5 Phép toán Dilation 18
2.5.6 Phép toán Erosion 19
2.5.7 Phép toán Openning 20
Trang 102.6 Các hàm xử lý trong Matlab 25
CHƯƠNG 3: TÍNH TOÁN VÀ THIẾT KẾ 28
3.1 Giới thiệu 28
3.2 Thiết kế hệ thống 28
3.2.1 Thiết kế sơ đồ khối hệ thống 28
3.2.2 Thiết kế các khối hệt thống 30
3.3 Tổng quan về phần cứng 32
3.3.1 Tổng quan các khối chính 32
3.3.2 Board Arduino Uno R3 33
3.4 Cài đặt các gói hỗ trợ phần cứng cho Matlab 37
3.4.1Kết nối Arduino với Matlab 37
3.4.2Kiểm tra kết nối Arduino với Matlab 40
3.4.3 Kết nối LCD với I2C 40
CHƯƠNG 4 THI CÔNG HỆ THỐNG 42
4.1 Giới thiệu 42
4.2 Thi công hệ thống 42
4.3 Lưu đồ hệ thống 43
4.3.1 Tổng quát về hệ thống 43
4.3.2 Chi tiết về hệ thống 43
4.4 Viết tài liệu hướng dẫn sử dụng, thao tác 47
4.4.1 Viết tài liệu hướng dẫn sử dụng 47
4.4.2Quy trình thao tác trên giao diện 48
CHƯƠNG 5 KẾT QUẢ _ NHẬN XÉT _ĐÁNH GIÁ 49
5.1 Kết quả 49
5.1.1 Tổng quan kết quả đạt được 49
5.1.2 Kết quả thực tế 49
5.2 Nhận xét và đánh giá 60
CHƯƠNG 6 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 62
6.1 Kết luận 62
6.2 Hướng phát triển 63
TÀI LIỆU THAM KHẢO 64
PHỤ LỤC 65
Trang 11Hình Trang
Hình 2.1: Những thành viên khởi xướng Arduino 7
Hình 2.2 Cấu trúc phần cứng của Arduino Uno 9
Hình 2.3 Hình ảnh LCD 10
Hình 2.4 : Hình ảnh I2C 12
Hình 2.5: Chuyển ảnh màu thành ảnh xám 13
Hình 2.6 Lược đồ xám 14
Hình 2.7 Ảnh xám và ảnh nhị phân 14
Hình 2.8 Ngưỡng tự động theo T1 và T2 17
Hình 2.9.a.Đối tượng cần phình A và nhân tạo ảnh B,b.Minh họa quét các b,khắp A 19
Hình 2.10.Kết quả của phép toán Dilation 19
Hình 2.11.Kết quả của phép toán Erosion 19
Hình 2.12.Vật có cấu trúc đơn giản-hình vuông và phức tạp và hình xoắn ốc 21
Hình 2.13 Lưu đồ giải thuật cho thuật toán đánh nhãn 22
Hình 2.14 Lưu đồ giải thuật cho toán đánh nhãn 23
Hình 2.15 Vật thể màu đen đã được đánh nhãn 23
Hình 2.16 Mô phỏng thuật toán đánh nhãn 24
Hình 2.17 Số lượng vật được xác định dựa vào RAM 25
Hình 3.1 Sơ đồ quá trình đếm đối tượng 29
Hình 3.2 Sơ đồ nguyên lý khối ứng dụng 31
Hình 3.3 Tổng quan các khối 32
Hình 3.4 Sơ đồ nguyên lý board Arduino Uno R3 33
Hình 3.5 Sơ đồ chân ATmega328 34
Hình 3.6 Cầu USB-to-UART 36
Hình 3.7 Bộ nguồn 37
Hình 3.8 Get Hardware Support Package 38
Hình 3.9 Cửa sổ “Support Package Installer” 38
Hình 3.10 Giao diện cài Package cho Arduino 39
Hình 3.11 Đăng nhập cho cửa sổ “MathWorks Account Log In” 39
Trang 12Hình 4.2 Lưu đồ chính hệ thống 43
Hình 4.3 Lưu đồ đếm đối tượng 44
Hình 4.4 Lưu đồ chương trình đếm đối tượng 45
Hình 4.5 Lưu đồ chương trình dếm đối tượng 46
Hình 4.6 Lưu đồ chương trình điều khiển ứng dụng trên Arduino 47
Hình 4.7 Quy trình thao tác với thuật toán đánh nhãn 48
Hình 5.1 Giao diện ban đầu 50
Hình 5.2 Giao diện chọn lựa đối tượng đếm 50
Hình 5.3 Giao diện đếm tế bào 51
Hình 5.4 Giao diện đếm cây 52
Hình 5.5 Giao diện đếm thuốc 52
Hình 5.6 10 bức ảnh đếm tế bào mà nhóm thực hiền đề tài 53
Hình 5.7 Đếm tế bào màu hồng thành công 53
Hình 5.8 Đếm tế bào màu tím sạm thành công 54
Hình 5.9 10 Bức ảnh đếm cây mà nhóm thực hiện đề tài 55
Hình 5.10.Đếm cây loại 1 thành công 55
Hình 5.11 Đếm cây loại 2 thành công 56
Hình 5.12 10 bức ảnh đếm thuốc nhóm thực hiện đề tài 56
Hình 5.13 Đếm thuốc loại 1 thành công 57
Hình 5.14 Đếm thuốc đen loại 2 thành công 58
Hình 5.15 Kết quả hiện thị đếm đối tượng ra LCD 59
Trang 13Bảng Trang
Bảng 2.1 Thông số kỹ thuật Arduino Uno 8
Bảng 2.2:Chức năng các chân của LCD 10
Bảng 2.3 Các hàm xử lý hình ảnh khác trong Matlab 27
Bảng 5.1.Kết quả đếm tế bào 40
Bảng 5.2.Kết quả đếm thuốc 60
Bảng 5.3.Kết quả đếm cây 60
Trang 14Đề tài: “Thiết kế và thi công hệ thống đếm đối tượng trong ảnh sử dụng kit Arduino hiển thị trên LCD” nghiên cứu xây dựng phương pháp xử lý ảnh đầu vào,
các phương pháp hinh thái học và đếm đối tượng trong ảnh để điều khiển ứng dụng trên kit Arduino tương ứng với kết quả giá trị nhận được Các nội dung nghiên cứu bao gồm: Tìm hiểu kit Arduino; Tìm hiểu các phương pháp tiền xử lý ảnh ; Tìm hiểu các phép toán hình thái học; Xây dựng thuật toán đánh nhãn để đếm đối tượng trong ảnh
Đề tài được xây dựng chủ yếu trên phần mềm Matlab
Mô hình do nhóm thực hiện đã đạt được mục tiêu do nhóm đặt ra Hiệu suất việc đếm đối tượng cao, điều khiển các ứng dụng trên kit Arduino Tuy nhiên, việc đếm đối tương còn phụ thuộc nhiều vào môi trường khác nhau như: ánh sáng nền, màu
sắc đối tương nên gây khó khăn cho viêc đếm đối tương sai số
Trang 15Chương 1 TỔNG QUAN
1.1 ĐẶT VẤN ĐỀ
Trong những năm gần đây, mặc dù còn mới mẻ trong lĩnh vực khoa học và công nghệ nhưng xử lý ảnh đang được nghiên cứu và phát triển với tốc độ nhanh chóng bởi các trung tâm nghiên cứu, trường đại học và học viện…với rất nhiều ứng dụng trên các lĩnh vực khác nhau[1] Đi cùng với sự phát triển đó, phần lớn các thiết bị điện tử đều dần phát triển theo hướng tự động hóa, thông minh, có thể giao tiếp, tương tác trực tiếp với người dùng Đáp ứng được điều đó rất nhiều bài toán, giải thuật lần lượt giải quyết được vấn đề Một trong
số đó là bài toán đếm số lượng, phát triển ngày càng hiện đại, yêu cầu độ chính xác ngày càng cao
Trong thời đại bùng nổ về công nghệ thông tin như hiện nay, việc đếm số lượng đối tượng là một nhiệm vụ khá phổ biến được thực hiện nhiều trong các ngành công nghiệp bằng các phương thức khác nhau Đếm đối tượng được sử dụng để nhận được một số lượng nhất định các yếu tố từ hình ảnh Những yếu tố này hoạt động như một nguồn thông tin để phân tích định lượng, theo dõi chuyển động và phân tích định tính Việc đếm số lượng các đối tượng được thực hiện trong các môi trường khác nhau với khác đối tượng có kích thước,
số lượng khác nhau Nhưng kết quả đem lại thường không cao, sai số lớn và mất nhiều thời gian Vì thế mà việc đếm bằng phương pháp đếm thủ công phải được thay thế bằng đếm tự động bởi tầm nhìn máy tính Đếm tự động sẽ giúp chúng ta tiết kiệm được thời gian, công sức, tăng khả năng chính xác và áp dụng cho nhiều đối tượng khác nhau chẳng hạn như: đếm tế bào, cá, trứng, ic, xe …
Ở nước ta hiện nay, lĩnh vực đếm trong xử lý ảnh đã có nhũng phát triển đáng kể Tuy nhiên nó chỉ mới phát triển dựa trên nền tảng phần cứng và chưa được áp dụng rỗng rãi trong thực tế Vệc giải quyết bài toán này theo hướng tiếp cận sử dụng phần mềm chưa được quan tâm phát triển
Xuất phát từ mục tiêu tiếp cận, bổ sung các kiến thức mới, cũng như củng cố lại
Trang 16hơn về ứng dụng của xử lý ảnh, nghiên cứu các thuật đếm đối tượng trong ảnh và thực hiện đếm đối tượng rồi nhúng dữ liệu xuống kit Arduino[2]
Do đó, nhóm thực hiện đồ án chọn đề tài: “Đếm đối tượng trong ảnh”
1.2 MỤC TIÊU
Mục tiêu của đề tài là xây dựng hệ thống đếm đối tượng qua hình ảnh với đầu vào là ảnh có chứa đố tượng cần đếm từ ảnh chụp Với số lượng đối tượng đếm được sẽ được sẽ nhúng dữ liệu điều khiển tương ứng xuống kit Arduino
1.3 NỘI DUNG NGHIÊN CỨU
Mục tiêu xây dựng hệ thống: “Đếm đối tượng qua hình ảnh ” như trên thì nhóm sẽ thực hiện những nội dung như sau:
NỘI DUNG 1: Tìm hiểu kit Arduino
NỘI DUNG 2: Cài đặt nguồn thư viện cho kit Arduino, cách kết nối module Arduino với phần mềm Matlab
NỘI DUNG 3: Tìm hiểu các thuật toán cần thiết liên quan đến đếm đối tương trong ảnh
NỘI DUNG 4: Xây dựng thuật toán tạo cơ sở dữ liệu cần thiết cho mục đích đếm đối tượng
NỘI DUNG 5: Xây dựng hệ thống đếm đối tượng qua hình ảnh , lập trình các ứng dụng nhúng dữ liệu trên kit Arduino
NỘI DUNG 6: Đánh giá kết quả thực hiện
Trang 17 Chương 2: Cơ sở lý thuyết
Giới thiệu về phần Matlab, giới thiệu về Arduino, giới thiệu về xử lý ảnh
Giới thiệu về kit Arduino, LCD và I2C
Giới thiệu về các phương pháp trong quá trình xử lý ảnh đầu vào Giới thiệu về thuật toán đánh nhãn trong việc đếm đối tượng
Chương 3: Thiết kế và tính toán
Phân tích, xây dựng sơ đồ khối, sơ đồ phần cứng, thiết kế chương trình cho hệ thống đếm đối tượng qua hình ảnh được viết trên phần mềm Matlab, sử dụng thư viện của Matlab cho kit Arduino
Chương 4: Thi công hệ thống
Xây dựng chương trình hoàn chỉnh cho toàn hệ thống, các hàm, các lưu đồ, các chương trình được sử dụng Lắp ráp và chạy chương trình Viết tài liệu hướng dẫn sử dụng, quy trình thao tác
Chương 5: Kết quả, nhận xét và đánh giá.
Nêu các kết quả đạt được khi thực hiện chương trình, phân tích, nhận xét, đánh giá kết quả thực thi được
Chương 6: Kết luận và hướng phát triển.
Tóm tắt những kết quả đạt được, những hạn chế và nêu lên các hướng phát triển
Trang 18Chương 2 CƠ SỞ LÝ THUYẾT
2.1 GIỚI THIỆU XỬ LÝ ẢNH[1]
Xử lý ảnh là một lĩnh vực mang tính khoa học và công nghệ Nó là một ngành khoa học mới mẻ so với nhiều ngành khoa học khác nhưng tốc độ phát triển của nó rất nhanh, kích thích các trung tâm nghiên cứu, ứng dụng, đặc biệt là máy tính chuyên dụng riêng cho nó
Xử lý ảnh được đưa vào giảng dạy ở bậc đại học ở nước ta khoảng chục năm nay
Nó là môn học liên quan đến nhiều lĩnh vực và cần nhiều kiến thức cơ sở khác Đầu tiên phải kể đến Xử lý tín hiệu số là một môn học hết sức cơ bản cho xử lý tín hiệu chung, các khái niệm về tích chập, các biến đổi Fourier, biến đổi Laplace, các bộ lọc hữu hạn… Thứ hai, các công cụ toán như Đại số tuyến tính, Sác xuất, thống kê Một số kiến thứ cần thiết như Trí tuệ nhân tao, Mạng nơ ron nhân tạo cũng được đề cập trong quá trình phân tích và nhận dạng ảnh
Các phương pháp xử lý ảnh bắt đầu từ các ứng dụng chính: nâng cao chất lượng ảnh và phân tích ảnh Ứng dụng đầu tiên được biết đến là nâng cao chất lượng ảnh báo được truyền qua cáp từ Luân đôn đến New York từ những năm 1920 Vấn đề nâng cao chất lượng ảnh có liên quan tới phân bố mức sáng và độ phân giải của ảnh Việc nâng cao chất lượng ảnh được phát triển vào khoảng những năm 1955 Điều này có thể giải thích được vì sau thế chiến thứ hai, máy tính phát triển nhanh tạo điều kiện cho quá trình xử lý ảnh sô thuận lợi Năm 1964, máy tính đã có khả năng xử lý và nâng cao chất lượng ảnh từ mặt trăng và vệ tinh Ranger 7 của Mỹ bao gồm: làm nổi đường biên, lưu ảnh Từ năm
1964 đến nay, các phương tiện xử lý, nâng cao chất lượng, nhận dạng ảnh phát triển không ngừng Các phương pháp tri thức nhân tạo như mạng nơ ron nhân tạo, các thuật toán xử lý hiện đại và cải tiến, các công cụ nén ảnh ngày càng được áp dụng rộng rãi và thu nhiều kết quả khả quan
Để dễ tưởng tượng, xét các bước cần thiết trong xử lý ảnh Đầu tiên, ảnh tự nhiên
từ thế giới ngoài được thu nhận qua các thiết bị thu (như Camera, máy chụp ảnh) Trước đây, ảnh thu qua Camera là các ảnh tương tự (loại Camera ống kiểu CCIR) Gần đây, với
Trang 19sự phát triển của công nghệ, ảnh màu hoặc đen trắng được lấy ra từ Camera, sau đó nó được chuyển trực tiếp thành ảnh số tạo thuận lợi cho xử lý tiếp theo Máy ảnh số hiện nay
là một thí dụ gần gũi Mặt khác, ảnh cũng có thể tiếp nhận từ vệ tinh; có thể quét từ ảnh chụp bằng máy quét ảnh
2.2 TỔNG QUAN VỀ MATLAB[4]
Matlab (Matrix Laboratory) là một môi trường tính toán số và lập trình, được thiết
kế bởi công ty MathWorks, là ngôn ngữ lập trình thực hành bậc cao được sử dụng nhiều
để giải các bài toán kỹ thuật Matlab tích hợp việc tính toán thể hiện kết quả cho phép lập trình, giao diện làm việc rất dễ dàng cho người sử dụng Dữ liệu cùng với thư viện được lập trình sẵn cho phép người dùng có được những ứng dụng như:
Tính toán các phép toán học thông thường, tính toán ma trận
Lập trình tạo ra những ứng dụng mới
Cho phép mô phỏng các mô hình thực tế
Phân tích, khảo sát, hiển thị dữ liệu
Matlab được sử dụng trong nhiều lĩnh vực, bao gồm xử lý tín hiệu và ảnh, truyền thông, thiết kế điều khiển tự động, đo lường kiểm tra, phân tích mô hình tài chính, hay tính toán sinh học Matlab cung cấp giải pháp chuyên dụng gọi là Toolbox Toolbox là một tập hợp toàn diện các hàm của Matlab (M-file)
Hệ thống Matlab gồm 5 phần chính:
Ngôn ngữ Matlab: Cho phép lập trình từ các ứng dụng nhỏ đến phức tạp Đó là các ngôn ngữ cao về ma trận và mảng, các dòng lệnh, các hàm, cấu trúc dữ liệu vào
Trang 20 Môi trường làm việc: Bao gồm các phương tiện cho việc quản lý các biến trong không gian làm việc Workspace cũng như xuất nhập dữ liệu Nó cũng bao gồm các công
cụ phát triển, quản lý, gỡ rối và định hình M-file
Xử lý đồ họa: Bao gồm các lệnh cao cấp cho trực quan hóa dữ liệu hai chiều và
ba chiều, xử lý ảnh, ảnh động Cung cấp các giao diện tương tác giữa người sử dụng và máy tính
Thư viện toán học: Các hàm cơ bản như cộng, trừ, nhân, chia, sin, cos …và các hàm phức tạp như tính ma trận nghịch đảo, trị riêng, chuyển đổi fourier, laplace, symbolic library
Giao diện người dùng (Application Program Interface): Cho phép viết chương trình tương tác với các ngôn ngữ khác C, Fortran
Simulink là một chương trình đi kèm với Matlab, là một hệ thống tương tác với việc mô phỏng các hệ thống động phi tuyến, mô phỏng mạch
2.3 GIỚI THIỆU LỊCH SỬ HÌNH THÀNH ARDUINO[3]
Arduino thực sự đã gây sóng gió trên thị trường người dung DIY ( là những người
tự chế ra sản phẩm của mình) trên toàn thế giới trong vài năm gần đây, gần giống với những gì Apple đã làm được trên thị trường thiết bị di động Số lượng người dung cực lớn
và đa dạng với trình độ trải rộng từ bậc phổ thông lên đến đại học làm cho ngay cả những người tạo ra chúng phải ngạc nhiên về mức độ phổ biến
Trang 21Hình 2.1: Những thành viên khởi xướng Arduino
Arduino là gì mà có thể ngay cả nhũng sinh viên và nhà nghiên cứu tại các trường đại học danh tiếng như MIT, Stanford, Carnegie Mellon phải sử dụng, hoặc ngay cả google cũng muốn hỗ trợ hi cho ra đời bộ kít Arduino mega ADK dung để phát triển trên các ứng dụng tương tác với cảm biến với các thiết bị khác?
Arduino thật ra là một bo mạch vi xử lý được dung để lập trình tương tác với các thiết bị phần cứng như cảm biến, động cơ, đèn hoặc các thiết bị khác Đặc điểm nổi bật của Arduino là môi trường phát triển ứng dụng cực kỳ dễ sử dụng, với một ngôn ngữ lập trình có thể học một cách nhanh chóng ngay cả với người ít am hiểu về điện tử và lập trình và điều hiển làm nên hiện tượng Arduino chính là mức giá thấy với tính chấ nguồn
mở từ phần cứng tới phần mềm chỉ cới khoảng $30, người dung đã có thể sở hữu board Arduino có 20 ngõ I/O có thể tương tác và điều khiển chừng ấy thiết bị
Arduino ra đời tại thị trấn Ivrea thuộc nước Ý và được đặt theo tên một vị vua vào thế kỷ thứ 9 là King Arduino, Arduino chính thức được đưa ra giới thiệu vào năm 2005 như là một công cụ khiêm tốn dành cho các sinh viên của giáo sư Massimo Banzi, là một trong những người phát triển Arduino, tại trường Interaction Design Instistute Ivrea (IDII) Mặt dù hầu như không được tiếp thị gì cả, tin tức về arduino vẫn lan truyền với tốc
độ chóng mặt nhờ những lời truyền miệng tốt đẹp của nhũng người dung đầu tiên Hiện
Trang 22nay Arduino nổi tiếng tới nỗi có người tìm đến thị trấn Ivrea chỉ để tham quan nói đã sản sinh ra Arduino
2.4 GIỚI THIỆU PHẦN CỨNG
2.4.1 Kit Arduino Uno[3]
Kit Arduino có nhiều phiên bản với tính năng và mục đích sử dụng khác nhau Board Arduino Uno là một trong những phiên bản được sử dụng rộng rãi nhất bởi chi phí
và tính linh động của nó
Arduino Uno là một board mạch vi điều khiển dựa trên chip Atmega328 với 14 chân vào/ra bằng tín hiệu số được đánh số từ 0 đến 13, trong đó 6 chân có thể tạo xung PWM được đánh dấu “~” trước mã số của chân, 6 chân nhận tín hiệu analog được đánh dấu từ A0 đến A5, có thể sử dụng như là 6 chân I/O số Có 2 mức điện áp là 0V và 5V với
dòng vào/ra tối đa trên mỗi chân là 30 mA
Vi điều khiển Atmega328P họ 8 bit
Điện áp hoạt động 5V
Điện áp đầu vào 7-12V
Điện áp đầu vào giới hạn 6-20V
Số chân Digital I/O 14 (có 6 chân PWM)
Số chân Analog 6 ( độ phân giải 10bit)
DC current per I/O pin 20mA
DC current for 3.3V pin 50mA
Flash Memory 32KB (ATmega328P)
Trang 23Hình 2.2 Cấu trúc phần cứng của Arduino Uno
Cổng USB(1): Cổng USB dùng để kết nối với máy tính và thông qua đó để upload chương trình cho Arduino từ máy tính, đồng thời cung cấp nguồn cho Arduino
Nguồn (2 và 4): Sử dụng jack cắm nguồn 2.1mm (cực dương ở giữa) hoặc có thể dùng chân Vin và GND để cấp nguồn cho Arduino Board mạch hoạt động ở điện áp ngoài khoảng 5-20V, nhưng nếu cấp nguồn lớn hơn 5V thì ngõ ra chân 5V sẽ lớn hơn, không nên cấp nguồn lớn hơn 12V vì board sẽ nóng và dễ bị hỏng Chân 5V và chân 3.3v
là 2 chân lấy nguồn từ Arduino ra ngoài, không được cấp nguồn vào nó, sẽ làm hỏng
Chip Atmega328P(6): Có 32KB bộ nhớ flash trong đó có 0.5KB dùng cho bootloader, 2KB SRAM, 1KB EEPROM
Output và Input (3 và 5): Arduino có 14 chân Digital với các chức năng Input và Output
Trang 242.4.2 Giới thiệu về LCD 16x2
Hình 2.3 Hình ảnh LCD
- Các tính năng chính của LCD
• 5 x 8 chấm với con trỏ
• Tích hợp bộ điều khiển (KS 0.066 hoặc tương đương)
• Cấp điện +5V (Ngoài ra có sẵn cho + 3V)
• 1 / 16 nhiệm vụ chu kỳ
• B / L sẽ được điều khiển bởi pin 1, pin 2 hay pin 15, pin 16 hoặc AK (LED)
• N.V tùy chọn cho + 3V cấp điện
- Chức năng các chân của LCD:
1 VSS Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với
GND của mạch điều khiển
2 VDD Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với
VCC=5V của mạch điều khiển
3 VEE Điều chỉnh độ tương phản của LCD
Trang 25Bảng 2.2.Chức năng các chân của LCD
2.4.3 Giao tiếp I2C
Thông thường, để sử dụng màn hình LCD bạn sẽ phải mất rất nhiều chân Arduino
để điều khiển.Do vậy, để đơn giản hóa công việc người ta đã tạo ra một mạch điều khiển màn hình LCD sử dụng giao tiếp I2C Nói một cách đơn giản, bạn chỉ tốn hai dây để điều khiển màn hình thay vì 8 dây như cách thống thường thường làm
chế độ “đọc” - read)
+ Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD
5 R/W
Chân chọn chế độ đọc/ghi (Read/Write) Nối chân R/W với logic
“0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để LCD ở chế độ đọc
6 E
Chân cho phép (Enable) Sau khi các tín hiệu được đặt lên bus DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào( chấp nhận) thanh ghi bên trong nó khi phát hiện một xung (high-to-low transition) của tín hiệu chân E
+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên (low-to-high transition) ở chân E và được LCD giữ
ở bus đến khi nào chân E xuống mức thấp
7 - 14 DB0÷DB7
Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU
Có 2 chế độ sử dụng 8 đường bus này : + Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit MSB
Trang 26Hình 2.4 : Hình ảnh I2C
Ở đây đối với LCD 16x2 dùng module I2C địa chỉ tùy thuộc vào jump cắm trên module I2C Để biết địa chỉ I2C đang dùng ta vào Arduino và cho chương trình I2C scanner để quét địa chỉ dùng cho I2C đang sử dụng Và địa chỉ mà quét được cho I2C của mình là 0x27
I2C sử dụng hai đường truyền tín hiệu:
Một đường xung nhịp đồng hồ(SCL) chỉ do Master phát đi ( thông thường ở 100Khz và 400Khz Mức cao nhất là 1Mhz và 3.4Mhz)
Một đường dữ liệu( SDA) theo 2 hướng
2.5 MỘT SỐ PHƯƠNG PHÁP TRONG XỬ LÝ ẢNH.[6]
2.5.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ả biến Mỗi mày R, G, được biểu diễn bởi 8 bits Như vây mỗi pixel có giá trị 24bits, 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ị 24bits, đ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ày 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
Trang 27Phần lớn trường hợp, dữ liệu ảnh được xử lý nhằm thực hiện đ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 tiện hơn
a 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 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 (2.1)
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
Hình 2.5: Chuyển ảnh màu thành ảnh xám
b 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
Trang 28Hình 2.6 Lược đồ xám
Đ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
c 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 2.7.: Ảnh xám và ảnh nhị phân
Trang 292.5.2 Làm trơn nhiễu bằng lọc tuyến tính: lọc trung bình và lọc dải thông thấp
Do có nhiều loại nhiễu can thiệp vào quá trình xử lý ảnh nên cần có nhiều bộ lọc
thích hợp Với nhiễu cộng và nhiễu nhân ta dùng các bộ lọc thông thấp, trung bình và lọc
đồng hình (Homomorphie); với nhiễu xung ta dùng lọc trung bị, giả trung vị, lọc ngoài
(Outlier)
a Lọc trung bình không gian
Với lọc trung bình, mỗi điểm ảnh được thay thế bằng trung bình trọng số của các
điểm lân cận và được định nghĩa như sau:
v(m,n) = ∑ ∑( ) ( ) ( ) (2.4) Nếu trong kỹ thuật lọc trên, ta dùng các trọng số như nhau, phương trình trên sẽ trở
thành:
v(m,n) = ∑ ∑( ) ( ) (2.5) với : y(m, n): ảnh đầu vào,
Kỹ thuật lọc này hiệu quả với ảnh có nhiễu nhân Thực tế, ảnh quan sát được gồm
ảnh gốc nhân với một hệ số nhiễu Gọi X (m, n) là ảnh thu được, X(m, n) là ảnh gốc và
η(m, n) là nhiễu, như vậy:
X(m, n) = X (m,n) * η(m, n ) (2.9)
Lọc đồng hình thực hiện lấy logarit của ảnh quan sát Do vậy ta có kết quả sau:
Log(X(m, n)) = log( X (m,n) ) + log( η(m, n)) (2.10)
Rõ ràng, nhiễu nhân có trong ảnh sẽ bị giảm Sau quá trình lọc tuyến tính, ta
chuyển về ảnh cũ bằng phép biến đổi hàm e mũ
Trang 302.5.3 Nhị phân hóa ngưỡng động
Nhị phân hóa theo ngưỡng tự động với ý tưởng sau:
- Chia tấm ảnh thành nhiều khu vực, cửa sổ khác nhau
- Dùng một thuật toán để tìm một giá trị T phù hợp với từng khu vực, cửa sổ
Thuật toán Otsu
Bước 1: Xác định T1 Giá trị cho T1 ban đầu nên chọn là (0+255) / 2 = 128
Bước 2: Phân loại thành 2 nhóm điểm ảnh
Loại 1 (Type1): chứa tất cả các điểm ảnh có giá trị cường độ sáng (Intensity)
Trang 31Hình 2.8: Ngƣỡng tự động theo T1 và T2
2.5.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 tách biệt nhau còn với các ảnh nhiều chi tiết, kết quả phân vùng 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 liên 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
Trang 32Tùy theo mục đích và yêu cầu hệ thống, ta có thể sử dụng một vài bước trên để lấy thông tin cần thiết cho việc xử lý ảnh Đó có thể đơn giản là nhận biết sự khác nhau giữa
2 hình nhằm xác định 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 …
2.5.5 Phép toán Dilation
Phép toán Dilation là thao tác giãn nở/ phình to các đối tượng ảnh đơn sắc A và B
là hai tập hợp con trong Z2, thực hiện phép toán Dilation trong A theo B, kí hiệu là A
B và được xác định như sau : A B = {z | ̂z A }
Trong Matlab, ta có hàm Dilation như sau: imdilate
B chính là nhân tạo hình Trong Matlab, chương trình cũng cung cấp cho ta nhiều
nhân tạo hình khác nhau, để biết them chí tiết gõ help strel Trong thực tế, người ta chọn
những nhân tạo ảnh sao cho B = ̂, tức là sử dụng nhân tạo ảnh có các phần tử trong nhân tạo ảnh đối xứng qua chính tâm của nó Bên cạnh đó, với việc ta lê những cái tâm z của nhân tạo ảnh B ảnh đi khắp A và tìm những điểm nào mà B A thì ta có thể hiểu như A B = UbiAbi với Abi là những khu vực mà A Bi Có thể xem hình minh họa dưới đây:
Trang 33Hình 2.9.a.Đối tượng cần phình A và nhân tạo ảnh B b.Minh họa quét các b,khắp A
Hình 2.10 Kết quả của phép toán Dilation
2.5.6 Phép toán Erosion
Phép toán Erosion là thao tác xói mòn/ co hẹp các đối tượng ảnh đơn sắc A và B là hai tập hợp con trong Zz , thực hiện phép toán Erosion trong A theo B, kí hiệu là A B
và được xác định như sau: A B = { p }
Tương tự, trong Matlab ta cũng có hàm Eosion như sau: imerode
Để minh họa cách thức phép toán hoạt động có thể xem hình phía dưới với A và B tương tự như ví dụ ở phép toán Dilation
Hình 2.11.Kết quả của phép toán Erosion
Trang 342.4.9 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 các frames hình Do hạn chế về tài nguyên của các board xử lý hình ảnh, mà cụ thể là Ram, ta không thể lưu cả 1 frames ả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, hình lục giác…độ lớn cũng khác nhau, trải dài trên nhiều lines và ở mọi vị trí trên hình ảnh Ta chỉ có thể nhận và xử lý lines từ trên xuống dưới, các lines đã qua xử lý không thể giữ lại nên nếu gặp một phần của đối tượng nằm ở lines bất kì bên dưới, không thể dùng so sánh để biết nó có thuộc đối tượng nào ở trên hay không
Trang 35Hình 2.12 : Vật có cấu trúc đơn giản-hình vuông và phức tạp và 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 pixel ở 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 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, 4pixels đó đều mang nhãn là số 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 đính kèm với nó có 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à từ 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 một đối tượng Nếu 2 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ỏ
Trang 36Sau đâ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 2.13: Lưu đồ giải thuật cho thuật toán đánh nhãn
Thuật toán hoạt động cụ thể nhu sau: pixel lấy vào nếu có giá trị lơn hơn 127, tức
là 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 đó mà đánh nhãn Nếu cả 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
Trang 37pixel_forcus gán theo nhãn pixel_up nhưng pixel_pre đã có nhãn Đến đâu 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 2.14 Lưu đồ giải thuật cho toán đánh nhãn
Để dễ hiểu hơn việc cập nhật giá trị cho các nhãn, ta xem thử vật thể sau:
Hình 2.15: 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ị lai 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
Pixel_up FIFO
Pixel_pre Analysis
Trang 38nà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 2.16 : 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 được hết các ô nhớ Ram Số lượng vật thể đếm được cũng theo đó mà được tối ưu Ví dụ như Ram sử dụng có độ dài 10bits ta 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ết Count dùng để đánh nhãn sẽ nhanh chóng bị tràn cho dù có dùng độ dài bít 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 đề ả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 nó 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ẳng về đầu Ram, tức là 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 các 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 cạnh 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
Theo ví dụ trên các nhãn 1, 2, 3 đều có chung giá trị 1, vậy chúng cùng thuộc một đối tượng, nhãn 4 đối tượng tiếp theo, cứ thế cho đến ô địa chỉ RAM cuối cùng
Trang 39Hình 2.17 : Số lượng vật được xác định dựa vào RAM 2.4 CÁC HÀM XỬ LÝ TRONG MATLAB[4]
Các hàm chính hiển thị ảnh trong matlab:
Hàm image(x,y,c): Hiển thị hình ảnh biểu diễn bởi ma trận c kích thước m x n lên
hệ trục tọa độ, x,y là các vector xác định vị trí của các pixel c(m,n)
Hàm imagesc: Tương tự hàm image, dữ liệu ảnh sẽ được co giãn để sử dụng toàn
bộ bản đồ màu hiện hành
Hàm imshow: Cho phép hiển thị ảnh trên một figure và tự động thiết lập giá trị các
đối tượng image, axes, figure để hiển thị hình ảnh
Các hàm khác được sử dụng trong đề tài:
T=strcat(s1,s2,s3…): Ghép các chuỗi lại với nhau, trả về chuỗi nối tiếp s1s2s3…
length(): Lấy chiều dài
T=dir(pathname): Lấy thông tin của một Folder bao gồm: Số file chứa trong
folder, tên file, ngày tạo, kích thước file…
S=int2str(x): Chuyển đổi số kiểu integer thành chuỗi ký tự
D=size(a): Trả về giá trị là ma trận có dạng [x,y] là kích thước của ma trận a
rgb2gray(RGB) : Chuyển đổi ảnh màu sang ảnh xám
im2bw(I, level): Chuyển đổi hình ảnh xám sang hình ảnh nhị phân, dựa trên
ngưỡng
bw2 = bwareaopen(BW, P): Loại bỏ các đối tượng nhỏ khỏi hình ảnh nhị phân
Trang 40 imopen( IM,SE): thực hiện mở hình thái trên màu xám, IM là hình ảnh nhị phân,
SE là phần tử cấu trúc
bwboundaries(BW): đánh dấu biên giới các vật thể, cũng như ranh giới của lỗ bên
trong các đối tượng này(BW)
bwlabel(BW): kết nối các thành phần có trong hình ảnh nhị phân
text(x,y,z,'string','PropertyName',PropertyValue): Tạo đối tượng văn bản trong
các trục hiện tại
length(X) : chiều dài lớn nhất của số nguyên X
Các hàm chuyển đổi loại ảnh và kiểu dữ liệu ảnh
Dither Tạo ảnh nhị phân hay ảnh RGB
gray2ind Chuyển ảnh trắng đen thành ảnh indexed
im2bw Chuyển ảnh thành ảnh kiểu dữ liệu nhị phân
im2double Chuyển ảnh thành ảnh kiểu dữ liệu double
im2uint16 Chuyển ảnh thành ảnh kiểu dữ liệu uint16
ind2rgb Chuyển ảnh indexed thành ảnh RBG
mat2gray Tạo ảnh gray scale từ ma trận
rgb2ind Chuyển ảnh RBG thành ảnh indexed
rgb2gray Chuyển ảnh RBG thành ảnh gray scale
Các hàm truy xuất dữ liệu ảnh
Imfinfo Truy xuất thông tin ảnh
Imread Đọc ảnh từ file và xuất ra ma trận ảnh
Imwrite Lưu ma trận ảnh thành file ảnh
Các hàm biến đổi hình học
Imcrop Trích xuất một phần ảnh
Imresize Thay đổi kích thước ảnh
Imdilate Phép toán giãn nở điểm ảnh nhị phân
Imerode Phép toán xói mòi điểm ảnh nhị phân