Xây dựng một số phương pháp phát hiện biên đối tượng từ ảnh số bằng ngôn ngữ c++/c# kết hợp thư viện opencv/emgu
Trang 1TRƯỜNG ĐẠI HỌC KỸ THUẬT - HẬU CẦN CAND
KHOA CÔNG NGHỆ THÔNG TIN
- -BÁO CÁO THỰC TẬP CHUYÊN ĐỀ
Đề tài: “Xây dựng một số phương pháp phát hiện biên đối tượng từ ảnh số bằng ngôn ngữ lập trình C++/C# kết
hợp thư viện OpenCV/Emgu”
Giáo viên hướng dẫn: TS NGUYỄN VĂN CĂN
Trang 2LỜI CẢM ƠN
Để hoàn thành chuyên đề này, cho phép em được bày tỏ lời cảm ơn tớithầy cô giáo trong khoa Công nghệ thông tin trường Đại Học Kỹ Thuật - HậuCần Công an nhân dân đã giúp đỡ em Đặc biệt, em xin cảm ơn sự giúp đỡ quýbáu của thầy giáo Thượng tá - Tiến sĩ Nguyễn Văn Căn - Trưởng Khoa Côngnghệ thông tin đã tận tình hướng dẫn em trong suốt quá trình hoàn thành chuyênđề
Tuy nhiên, do thời gian có hạn cũng như kinh nghiệm còn hạn chế, nêntrong quá trình thực hiện chuyên đề này sẽ không tránh khỏi những thiếu sót,hạn chế nhất định Vì vậy, em rất mong nhận được sự chỉ bảo, đóng góp ý kiếncủa các thầy cô cùng toàn thể các bạn để em có điều kiện bổ sung, nâng cao kiếnthức của mình, phục vụ tốt hơn cho việc học tập và thực tế sau này
Em xin chân thành cảm ơn!
Bắc Ninh, ngày tháng 06 năm 2016
Học viên thực hiện
Trang 3MỤC LỤC
Trang
DANH MỤC CHỮ VIẾT TẮT iii
DANH MỤC HÌNH iv
DANH MỤC BẢNG vi
MỞ ĐẦU 1
Chương 1 TỔNG QUAN VỀ XỬ LÝ ẢNH VÀ BIÊN 4
1.1 Tổng quan về xử lý ảnh 4
1.1.1 Xử lý ảnh 4
1.1.2 Các bước xử lý ảnh 4
1.2 Một số khái niệm cơ bản về ảnh số 5
1.2.1 Điểm ảnh – Pixel/Picture Element 5
1.2.2 Độ phân giải – Resolution 6
1.2.3 Nhiễu 6
1.2.4 Mức xám – Gray level – và phân đoạn ảnh 6
1.2.5 Lược đồ mức xám 7
1.2.6 Láng giềng 7
1.2.7 Vùng liên thông 8
1.3 Tổng quan về biên 8
1.3.1 Biên và các kiểu biên cơ bản 8
1.3.2 Vai trò của biên trong nhận dạng 10
1.3.3 Hướng giải quyết bài toán phát hiện biên 11
Chương 2 TỔNG QUAN VỀ THƯ VIỆN OPENCV/EMGU 12
2.1 Thư viện OpenCV 12
2.1.1 Giới thiệu 12
2.1.2 Phiên bản OpenCV 12
2.1.3 Cài đặt OpenCV 13
2.1.4 Một số phép xử lý ảnh cơ bản sử dụng thư viện OpenCV 15
2.2 Thư viện Emgu 22
2.2.1 Giới thiệu 22
2.2.2 Thông số chung màu và chiều sâu 22
2.2.3 Tạo hình ảnh 23
Trang 42.2.4 Lấy và thiết lập điểm ảnh 24
2.2.5 Phương pháp 24
2.2.6 Hoạt động chung 24
2.2.7 Vẽ các đối tượng trên hình ảnh 25
2.2.8 Chuyển đổi màu sắc và chiều sâu 25
2.2.9 Hiển thị hình ảnh 25
2.2.10 Cài đặt Emgu 26
Chương 3 MỘT SỐ PHƯƠNG PHÁP PHÁT HIỆN BIÊN 28
3.1 Các phương pháp phát hiện biên cổ điển 28
3.1.1 Phân loại các phương pháp phát hiện biên 28
3.1.2 Kỹ thuật phát hiện biên Gradient 29
3.1.3 Các toán tử la bàn 31
3.1.4 Kỹ thuật phát hiện biên Laplace 33
3.2 Các phương pháp phát hiện biên nâng cao 34
3.2.1 Phương pháp Canny 34
3.2.2 Phương pháp Shen – Castan 38
Chương 4 XÂY DỰNG CHƯƠNG TRÌNH 40
4.1 Sử dụng NNLT C# kết hợp thư viện Emgu 40
4.1.1 Phân tích chương trình 40
4.1.2 Giao diện của chương trình chính 41
4.1.3 Các cửa sổ của chương trình 42
4.1.4 Ảnh đầu vào và đầu ra 43
4.1.5 Mô tả thuật toán 43
4.1.6 Kết quả tách biên ảnh 44
4.1.7 Một số nhận xét, đáng giá 48
4.2 Sử dụng NNLT C++ kết hợp thư viện OpenCV 49
KẾT LUẬN 50
DANH MỤC TÀI LIỆU THAM KHẢO 51
Trang 5DANH MỤC CHỮ VIẾT TẮT
CGA Độ phân giải của ảnh trên màn hình (Color
Graphic Adaptor)OpenCV Thư viện mã nguồn mở (Open Source Computer Vision)RBG Không gian màu (Red, Blue, Green)
NNLT Ngôn ngữ lập trình
Trang 6DANH MỤC HÌNH
Trang
Hình 1.1 Quá trình xử lý ảnh 4
Hình 1.2 Sơ đồ tổng quát của một hệ thống nhận dạng trong xử lý ảnh 5
Hình 1.3 Biểu diễn ảnh với độ phân giải 6
Hình 1.4 Đường biên lý tưởng 9
Hình 1.5 Đường biên bậc thang 9
Hình 1.6 Đường biên thực 10
Hình 2.1 Icon của thư viện OpenCV 12
Hình 2.2 Ảnh được gọi ra 16
Hình 2.3 Biểu diễn độ sáng và tương phản 17
Hình 2.4 Ảnh trước và sau khi chỉnh sửa tăng độ sáng và tương phản 18
Hình 2.5 Mô tả phép biến đổi với tỉ lệ α = β = 2 19
Hình 2.6 Mô tả phép biến đổi với góc quay θ 19
Hình 2.7.Ảnh sau khi xoay và phóng to 21
Hình 2.8 Mô tả phép trượt 21
Hình 2.9 Ảnh sau khi biến đổi trượt 22
Hình 2.10 Chương trình thử nghiệm 27
Hình 3.1 Biên ảnh với toán tử Robert 30
Hình 3.2 Biên ảnh với toán tử Sobel 31
Hình 3.3 Biên ảnh với toán tử Prewitt 31
Hình 3.4 Biên ảnh với toán tử la bàn Kirsh 32
Hình 3.5 Biên ảnh với toán tử la bàn Prewitt 33
Hình 3.6 Biên ảnh với kỹ thuật Laplace 34
Hình 3.7.Đạo hàm Gauss theo hai hướng x và y 36
Hình 3.8 Hình mô tả các điểm biên lân cận 37
Hình 3.9 Biên ảnh với kỹ thuật Canny 38
Hình 3.10 Biên ảnh với kỹ thuật Shen – Castan 39
Hình 4.1 Các thành phần của chương trình 40
Hình 4.2 Giao diện chính của chương trình 41
Hình 4.3 Cửa sổ ColorInput 42
Hình 4.4 Cửa sổ Parameter 43
Trang 7Hình 4.5 Cửa sổ TyLe 43
Hình 4.6 Cửa sổ ThongsoCanny 43
Hình 4.7 Ảnh màu sau khi được phát hiện biên bằng kỹ thuật Prewit 44
Hình 4.8 Ảnh xám sau khi phát hiện biên bằng kỹ thuật Prewit 45
Hình 4.9 Ảnh màu sau khi phát hiện biên bằng kỹ thuật Sobel 45
Hình 4.10 Ảnh xám sau khi phát hiện biên bằng kỹ thuật Sobel 45
Hình 4.11 Ảnh màu sau khi phát hiện biên bằng kỹ thuật Laplace 46
Hình 4.12 Ảnh xám sau khi phát hiện biên bằng kỹ thuật Laplace 46
Hình 4.13 Ảnh màu khi phát hiện biên bằng kỹ thuật Laplace of Gaussian 46
Hình 4.14 Ảnh xám khi phát hiện biên bằng kỹ thuật Laplace of Gaussian 47
Hình 4.15 Ảnh màu sau khi phát hiện biên bằng kỹ thuật Kirsh 47
Hình 4.16 Ảnh xám sau khi phát hiện biên bằng kỹ thuật Kirsh 47
Hình 4.17 Ảnh sau khi phát hiện biên bằng ký thuật Canny 48
Trang 8DANH MỤC BẢNG
Tran
Bảng 4.1 Mô tả chức năng chính 41
Bảng 4.2 Chức năng con của Function 41
Bảng 4.3 Chức năng con của Edge Detection 42
Bảng 4.4 Chức năng con của Image Processing 42
Trang 9MỞ ĐẦU
1 Lý do chọn đề tài
Thời đại công nghệ thông tin phát triển như vũ bão đã đi vào từng ngõngách của cuộc sống Hiện nay, bất cứ sự phát triển của ngành công nghiệp nàođều có sự hiện diện và đóng góp rất to lớn của công nghệ thông tin Xử lý ảnh làmột trong những chuyên ngành quan trọng và lâu đời của Công nghệ thông tin
Xử lý ảnh được áp dụng trong nhiều lĩnh khác nhau như y học, vật lý, hoá học,tìm kiếm tội phạm, trong quân sự và trong một số lĩnh vực khác
Phần lớn con người thu nhận thông tin bằng thị giác, cụ thể đó là các hìnhảnh Vì vậy xử lý ảnh là vấn đề không thể thiếu và hết sức quan trọng để thu đượchình ảnh tốt hơn, đẹp hơn, nhằm đáp ứng yêu cầu thông tin khác nhau của ngườinhận
Trong xử lý ảnh, việc nhận dạng và phân lớp đối tượng cần trải qua cácquá trình và các thao tác khác nhau Phát hiện biên là một giai đoạn rất quantrọng vì các kỹ thuật phân đoạn ảnh chủ yếu dựa vào giai đoạn này Mục đíchcủa việc dò biên sẽ đánh dấu những điểm trong một ảnh số mà có sự thay đổiđột ngột về độ xám, tập hợp nhiều điểm biên tạo nên một đường bao quanh ảnh(đường biên) Nhờ có đường biên mà chúng ta có thể phân biệt giữa đối tượng
và nền, phân biệt giữa các vùng khác nhau và định vị được đối tượng từ đó mànhận dạng đối tượng Đây là cơ sở quan trọng trong việc ứng dụng phương phápnày vào thực tiễn của cuộc sống, đặc biệt là trong điều kiện đất nước ta đangtừng bước phát triển và đi lên nên việc nghiên cứu các ứng dụng vấn đề này cầnđược quan tâm và phát triển
Xuất phát từ thực tế đó, em lựa chọn chuyên đề “Xây dựng một sốphương pháp phát hiện biên đối tượng từ ảnh số bằng NNLT C++/C# kết hợpthư viện OpenCV/Emgu”
2 Mục tiêu
- Trình bày một số phương pháp phát hiện biên đối tượng từ ảnh
- Sắp xếp, phân loại tập các lệnh xử lý ảnh trong thư viện OpenCV/Emguthông qua một phần mềm phát hiện biên đối tượng từ ảnh
- Xây dựng một phần mềm demo để mô phỏng việc tách biên từ ảnh bằngmột số phương pháp phát hiện biên
3 Đối tượng và phạm vi nghiên cứu
- Đối tượng nghiên cứu:
+ Một số phương pháp phát hiện biên
+ Các tài liệu ảnh thu thập từ thực tế
+ Các công thức tính toán, lưu đồ thuật toán phát hiện biên, ngôn ngữ lậptrình ứng dụng phát hiện biên
Trang 10+ Thư viện mã nguồn mở xứ lý Multimedia OpenCV/Emgu phục vụ chocông tác lập trình xử lý ảnh để phát hiện biên.
- Phạm vi nghiên cứu:
+ Tổng hợp một số phương pháp phát hiện biên, đánh giá và nhận xéttừng phương pháp này
+ Lập trình thử nghiệm một số phương pháp này
+ Tài liệu về ngôn ngữ lập trình C#/C++
+ Tài liệu về thư viện mã nguồn mở Multimedia OpenCV/Emgu
+ Tài liệu về các phương pháp phát hiện biên đối tượng từ ảnh số
+ Nghiên cứu và học tập kinh nghiệm từ các chuyên gia
4 Phương pháp nghiên cứu
- Phương pháp nghiên cứu, tổng hợp tài liệu: Tìm kiếm nguồn tài liệu liênquan đến C++/C# và thư viện mã nguồn mở OpenCV/Emgu, các phương phápphát hiện biên từ ảnh số
- Phương pháp phân tích và tổng hợp: Phân tích các chương trình nhậndạng ảnh của các chuyên gia, phân tích các tài liệu liên quan đến việc xây dựngchương trình
- Phương pháp thực nghiệm: Lập trình thực nghiệm trên ngôn ngữ lậptrình C# và thư viện Emgu
5 Nội dung nghiên cứu
- Nội dung 1: Nghiên cứu tổng quan về xử lý ảnh và biên
Trong chương này trình bày sơ lược về xử lý ảnh, giới thiệu các bước xử
lý trong một hệ thống xử lý ảnh Một số thành phần cốt tử trong xử lý ảnh, nhưđiểm ảnh, mức xám, độ phân giải, … được trình bày như là các khái niệm Giớithiệu biên và vai trò của biên trong nhận dạng
- Nội dung 2: Nghiên cứu tổng quan thư viện OpenCV/Emgu
Nội dung này đề cập tới thư viện OpenCV/Emgu, các hoạt động cơ bảncủa thư viện OpenCV/Emgu
- Nội dung 3: Một số phương pháp phát hiện biên
Nội dung này đề cập đến một số phương pháp phát hiện biên, các kỹ thuậtthường được sử dụng để phát hiện biên, như: Gradient, Canny, Laplace,…
- Nội dung 4: Xây dựng chương trình từ các phương pháp phát hiện biênđối tượng
Qua việc cài đặt chương trình từ kỹ thuật phát hiện biên Sobel, Prewit,Laplace… làm rõ quá quá trình hoạt động của các kỹ thuật này và những nhậnxét đánh giá các kỹ thuật này
7 Cấu trúc báo cáo
Trang 11Cấu trúc bài báo cáo gồm:
- Phần Mở đầu: Giới thiệu về đề tài, lý do chọn đề tài,
- Chương 1: Tổng quan về xử lý ảnh và biên
- Chương 2: Tổng quan về thư viện OpenCV/Emgu
- Chương 3: Một số phương pháp phát hiện biên
- Chương 4: Xây dựng chương trình
- Phần Kết luận: Đưa ra một số đánh giá tổng quan các kết quả nghiên
cứu, xác định hướng phát triển
8 Ý nghĩa lý luận và thực tiễn của chuyên đề
- Ý nghĩa lý luận: Qua kết quả của chuyên đề bổ sung và củng cố hệ thống
lý thuyết, quy trình, phương pháp phát hiện biên ảnh
- Ý nghĩa thực tiễn:
+ Làm rõ một số thuật toán phát hiện biên ảnh
+ Trên cơ sở thực nghiệm kiểm nghiệm các thuật toán có tác dụng trongquá trình xử lý ảnh nhằm phát hiện biên
Trang 12CHƯƠNG 1 TỔNG QUAN VỀ XỬ LÝ ẢNH VÀ BIÊN
1.1 Tổng quan về xử lý ảnh
1.1.1 Xử lý ảnh
Con người thu nhận thông tin qua các giác quan trong đó thị giác đóng vaitrò quan trọng nhất Cùng với sự phát triển nhanh của phần cứng máy tính, xử lýảnh và đồ hoạ đã phát triển mạnh mẽ và ngày càng có nhiều ứng dụng trongcuộc sống Chính vì thế, xử lý ảnh đóng một vai trò quan trọng trong tương tácngười máy
Xử lý ảnh (Image Processing) là đối tượng nghiên cứu của lĩnh vực thịgiác máy, là quá trình biến đổi ảnh từ một ảnh ban đầu sang một ảnh mới vớicác đặc tính mà tuân theo ý muốn của việc xử lý Kết quả đầu ra của một quátrình xử lý ảnh có thể là một ảnh “tốt hơn” hoặc một kết luận
Xử lý ảnh thông thường gồm 3 bước:
- Bước 3: Kết quả đầu ra - hình ảnh có thể bị thay đổi bằng cách này haycách khác, nó có thể là một ảnh “tốt hơn” (ảnh mờ được xử lý để nhìn rõ hơn)hoặc một kết luận (phân tích ảnh để trích chọn các đặc trưng vân tay hay ảnhmột tai nạn giao thông phác họa hiện trường tại nạn) [1] Đặng Thị Thương(2011), đồ án tốt nghiệp "Tìm hiểu phương pháp phát hiện biên cho ảnh đa cấpxám và ảnh màu", Trường Đại học Dân lập Hải Phòng
1.1.2 Các bước xử lý ảnh
Quá trình xử lý một ảnh đầu vào nhằm thu được một ảnh đầu ra mongmuốn thường phải trải qua rất nhiều bước khác nhau Các bước cơ bản của mộtquá trình xử lý ảnh được thể hiện thông qua hình sau:
Trang 13Hình 1.2 Sơ đồ tổng quát của một hệ thống nhận dạng trong xử lý ảnh
Để thực hiện được quá trình đầu tiên trong hệ thống xử lý ảnh, ta cần sửdụng các thiết bị thu nhận ảnh để chuyển các thông tin dưới dạng hình ảnh thànhcác cấu trúc lưu trữ được trong máy tính và được hiển thị ra màn hình, máy
in, Ảnh có thể thu nhận từ vệ tinh qua các bộ cảm ứng, qua camera, máy chụpảnh đơn sắc (màu), hay các tranh, ảnh được quét trên máy quét ảnh
Ảnh sau khi thu nhận được qua hệ thống thu nhận, ảnh sẽ được lấy mẫu
và số hóa, sau đó sẽ được phân tích theo các loại ảnh
Như vậy mục tiêu của xử lý ảnh có thể chia làm ba hướng như sau:
- Xử lý ảnh ban đầu để cho ra một ảnh mới tốt hơn theo một mong muốncủa người dùng (ví dụ: ảnh mờ cần xử lý để được rõ hơn)
- Phân tích ảnh để thu được thông tin nào đó giúp cho việc phân loại vànhận biết ảnh (ví dụ: phân tích ảnh vân tay để trích chọn các đặc trưng vân tay)
- Từ ảnh đầu vào mà có những nhận xét, kết luận ở mức cao hơn, sâu hơn(ví dụ: ảnh một tai nạn giao thông phác hoạ hiện trường tai nạn)
1.2 Một số khái niệm cơ bản về ảnh số
1.2.1 Điểm ảnh – Pixel/Picture Element
Gốc của ảnh là ảnh liên tục về không gian và độ sáng Để xử lý bằng máytính, ảnh cần phải được số hoá Quá trình số hóa là quá trình biến đổi tín hiệuliên tục sang tín hiệu rời rạc thông qua quá trình lấy mẫu (rời rạc hóa về khônggian) và lượng hóa thành phần giá trị (rời rạc hóa biên độ giá trị) mà về nguyêntắc mắt người không phân biệt được 2 điểm kề nhau Khoảng cách giữa cácđiểm ảnh đó được thiết lập sao cho mắt người không phân biệt được ranh giớigiữa chúng Mỗi một điểm như vậy gọi là điểm ảnh (PEL: Picture Element) haygọi tắt là Pixel
Điểm ảnh (Pixel) là một phần tử của ảnh số tại toạ độ (x, y) với độ xám
Trang 14xám (hoặc màu) của ảnh số gần như ảnh thật Mỗi phần tử trong ma trận đượcgọi là một phần tử ảnh [3] Nguyễn Quang Hoan (2006), giáo trình Xử lý ảnh,Học viện Bưu chính Viễn thông
1.2.2 Độ phân giải – Resolution
Độ phân giải của ảnh là mật độ điểm ảnh được ấn định trên một ảnh sốđược hiển thị
Khoảng cách giữa các điểm ảnh phải được chọn sao cho mắt người vẫnthấ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ộtmật độ phân bố, đó chính là độ phân giải và được phân bố theo trục x và y trongkhô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 * 200 điểmảnh (320*200) Rõ ràng, cùng màn hình CGA 12” ta nhận thấy mịn hơn mànhình CGA 17” độ phân giải 320*200 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[3] Nguyễn Quang Hoan (2006), giáo trình Xử lý ảnh, Học viện Bưu chính Viễnthông
Hình 1.3 Biểu diễn ảnh với độ phân giải
1.2.3 Nhiễu
Có 2 loại nhiễu cơ bản trong quá trình thu nhận ảnh
- Nhiễu hệ thống: Là nhiễu có quy luật có thể khử bằng các phép biến đổiFourier và loại bỏ các đỉnh điểm
- Nhiễu ngẫu nhiên: Vết bẩn không rõ nguyên nhân được khắc phục bằngcác phép lọc (lọc trung bình, lọc trung vị,…) [4] Nguyễn Quang Sơn (2008),luận văn thạc sĩ "Nghiên cứu một số phương pháp phát hiện biên", Trường Đạihọc Thái Nguyên
Trang 151.2.4 Mức xám – Gray level – và phân đoạn ảnh
Một điểm ảnh có hai đặc trưng cơ bản là vị trí (x,y) của điểm ảnh và độxám của nó Dưới đây chúng ta xem xét một số khái niệm và thuật ngữ thườngdùng trong xử lý ảnh
- Mức xám của điểm ảnh là cường độ sáng của nó được gán bằng giá trị
số và là kết quả của quá trình lượng tử hóa tại điểm đó
- Các thang giá trị mức xám thông thường: 16, 32, 64, 128, 256 (mức 256
là mức phổ dụng Lý do từ kỹ thuật máy tính dùng 1 byte để biểu diễn mức xám.Mức xám dùng 1 byte để biểu diễn 28 = 256 mức, tức là từ 0 đến 255)
Từ định nghĩa mức xám, ta phân loại ảnh theo giá trị mức xám của nó:
- Ảnh nhị phân: Ảnh chỉ có 2 mức đen trắng phân biệt tức dùng 1 bit mô
tả 21 mức khác nhau Nói cách khác mỗi điểm ảnh nhị phân chỉ có thể là 0 hoặc
1 Trong đó, bit 1 biểu diễn đối tượng ảnh và được gọi là điểm đen, bit 0 biểudiễn nền (phông ảnh) và được gọi là điểm trắng
- Ảnh xám: Giá trị nằm trong khoảng từ 0 đến 255, như vậy mỗi điểm ảnhtrong ảnh xám được biểu diễn bằng 1 byte Ảnh có nhiều mức xám được gọi làảnh đa cấp xám Ta có thể chuyển đổi từ ảnh xám về ảnh nhị phân theo côngthức:
1 nếu X(m,n) >= θ với θ là ngưỡng tự chọnY(m,n)=
G = 0.333R + 0.333G + 0.333B(Coi ảnh hưởng của R, G, B là như nhau)
Như vậy để xử lý ảnh màu ta phải xử lý trên 3 ảnh xám R, G, B của nó vàkết hợp lại sẽ có kết quả như mong muốn
Trang 161.2.5 Lược đồ mức xám
Lược đồ xám của một ảnh là hàm cung cấp tần suất xuất hiện của mỗimức xám Lược đồ xám được biểu diễn trong hệ tọa độ vuông góc (x, y); trụchoành biểu diễn số mức xám, trục tung biểu diễn số điểm ảnh có cùng mức xám.Lược đồ ảnh cung cấp nhiều thông tin về phân bố mức xám của ảnh, nó cònđược gọi là tính động của ảnh [6] Nguyễn Văn Căn (2010), chuyên đề "Phânđoạn ảnh", Trường Đại học Kỹ thuật - Hậu cần CAND
1.2.6 Láng giềng
Trong xử lý ảnh có hai loại láng giềng: [6] Nguyễn Văn Căn (2010),chuyên đề "Phân đoạn ảnh", Trường Đại học Kỹ thuật - Hậu cần CAND
4-láng giềng của một điểm (x,y) là một tập hợp bao gồm láng giềng dọc
và láng giềng ngang của nó:
N4((x,y)) = {(x+1,y), (x-1,y), (x,y+1), (x,y-1)}
8-láng giềng của (x, y) là một tập cha của 4-láng giềng và bao gồm lánggiềng ngang, dọc và chéo:
N8((x,y))=N4((x,y))x+1,y+1),(x-1,y-1),(x+1,y-1),(x-1),(y+1)}
1.2.7 Vùng liên thông
Một vùng R được gọi là liên thông nếu bất kỳ hai điểm (xA, yA) và (xB, yB)thuộc vào R có thể được nối bởi một đường (xA, yA) (xi-1,yi-1), (xi,yi),(xi+1,yi+1) (xB,yB), mà các điểm (xi,yi) thuộc vào R và bất kỳ điểm (xi,yi) nào đều
kề sát với điểm trước (xi-1,yi-1) và điểm tiếp theo (xi+1,yi+1) trên đường đó
Một điểm (xk,yk) được gọi là kề với điểm (xl,yl) nếu (xl,yl) thuộc vào lánggiềng trực tiếp của (xk,yk) [6] Nguyễn Văn Căn (2010), chuyên đề "Phân đoạnảnh", Trường Đại học Kỹ thuật - Hậu cần CAND
1.3 Tổng quan về biên
1.3.1 Biên và các kiểu biên cơ bản
1.3.1.1 Biên
Cho tới nay chưa có định nghĩa chính xác về biên và mỗi định nghĩa được
sử dụng trong một số trường hợp nhất định Biên có thể được tạo ra bởi bóng tối,kết cấu hình học Biên cũng có thể được định nghĩa là không liên tục ở cường
độ hình ảnh do sự thay đổi trong cấu trúc hình ảnh Biên trong một hình ảnhthường xảy ra với độ phân giải hoặc quy mô khác nhau và đại diện cho quá trìnhchuyển đổi của mức xám khác nhau, hay mức độ gradient Tuy nhiên, nhìnchung biên có thể được định nghĩa như sau:
Điểm biên: một điểm ảnh được coi là điểm biên nếu có sự thay đổi độtngột về mức xám Ví dụ: đối với ảnh đen trắng, một điểm được gọi là điểm biênnếu nó là điểm đen có ít nhất một điểm trắng bên cạnh
Đường biên (đường bao của ảnh - boundary) của đối tượng: được tạothành bởi một tập các điểm biên liên tiếp Mỗi một biên là một thuộc tính gắn
Trang 17liền với một điểm riêng biệt và được tính toán từ những điểm lân cận nó Đó làmột biến Vector bao gồm hai thành phần:
- Độ lớn của Gadient
- Hướng φ được quay đối với hướng Gradient ψ
1.3.1.2 Các kiểu biên cơ bản
- Biên lý tưởng:
Việc phát hiện biên một cách lý tưởng là việc xác định được tất cả cácđường bao trong đối tượng Biên là sự thay đổi đột ngột về mức xám nên sự thayđổi cấp xám giữa các vùng trong ảnh càng lớn thì càng dễ dàng nhận ra biên
Một biên được coi đó là biên lý tưởng khi mà có sự thay đổi cấp xám lớngiữa các vùng trong ảnh Biên này thường chỉ xuất hiện khi có sự thay đổi cấpxám qua một điểm ảnh
Hình 1.4 Đường biên lý tưởng
- Biên dốc:
Biên dốc hay còn gọi là biên bậc thang, xuất hiện khi sự thay đổi cấp xámtrải rộng qua nhiều điểm ảnh Vị trí của cạnh được xem như vị trí chính giữa củađường dốc nối giữa cấp xám thấp và cấp xám cao
Tuy nhiên đây chỉ là đường dốc trong toán học, từ khi ảnh được kỹ thuật
số hoá thì đường dốc không còn là đường thẳng mà thành những đường lởmchởm, không trơn
Hình 1.5 Đường biên bậc thang
- Biên không trơn:
Trang 18Trên thực tế, ảnh thường có biên không lý tưởng, các điểm ảnh trên ảnhthường có sự thay đổi mức xám đột ngột và không đồng nhất, đặc biệt là ảnhnhiễu Trong trường hợp không nhiễu (biên lý tưởng), bất cứ một sự thay đổicấp xám nào cũng thông báo sự tồn tại của một biên Trường hợp đó khó có khảnăng xảy ra, ảnh thường là không lý tưởng, có thể là do các nguyên nhân sau:
Hình dạng không sắc nét
Nhiễu: kết quả của nhiễu trên ảnh gây ra một sự biến thiên ngẫu nhiêngiữa các điểm ảnh Sự xuất hiện ngẫu nhiên của các điểm ảnh có mức xámchênh lệch cao làm cho các đường biên dốc trở lên không trơn chu mà trở thànhcác đường biên gồ ghề, mấp mô, không nhẵn, đây chính là đường biên trên thựctế
Hình 1.6 Đường biên thực
Ngày nay, những phương pháp phát hiện biên hiện đại thường kết hợpnhiễu vào trong mô hình của bài toán và trong quá trình phát hiện biên cũngđược tính đến Còn khái niệm về biên nêu ở trên được sử dụng để xây dựng cácphương pháp phát hiên biên trong quá khứ, những mô hình về cách này được coi
là đơn giản và sơ sài
1.3.2 Vai trò của biên trong nhận dạng
Có thể hình dung tầm quan trọng của biên thông qua ví dụ sau: Khi mộtngười hoạ sĩ vẽ một cái bàn gỗ, chỉ cần phác thảo vài nét về hình dáng như cáimặt bàn, cái chân bàn mà không cần thêm các chi tiết khác, người xem đã có thểnhận ra đó là cái bàn Vài nét phác thảo của người hoạ sĩ chính là đường biênbao quanh đối tượng Nếu ứng dụng của ta là phân lớp nhận diện các đối tượngthì coi như nhiệm vụ đã hoàn thành Tuy nhiên, nếu đòi hỏi thêm các chi tiếtkhác như vân gỗ, màu sắc, kích thước… thì chừng ấy thông tin là chưa đầy đủ.Tại sao phải tìm biên?
Tìm biên là làm nổi bật lên được những điểm ảnh mà tại đó có sự biến đổilớn về giá trị độ sáng so với các điểm xung quanh, thực chất đây là công đọanquan trọng trong công việc phân tích ảnh, bởi vì do các nguyên nhân khác nhaulàm cho ảnh bị suy biến, do vậy phải tăng cường và khôi phục lại ảnh
Tìm biên còn chính là đi tìm được các đường bao quanh của đối tượng,quá trình định vị các điểm biên trong khi mà biên lại làm tăng độ tương phảngiữa biên và nền, cho đến khi biên có thể được nhìn thấy một cách dễ dàng
Trang 19Như đã đề cập tới ở phần tổng quan về một hệ thống nhận dạng và xử lýảnh, quá trình nhận dạng có hai giai đoạn cần thực hiện:
- Giai đoạn học: Các đặc điểm của đối tượng mẫu được lưu trữ (gọi là họcmẫu) và tập các phần tử mẫu được chia thành các lớp
- Giai đoạn nhận dạng: Khi có đối tượng cần nhận dạng, các đặc điểm củađối tượng sẽ được trích chọn và sử dụng hàm quyết định để xác định đối tượngcần nhận dạng thuộc lớp nào
Như vậy, việc nhận dạng sẽ chính xác nếu các đặc điểm được trích chọnchính xác Trong thực tế, các đặc điểm trích chọn phục vụ cho việc nhận dạngthường là các bất biến, bởi vì vấn đề cơ bản trong bài toán nhận dạng ảnh là xácđịnh các đối tượng không phụ thuộc vào vị trí, kích thước và hướng quay
- Có nhiều loại bất biến được trích chọn như:
+ Bất biến thống kê: Các mô men, độ lệch chuẩn của tập ảnh hay các độ
đo thống kê khác không phụ thuộc các phép biến đổi tuyến tính
+ Bất biến hình học: Số đo kích thước của các đối tượng ảnh
+ Bất biến tô-pô: Biểu diễn các cấu trúc tô-pô của các ảnh như số điểmđỉnh, số lỗ hổng v v…
+ Bất biến đại số: Chu tuyến, phân bố của các điểm ảnh, v v dựa vàocác việc tổ hợp các hệ số của đa thức mô tả đối tượng ảnh
Các bất biến dùng trong nhận dạng thường được trích chọn từ biên, xươngcủa đối tượng Do vậy, việc nhận dạng có hiệu quả hay không phụ thuộc nhiềuvào cách biểu diễn hình dạng và mô tả của vật thể
1.3.3 Hướng giải quyết bài toán phát hiện biên
Hiện nay trên thế giới có rất nhiều nghiên cứu về bài toán phát hiện biêncủa đối tượng Tuy nhiên có 2 hướng nghiên cứu chủ yếu đó là:
- Sử dụng NNLT C++ kết hợp với thư viện OpenCV
- Sử dụng NNLT C# kết hợp với thư viện Emgu
Trang 20CHƯƠNG 2 TỔNG QUAN VỀ THƯ VIỆN OPENCV/EMGU
2.1 Thư viện OpenCV
2.1.1 Giới thiệu
OpenCV (Open Source Computer Vision) [7] Nguyễn Văn Căn (2014),giáo trình "Tổng quan về thư viện OpenCV", Trường Đại học Kỹ thuật - Hậucần CAND là một thư viện mã nguồn mở về thị giác máy tính OpenCV đượctích hợp hơn 500 hàm và hơn 2500 thuật toán đã tối ưu về xử lý ảnh, nhận dạng,phân loại, và các vấn đề liên quan tới thị giác máy OpenCV được thiết kếmột cách tối ưu, sử dụng tối đa sức mạnh của các CPU chip đa lõi… để thựchiện các phép tính toán trong thời gian thực, nghĩa là tốc độ đáp ứng của nó cóthể đủ nhanh cho các ứng dụng thông thường OpenCV là thư viện được thiết kế
để chạy trên nhiều nền tảng khác nhau (cross-platform), nghĩa là nó có thể chạytrên hệ điều hành Window, Linux, Mac, iOS… Việc sử dụng thư viện OpenCVtuân theo các quy định về sử dụng phần mềm mã nguồn mở BSD (BerkelySoftware Distribution) do đó người dùng có thể sử dụng thư viện này một cáchmiễn phí cho cả mục đích thương mại lẫn phi thương mại
Dự án về OpenCV được khởi động từ những năm 1999, đến năm 2000 nóđược giới thiệu trong một hội nghị của IEEE về các vấn đề trong thị giác máy vànhận dạng, tuy nhiên bản OpenCV 1.0 mãi tới tận năm 2006 mới chính thứcđược công bố và năm 2008 bản 1.1 (pre-release) mới được ra đời Tháng 10 năm
2009, bản OpenCV thế hệ thứ hai ra đời (thường gọi là phiên bản 2.x), phiên bảnnày có giao diện của C++ (khác với phiên bản trước có giao diện của C) và cókhá nhiều điểm khác biệt so với phiên bản thứ nhất
Thư viện OpenCV ban đầu được sự hỗ trợ từ Intel, sau đó được hỗ trợ bởiWillow Garage, một phòng thí nghiệm chuyên nghiên cứu về công nghệ robot.Cho đến nay, OpenCV vẫn là thư viện mở, được phát triển bởi nguồn quỹ khônglợi nhuận (none-profit foundation) và được sự hưởng ứng rất lớn của cộng đồng
Hình 2.7 Icon của thư viện OpenCV
2.1.2 Phiên bản OpenCV
2.1.2.1 Phiên bản OpenCV 1
Cho tới nay, trải qua hơn 6 năm từ lúc phiên bản OpenCV đầu tiên đượccông bố, đã có lần lượt nhiều phiên bản OpenCV ra đời, tuy nhiên có thể chia
Trang 21thư viện này thành hai bản chính dựa trên những đặc điểm khác biệt lớn nhất củachúng: phiên bản OpenCV thế hệ thứ nhất (hay còn gọi là phiên bản OpenCV1.x) và phiên bản OpenCV thứ hai (hay còn gọi là phiên bản OpenCV 2.x)
OpenCV 1.x (bao gồm bản 1.0 và bản pre-release 1.1) dựa trên giao diện
C, cấu trúc của một ảnh số dựa trên cấu trúc của IplImage
- Trong OpenCV 1.x, người sử dụng phải hoàn toàn quản lý bộ nhớ củacác đối tượng, nghĩa là khi một đối tượng mới được tạo ra, ta phải luôn chú ý, đểgiải phóng nó khi không còn sử dụng nữa (trong nhiều trường hợp có thể sẽ bịtràn bộ nhớ nếu không chú đều này)
2.1.2.2 Phiên bản OpenCV 2
Thư viện OpenCV 2.x việc quản lý bộ nhớ trở nên dễ dàng hơn nhờ cáchàm hủy các các lớp đối tượng trong OpenCV 2.x đã thực hiện điều này khi mộtđối tượng không còn được sử dụng nữa
- Việc viết các dòng lệnh để thực hiện cùng một chức năng trong OpenCV2.x là dễ dàng hơn nhiều so với OpenCV 1.x, một phần là là giao diện C++ cóphần dễ hiểu hơn so với C, một phần là các hàm trong OpenCV 2.x đã được tối
ưu hóa nhiều bước trung gian không cần thiết về mặt giao diện người sử dụng.Chẳng hạn ta hãy xét ví dụ về việc phát hiện đường tròn trong ảnh mầu dựa vàothuật toán Hough, các bước để thực hiện là load một ảnh mầu, chuyển sang ảnhnhị phân, tìm biên dựa trên bộ lọc canny và phát hiện đường tròn dựa trên thuậttoán Hough OpenCV 2.x thực hiện như sau:
// Phát hiện đường tròn trong ảnh OpenCV 2.x
Mat src = imread(“image.jpg”);
Mat gray;
CvtColor (src, gray, CV_BGR2GRAY);
Canny (gray, gray, 10, 30, 3);
Vector<Vec3f> circles;
HoughCircles (gray, circles, CV_HOUGH_GRADIENT, 1, 50, 100, 50);
Đối tượng ảnh gray trong OpenCV 2.x không cần phải khởi tạo, đối tượng
storage (đối tượng trung gian, không có ý nghĩa về mặt sử dụng) cũng không
cần phải khởi tạo (và do đó không cần giải phóng)
- Thư viện OpenCV 2.x chứa khá nhiều hàm, thuật toán về xử lý ảnh vàđược tối ưu khá nhiều đặc biệt trong các khía cạnh về phát hiện đối tượng
(detection), nhận dạng đối tượng (partten regconition) và theo dỗi đối tượng (tracking)
Trong các ví dụ của tài liệu này, các nội dung cài đặt, thuật toán, ứng dụng…chỉ dành cho OpenCV phiên bản 2.x trên nền tảng hệ điều hành Windows [7]Nguyễn Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đạihọc Kỹ thuật - Hậu cần CAND
Trang 222.1.3 Cài đặt OpenCV
Đầu tiên là Download và cài đặt OpenCV, tiếp theo tiến hành tùy chỉnh để
có thể làm kết hợp OpenCV với Microsoft Visual Studio
Trong hướng dẫn ở đây sử dụng phiên bản Visual Studio 2013 vàOpenCV2.3.0, hệ điều hành Windows10 64 bit Đối với các phiên bản khác thaotác tương tự
- Bước 1 Download và cài đặt thư viện OpenCV
Để download thư viện OpenCV về máy tính, thường thì download phiênbản mới nhất tại địa chỉ http://sourceforge.net/projects/opencvlibrary/
Sau khi download, tiến hành cài đặt bình thường, để mặc định ở ổ C với
tên là OpenCV Sau khi cài đặt xong đường dẫn có dạng C:\OpenCV
- Bước 2 Sao chép các hàm trong OpenCV vào Visual Studio
Mục tiêu là sao chép 2 thư mục OpenCV và OpenCV2 trong đường dẫn:
“C:\OpenCV\build\include” sang “C:\Program Files\Microsoft Visual Studio11.0\VC\include”
- Bước 3 Copy các thư viện của OpenCV về thư viện của MS VisualStudio
Mục tiêu là copy tất cả các file thư viện trong OpenCV sang thư viện của
MS Visual Studio
Đánh dấu tất cả các file trong “C:\OpenCV\build\x86\vc11\lib\*.*”
Copy sang “C:\Program Files\Microsoft Visual Studio 11.0\VC\lib”
Ở đây có một số lựa chọn cần thực hiện tùy chọn cho phù hợp:
+ Chọn thư mục x64, do sử dụng Window 8, 64 bit
+ Chọn thư mục vc11, do sử dụng Visual Studio phiên bản 2012 (nếu làVisual Studio 2010 chọn thư mục vc10, nếu là Visual Studio 2008 chọn thư mụcvc9)
- Bước 4 Sao chép các thư viện từ OpenCV sang Windows
Mục tiêu là copy tất cả các file dll từ: “C:\OpenCV\build\x86\vc11\bin”sang “C:\Windows\System32”
- Bước 5 Cấu hình thuộc tính của Project
Các Project lập trình trong Visual Studio C++ có sử dụng các hàm của thưviện OpenCV, cần phải cấu hình thuộc tính của nó có sử dụng đến các thư việncần thiết:
+ Mở cửa sổ dự án (Project)
+ Vào Menu Project, chọn Properties
+ Chọn bên trái cửa sổ: Configuration Properties, chọn Linker, chọn Input
Trang 23+ Sau khi chọn bên trái, thì chọn bên phải tương ứng ở mục AdditionalDependency và thêm các file thư viện cần thiết:
2.1.4 Một số phép xử lý ảnh cơ bản sử dụng thư viện OpenCV
cv::Mat imread(const std::string &filename, int flags) [7] Nguyễn Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại học
Kỹ thuật - Hậu cần CAND
Trong đó,
- Filename là đường dẫn tới file ảnh, nếu file ảnh không nằm trong thư mụclàm việc hiện hành thì ta phải chỉ ra đường dẫn tương đối dạng như D:\Anh\vietnam.jpg hoặc D://Anh//Vietnam.jpg
- Flags là tham số loại ảnh mà ta muốn load vào, cụ thể nếu nếu muốn loadảnh mầu thì ta để CV_LOAD_IMAGE_COLOR, nếu là ảnh xám thì ta đểCV_LOAD_IMAGE_GRAYSCALE…
Trang 24Sau khi đã load ảnh thành công, muốn hiển thị ảnh lên màn hình ta phảitạo ra một cửa sổ, hàm namedWindow sẽ tạo ra cửa sổ với tiêu đề cửa sổ là mộtchuỗi string winname Cấu trúc hàm namedWindow có dạng:
namedWindow(const std::string &winname, int flags) [7] Nguyễn Văn
Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại học Kỹ
thuật - Hậu cần CAND
Tham số flags sẽ chỉ ra kiểu cửa sổ muốn tạo: nếu tham sốCV_WINDOW_AUTOSIZE được sử dụng thì kích cỡ cửa sổ tạo ra sẽ đượchiển thị một cách tự động tùy thuộc vào kích thước của ảnh, nếu là thamsốCV_WINDOW_AUTOSIZE_FULLSCREEN kích thước cửa sổ sẽ khít vớimàn hình máy tính…
Cuối cùng, hàm imshow sẽ hiển thị ảnh ra cửa sổ đã được tạo ra trước đó.Cấu trúc tổng quát của hàm là:
imshow(const std::string &winname, cv::InputArray Mat)[7] Nguyễn Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại học Kỹ thuật - Hậu cần CAND
trong khoảng thời gian là delay Chú ý là nếu không có hàm này thì chươngtrình sau khi chạy sẽ không dừng lại màn hình và kết thúc luôn, ta dung hàm nàymục đích là để dừng màn hình lại trong một khoảng thời gian bằng tham sốdelay (tính theo đơn vị milisecond) Nếu muốn dừng màn hình lại mãi ta đặt cáctham số delay bằng 0
Và sau đây là kết quả chương trình chạy:
Hình 2.8 Ảnh được gọi ra
2.1.4.2 Điều chỉnh độ sáng và độ tương phản trong ảnh
Một ảnh số được lưu trữ trên máy tính là một ma trận các điểm ảnh (haypixel) [7] Nguyễn Văn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV",
Trang 25Trường Đại học Kỹ thuật - Hậu cần CAND Trong OpenCV nó được biểu diễndưới dạng cv::Mat Ta xét một kiểu ảnh thông thường nhất, đó là ảnh RGB Vớiảnh này, mỗi pixel ảnh quan sát được là sự kết hợp của các thành phần màu R(Red), Green (Green) và Blue (Blue) Sự kết hợp này theo những tỉ lệ R, G, Bkhác nhau sẽ tạo ra vô số các màu sắc khác nhau Giả sử ảnh được mã hóa bằng
8 bit với từng kênh màu, khi đó mỗi giá trị của R, G, B sẽ nằm trong khoảng [0,255] Như vậy ta có thể biểu diễn tới 255*255*255 ~ 1.6 triệu màu sắc từ bamàu cơ bản trên Ta có thể xem cách biểu diễn ảnh trong OpenCV ở định dạngcv::Mat qua hình ảnh sau:
Hình 2.9 Biểu diễn độ sáng và tương phản
Như vậy, mỗi ảnh sẽ có n hàng và m cột, m gọi là chiều dài của ảnh(width) và n gọi là chiều cao của ảnh (heigh) Mỗi pixel ở vị trí (i,j) trong ảnh sẽtương ứng với 3 kênh màu kết hợp trong nó Để truy xuất tới từng pixel ảnh vớinhững kênh màu riêng rẽ ta sử dụng mẫu sau:
img.at<cv::Vec3b>(i,j)[k]
Trong đó, i, j là pixel ở hàng thứ i và cột thứ j, img là ảnh mà ta cần truyxuất tới các pixel của nó cv::Vec3b là kiểu vector uchar 3 thành phần, dùng đểbiểu thị 3 kênh màu tương ứng k là kênh màu thứ k, k = 0, 1, 2 tương ứng vớikênh màu B, G, R Chú ý là trong OpenCV, hệ màu RGB được biểu diễn theothứ tự chữ cái là BGR Error: Reference source not found
Sau đây ta sẽ áp dụng kiến thức trên để làm tăng, giảm độ sáng và tươngphản của một ảnh màu, việc làm này cũng hoàn toàn tương tự đối với ảnh xám,chỉ khác biệt là ảnh dùng một kênh duy nhất để biểu diễn ảnh xám [7] NguyễnVăn Căn (2014), giáo trình "Tổng quan về thư viện OpenCV", Trường Đại học
Kỹ thuật - Hậu cần CAND
Chương trình tăng, giảm độ sáng và độ tương phản của một ảnh:
Giả sử f là một hàm biểu diễn cho một ảnh nào đó, f(x,y) là giá trị củapixel trong ảnh ở vị trí (x,y)
Đặt g(x , y)=α f (x , y )+ β
Khi đó,
- Nếu α ≠ 1, thì ta nói ảnh g(x,y) có độ tương phản gấp α lần so với ảnh f(x,y)
- Nếu β ≠ 0 ta nói độ sáng của ảnh g(x,y) đã thay đổi một lượng là β Dựa vào công thức trên ta có chương trình thay đổi độ sáng và tương phản
Trang 26double alpha = 2.0; // Độ tương phản của ảnh muốn chỉnh sửa
int beta = 30; // Độ sáng của ảnh muốn chỉnh sửa
for (int i = 0; i < src.rows; i++) //Xét ảnh theo dòng for (int j = 0; j < src.cols; j++) // Xét ảnh theo cột
for (int k = 0; k < 3; k++) dst.at<Vec3b>(i,j)
[k]=saturate_cast<uchar>(alpha*(src.at<Vec3b>(i, j)[k]) + beta);
//tránh tình trạng dữ liệu ảnh làm tràn số, ta sử dụng hàm uchar convert kiểu dữ liêu type = uchar
imshow("Anh Goc", src); // Đặt tên cho cửa sổ hiển thị ảnh gốc
imshow("Anh sau khi chinh sua", dst); // Đặt tên cho cửa sổ hiển thị ảnh đã chỉnh sửa tăng độ sáng
Sau đây là kết quả chương trình với giá trị α = 2.0 và β=30
Trang 27Hình 2.10 Ảnh trước và sau khi chỉnh sửa tăng độ sáng và tương phản
2.1.4.3 Phóng to, thu nhỏ ảnh
Ảnh số thực chất là một ma trận các điểm ảnh, do đó để có thể phóng to,thu nhỏ hay xoay một tấm ảnh ta có thể sử dụng các thuật toán tương ứng trên
ma trận [7] Nguyễn Văn Căn (2014), giáo trình "Tổng quan về thư việnOpenCV", Trường Đại học Kỹ thuật - Hậu cần CAND
Ta sẽ sử dụng biển đổi affine để quay và thay đổi tỉ lệ to, nhỏ của một matrận
Biến đổi affine:
Giả sử ta có vector p=[ x , y ]T và ma trận M 2x2 Phép biển đổi affinetrong không gian hai chiều có thể được định nghĩa p ’=Mp trong đó Viết mộtcách tường minh ta có:
Hình 2.11 Mô tả phép biến đổi với tỉ lệ α = β = 2
Nếu định nghĩa ma trận M=[cos (θ) −sin (θ) sin (θ) cos (θ) ] thì phép quay sẽ quay p
Trang 28Hình 2.12 Mô tả phép biến đổi với góc quay θ
Nếu ma trận M được định nghĩa thành M =[α sin (θ) −sin (θ) sin (θ) β cos (θ)] thì phépbiến đổi sẽ vừa là phép biến đổi theo tỉ lệ và quay Bây giờ xét chương trìnhphóng to, thu nhỏ và quay ảnh:
Point2f center(src.cols/2, src.rows/2);
Mat mat_rot = getRotationMatrix2D(center, angle, scale);
warpAffine(src, dst, mat_rot, src.size());
cv::getRotationMatrix2D(cv::Point center, double angle, double scale) Error: Reference source not found
Ma trận này được tính toán trong Opencv là ma trận như sau:
M=[ α β (1−α ) center x− β center γ
−β α β center x −(1−α) center y]
Với = scale.cos (angle) và = scale.sin (angle)
Trang 29Ta thấy rằng ma trận này là hoàn hoàn tương đương với ma trận của phépbiến đổi affine đã nói ở trên, ngoại trừ thành phần thứ 3 là thành phần giúp dịchchuyển tâm quay vào chính giữa của bức ảnh Chú ý là có sự khác biệt một chút
về chiều của hệ tọa độ trong ảnh, hệ tọa độ trong ảnh lấy góc trên bên trái làmgốc tọa độ (0,0) còn hệ tọa độ thông thường ta hay lấy điểm dưới bên trái làmgốc, do đó có sự ngược chiều Error: Reference source not found
Kết quả của chương trình với tỉ lệ scale = 1.5 và góc quay = 450 như hình:
Hình 2.13.Ảnh sau khi xoay và phóng to
Ngoài hai phép biến đổi là tỉ lệ và quay như trên, ta có thể thực hiện cácbiến đổi khác của phép biến đổi affine như phép trượt (shearing), hoặc phépphản chiếu (reflection) bằng việc định nghĩa lại ma trận M Ta thử định nghĩa lại
ma trận M để được một ảnh trượt của ảnh gốc
Quay lại ma trận M như trên, nếu ta định nghĩa α = β = 1 còn δ nhận mộtgiá trị bất kì, khi đó ta sẽ có:
Hình 2.14 Mô tả phép trượt
Định nghĩa ma trận M=[1 0.5 00 1 0], để trượt ảnh ban đầu thành ảnh mớivới hệ số trượt δ = 0.5, chú ý là thành phần thứ ba [00] định nghĩa ma trận trongOpenCV sẽ thể hiện dộ dịch chuyển, giống như trong ví dụ trên ta chuyển tâmquay về tâm của bức ảnh chẳng hạn Ta sẽ làm giống hệt ví dụ trên, chỉ thay matrận M là ma trận ta tự định nghĩa:
double I[2][3] = {1,0.5,0, 0,1,0}; // cac phan tu cua ma tran
Trang 30warpAffine(src, dst, mat_rot, src.size());
Và ta có kết quả:
Hình 2.15 Ảnh sau khi biến đổi trượt
2.2 Thư viện Emgu
Hỗ trợ tài liệu XML và intellisense
Sự lựa chọn để sử dụng hình ảnh lớp hoặc trực tiếp gọi chức năng từOpenCV
2.2.2 Thông số chung màu và chiều sâu
Một hình ảnh được xác định bởi các thông số chung của nó: màu sắc(Color) và chiều sâu (Depth) Để tạo ra một hình ảnh xám 8 bit không dấu, trongEmgu nó được thực hiện bằng cách gọi:
Image <Gray, Byte> image = new Image <Gray,Byte> ( width, height);