NHAØ XUAÁT BAÛN ÑAÏI HOÏC QUOÁC GIA TP HOÀ CHÍ MINH LÊ MỸ HÀ THỊ GIÁC MÁY TÍNH VÀ ỨNG DỤNG GIÁO TRÌNH BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ******************* T[.]
Trang 1LÊ MỸ HÀ
THỊ GIÁC MÁY TÍNH
VÀ ỨNG DỤNG
GIÁO TRÌNH
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT
Trang 3Giáo trình THỊ GIÁC MÁY TÍNH
VÀ ỨNG DỤNG
TS LÊ MỸ HÀ
NHÀ XUẤT BẢN ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
Khu phố 6, Phường Linh Trung, Quận Thủ Đức, TP Hồ Chí Minh Dãy C, số 10-12 Đinh Tiên Hoàng, Phường Bến Nghé,
Quận 1,TP Hồ Chí Minh ĐT: 028 6272 6361 – 028 6272 6390 E-mail: vnuhp@vnuhcm.edu.vn
TRUNG TÂM SÁCH ĐẠI HỌC
Dãy C, số 10-12 Đinh Tiên Hoàng, Phường Bến Nghé, Quận 1, TP Hồ Chí Minh
ĐT: 028 6681 7058 - 028 6272 6390 - 028 6272 6351 Website: https://nxbvnuhcm.edu.vn
Chịu trách nhiệm xuất bản
ĐỖ VĂN BIÊN
Chịu trách nhiệm nội dung
ĐỖ VĂN BIÊN
Tổ chức bản thảo và chịu trách nhiệm về tác quyền
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HCM
liên kết giữ bản quyền ©
Copyright © by VNU-HCM Press and author/
co-partnership All rights reserved
Xuất bản năm 2019
Số lượng 300 cuốn, Khổ 16 x 24 cm, ĐKKHXB số: 1989-2019/CXBIPH/
Trang 4ĐỂ CÓ SÁCH HAY, CẦN CHUNG TAY BẢO VỆ TÁC QUYỀN!
Trang 5MỤC LỤC
LỜI NÓI ĐẦU 9
Chương 1: XỬ LÝ ẢNH CƠ BẢN VÀ NGÔN NGỮ LẬP TRÌNH PYTHON 13
1.1 PIL - THƯ VIỆN HÌNH ẢNH TRONG PYTHON 13
1.1.1 Chuyển đổi hình ảnh sang định dạng khác 14
1.1.2 Tạo hình thu nhỏ 15
1.1.3 Sao chép và dán các vùng 15
1.1.4 Thay đổi kích thước và xoay 15
1.2 MATPLOTLIB 15
1.2.1 Vẽ hình ảnh, điểm và đường 16
1.2.2 Đường biên ảnh và lược đồ 17
1.2.3 Chú thích tương tác 19
1.3 NUMPY 19
1.3.1 Thể hiện hình ảnh dưới dạng mảng 20
1.3.2 Biến đổi cấp độ xám 21
1.3.3 Cân bằng lược đồ ảnh 23
1.3.4 Phép tính trung bình pixel ảnh 25
1.3.5 Phân tích thành phần chính (PCA) của hình ảnh 26
1.3.6 Sử dụng Module Pickle 29
1.4 SCIPY 30
1.4.1 Làm mờ ảnh 30
1.4.2 Tính đạo hàm của ảnh (Image derivatives) 32
1.4.3 Các module SciPy hữu ích khác 36
1.5 VÍ DỤ NÂNG CAO: GIẢM NHIỄU HÌNH ẢNH 37
1.6 BÀI TẬP 41
Chương 2: MÔ TẢ ĐẶC TRƯNG HÌNH ẢNH 42
2.1 XÁC ĐỊNH ĐẶC TRƯNG GÓC HARRIS 42
2.2 ĐẶC TRƯNG BẤT BIẾN VỚI SỰ THAY ĐỔI TỶ LỆ ẢNH (SCALE-INVARIANT FEATURE TRANSFORM- SIFT) 49
2.2.1 Lập trình xác định đặc trưng SIFT trong ảnh 53
2.2.2 Đối sánh các mô tả của điểm đặc trưng 54
2.3 BÀI TẬP 60
Trang 6Chương 3: PHÉP ÁNH XẠ HÌNH ẢNH 61
3.1 HOMOGRAPHIES 63
3.1.1 Thuật toán biến đổi tuyến tính trực tiếp 64
3.1.2 Biến đổi Affine 69
3.2 Nắn ảnh 66
3.2.1 Đặt một ảnh trong một ảnh khác 67
3.2.2 Nắn ảnh Affine theo từng cặp 70
3.2.3 Hiển thị hình ảnh 74
3.3 Tạo ảnh toàn cảnh 79
3.3.1 Thuật toán RANSAC 79
3.3.2 Ước tính hệ tọa độ đồng nhất bền vững 81
3.3.3 Ghép các hình ảnh lại với nhau 85
3.4 BÀI TẬP 88
Chương 4: MÔ HÌNH MÁY ẢNH VÀ THỰC TẾ ẢO 89
4.1 MÔ HÌNH MÁY ẢNH LỖ KIM (PIN- HOLE CAMERA) 89
4.1.1 Điểm chiếu 3D 91
4.1.2 Hệ số ma trận camera 93
4.1.3 Tính toán điểm trung tâm camera 94
4.2 HIỆU CHỈNH MÁY ẢNH 94
4.3 ƯỚC LƯỢNG VỊ TRÍ CAMERA TỪ MẶT PHẲNG VÀ ĐIỂM MỐC 96
4.4 THỰC TẾ ẢO 100
4.4.1 PyGame và PyOpenGL 101
4.4.2 Từ ma trận camera đến định dạng OpenGL 102
4.4.3 Đặt các đối tượng ảo trong ảnh 104
4.4.4 Kết nối tất cả ảnh 105
4.4.5 Tải mô hình 107
4.5 BÀI TẬP 109
Chương 5: HÌNH HỌC ĐA GÓC NHÌN (MULTIPLE VIEW GEOMETRY) 110
5.1 EPIPOLAR GEOMETRY 110
5.1.1 Một tập dữ liệu mẫu 112
5.1.2 Vẽ dữ liệu 3D với Matplotlib 114
5.1.3 Epipole và các đường thẳng epipole 117
Trang 75.2 TÍNH TOÁN VỚI MÁY ẢNH VÀ CẤU TRÚC 3D 119
5.2.1 Tính toán ma trận camera từ các điểm 3D 121
5.2.2 Tính toán ma trận camera từ ma trận cơ bản 123
5.2.3 Trường hợp không được hiệu chỉnh - tái cấu trúc hình chiếu 123
5.2.4 Trường hợp được hiệu chỉnh - tái cấu trúc chính xác mô hình 124 5.3 TÁI CẤU TRÚC NHIỀU GÓC NHÌN 125
5.3.1 Ước lượng ma trận cơ bản bền vững 125
5.3.2 Ví dụ tái tạo 3D 128
5.3.3 Phần mở rộng và nhiều hơn hai góc nhìn 131
5.4 ẢNH STEREO 132
5.5 BÀI TẬP 138
Chương 6: PHÂN CỤM ẢNH 139
6.1 THUẬT TOÁN PHÂN CỤM K-MEANS 139
6.1.1 Thư viện phân cụm SciPy 140
6.1.2 Phân cụm ảnh 141
6.1.3 Biểu diễn trực quan ảnh các thành phần chính 143
6.1.4 Phân cụm các Pixels 154
6.2 PHÂN CỤM THEO THỨ BẬC 146
6.3 Phân cụm ảnh 150
6.4 PHÂN CỤM PHỔ 155
6.5 BÀI TẬP 159
Chương 7: TÌM KIẾM ẢNH 160
7.1 TRUY XUẤT ẢNH DỰA TRÊN NỘI DUNG 160
7.2 TỪ NGỮ TRỰC QUAN (VISUAL WORDS) 161
7.3 LẬP CHỈ MỤC ẢNH 165
7.3.1 Thiết lập cơ sở dữ liệu 165
7.3.2 Thêm ảnh 166
7.4 TÌM KIẾM CƠ SỞ DỮ LIỆU CHO ẢNH 168
7.4.1 Tìm kiếm bằng ảnh 170
7.4.2 Kiểm chuẩn và biểu diễn kết quả 171
7.5 XẾP HẠNG KẾT QUẢ BẰNG HÌNH HỌC 173
7.6 XÂY DỰNG CÁC DEMO VÀ ỨNG DỤNG WEB 176
7.7 BÀI TẬP 179
Trang 8Chương 8: PHÂN LOẠI NỘI DUNG HÌNH ẢNH 181
8.1 K-NEAREST NEIGHBORS 181
8.1.1 Một ví dụ 2D đơn giản 182
8.1.2 Đặc trưng hình ảnh dùng dense SIFT (SIFT dày đặc) 185
8.1.3 Phân loại hình ảnh - nhận dạng cử chỉ tay 187
8.2 BỘ PHÂN LOẠI BAYES 190
8.3 SUPPORT VECTOR MACHINES 195
8.3.1 Sử dụng LibSVM 196
8.3.2 Nhận dạng cử chỉ tay lại bằng phương pháp SVM 198
8.4 NHẬN DẠNG KÝ TỰ QUANG HỌC (OPTICAL CHARACTER RECOGNITION) 200
8.4.1 Huấn luyện một bộ phân loại 200
8.4.2 Chọn đặc trưng 201
8.4.3 SVM nhiều lớp 201
8.4.4 Trích xuất các hàng và nhận dạng ký tự 202
8.4.5 Chỉnh sửa hình ảnh 205
8.5 BÀI TẬP 206
Chương 9: PHÂN ĐOẠN ẢNH 208
9.1 PHƯƠNG PHÁP CẮT ĐỒ THỊ (GRAPH CUTS) 208
9.1.1 Đồ thị từ các hình ảnh 210
9.1.2 Phân đoạn với đầu vào của người dùng 215
9.2 PHÂN ĐOẠN BẰNG CÁCH SỬ DỤNG PHÂN CỤM 217
9.3 PHƯƠNG PHÁP BIẾN PHÂN 222
9.4 BÀI TẬP 224
Chương 10: GIỚI THIỆU THƯ VIỆN OpenCV 226
10.1 GIAO DIỆN PYTHON OPENCV 226
10.2 KHÁI NIỆM CƠ BẢN VỀ OPENCV 226
10.2.1 Đọc và viết hình ảnh 227
10.2.2 Không gian màu 227
10.2.3 Hiển thị hình ảnh và kết quả 228
10.3 XỬ LÝ VIDEO 231
10.3.1 Đầu vào video 231
10.3.2 Đọc video vào mảng NumPy 233
10.4 THEO VẾT (TRACKING) 233
Trang 910.4.1 Luồng quang học 233
10.4.2 Thuật toán Lucas-Kanade 236
10.4.3 Sử dụng generators 241
10.5 CÁC VÍ DỤ KHÁC 242
10.5.1 Vá lỗi ảnh (Inpainting) 243
10.5.2 Phát hiện đường thẳng với phép biến đổi Hough 244
10.6 BÀI TẬP 245
Chương 11: ỨNG DỤNG HÌNH HỌC ĐA GÓC NHÌN VÀO XÂY DỰNG MÔ HÌNH 3D KẾT HỢP PHÂN TÍCH NGỮ NGHĨA VÀ PHƯƠNG PHÁP TỐI ƯU LỒI 247
11.1 GIỚI THIỆU 247
11.2 MÔ TẢ THUẬT TOÁN 248
11.2.1 Phân tích ngữ nghĩa 249
11.2.2 Xây dựng lại cảnh quan trong trường hợp đặc biệt 253
11.2.3 Đối sánh theo phương pháp cặp ảnh stereo 259
11.3 THỰC NGHIỆM TRÊN TẬP DỮ LIỆU THỰC 260
11.4 KẾT LUẬN 263
Chương 12: ỨNG DỤNG HÌNH HỌC ĐA GÓC NHÌN TRONG ĐỊNH VỊ CHO MÁY ẢNH ĐA HƯỚNG 264
12.1 GIỚI THIỆU 264
12.2 MÔ TẢ THUẬT TOÁN 264
12.2.1 Ước tính các cặp chuyển động xoay 265
12.2.2 Biến đổi camera đa hướng trong mô hình cầu 266
12.2.3 Trích đặc trưng đường 267
12.2.4 Phát hiện điểm vô cực dựa trên phương pháp RANSAC 270
12.2.5 Tìm các điểm vô cực tương đồng dựa trên phương pháp ước lượng chuyển động xoay 271
12.3 TÍNH TOÁN GÓC XOAY TOÀN CỤC CỦA CAMERA 273
12.4 SỰ PHỤC HỒI CHUYỂN ĐỘNG CỦA CAMERA 273
12.4.1 Điểm tương đồng trên gương cầu 273
12.4.2 Chuyển động của camera với ma trận xoay đã biết 273
12.4.3 Tối ưu hóa trong mô hình hình cầu 275
12.4.3 Tối ưu gần lồi sử dụng ngưỡng giữa 277
12.5 THỰC NGHIỆM 278
Trang 1012.6 KẾT LUẬN 284
Chương 13: ỨNG DỤNG THỊ GIÁC MÁY TÍNH KẾT HỢP BIẾN GPS TRONG ĐỊNH VỊ ROBOT 281
13.1 GIỚI THIỆU 281
13.2 MÔ TẢ THUẬT TOÁN 284
13.3 HỆ THỐNG ĐO LƯỜNG BẰNG THỊ GIÁC DỰA TRÊN CAMERA ĐA HƯỚNG 286
13.3.1 Phân tích mô hình di chuyển 286
13.3.2 Hệ thống đo lường bằng hình ảnh 290
13.4 SỰ HIỆU CHỈNH SAI SỐ ĐO VỊ TRÍ CỦA HỆ THỐNG NHỜ VÀO THÔNG TIN DẪN ĐƯỜNG QUA VỆ TINH (GPS) 293
13.4.1 Đánh giá giá trị đo từ hệ thống định vị toàn cầu 293
13.4.2 Hiệu chỉnh vị trí dựa trên hệ thống định vị toàn cầu 295
13.5 KẾT QUẢ THỰC NGHIỆM 295
13.6 KẾT LUẬN 298
Phụ lục A 300
Phụ lục B 306
TÀI LIỆU THAM KHẢO 310
Trang 11LỜI NÓI ĐẦU
Thị giác máy tính có thể được hiểu một cách khái quát là làm thế nào lập trình một máy tính và sử dụng các thuật toán để hiểu những nội dung thu được từ dữ liệu hình ảnh tương tự như cách làm việc của não bộ và đôi mắt con người Thị giác máy tính hiện nay thu hút rất nhiều sự quan tâm của các nhà khoa học trên thế giới cũng như tại Việt Nam Cùng với sự phát triển mạnh mẽ phần cứng xử lý của máy tính và trí tuệ nhân tạo, thị giác máy tính ngày càng thể hiện vai trò then chốt trong hầu hết các lĩnh vực thuộc khoa học, công nghệ, kỹ thuật cũng như những ứng dụng thiết thực trong đời sống hiện nay Một vài ứng dụng cụ thể có thể kể ra như truy vấn ảnh, phân loại ảnh, xây dựng mô hình ba chiều, điều hướng các Robot, phân tích hình ảnh y tế, v.v
Cuốn sách này ra đời với mục đích giúp người học dễ dàng tiếp cận
và thực hành thị giác máy tính Cơ sở lý thuyết và thuật toán cơ bản được trình bày theo cách đơn giản nhất để sinh viên, nhà nghiên cứu
và những đối tượng khác có cùng đam mê trong lĩnh vực này dễ dàng thực hành trên những ứng dụng cụ thể Ngôn ngữ lập trình Python được lựa chọn sử dụng trong cuốn sách này, đi kèm với nhiều mô hình đã xây dựng sẵn để thực nghiệm
Để tiếp cận nhanh những kiến thức đề cập trong cuốn sách này, người đọc cần tự trang bị thêm một số kiến thức nền tảng về lập trình cơ bản, cần biết cách sử dụng trình soạn thảo và chạy tập lệnh, cách cấu trúc chương trình cũng như các kiểu dữ liệu cơ bản Làm quen với Python hoặc các ngôn ngữ khác như Ruby hoặc Matlab sẽ giúp ích rất nhiều cho việc thực hành Ngoài ra, kiến thức nền tảng về toán học cũng cần phải được trang bị thêm ví dụ như hiểu biết về ma trận, vectơ, các hàm và khái niệm đạo hàm, phương pháp gradient để thực hiện các bài toán tối ưu
Trang 12Các chương trong cuốn sách trình bày những lĩnh vực quan trọng nhất của thị giác máy tính và các chương trình mẫu để thực hiện nhận dạng đối tượng, truy xuất hình ảnh dựa trên nội dung, tìm kiếm hình ảnh, nhận dạng ký tự, dòng quang học (optical flow), theo vết (tracking), tái tạo hình ảnh ba chiều, định vị camera, phân đoạn hình ảnh, khử nhiễu, phân nhóm hình ảnh và nhiều hơn nữa Ở phần cuối quyển sách này, một số ứng dụng
cụ thể của thị giác máy tính trong ước lượng vị trí cũng nhưxây dựng mô hình ba chiều trên tập dữ liệu lớn cũng được giới thiệu
Sơ lược về các chương
Chương 1 giới thiệu các công cụ cơ bản để làm việc với hình ảnh và các mô hình Python được sử dụng trong sách Chương này cũng bao gồm nhiều ví dụ cơ bản cần thiết cho các chương còn lại
Chương 2 giải thích các phương pháp phát hiện các điểm đặc trưng bất biến và cách sử dụng chúng để tìm các điểm và vùng tương đồng giữa các hình ảnh
Chương 3 trình bày các phép biến đổi cơ bản giữa hình ảnh và các phương pháp để tính toán Một số ví dụ cụ thể từ đơn giản như nắn ảnh cho đến phức tạp hơn như tạo hình ảnh panorama
Chương 4 giới thiệu cách viết phương trình mô hình máy ảnh, các phép chiếu từ không gian 3D đến điểm đặc trưng trong ảnh và ước lượng góc nhìn của máy ảnh
Chương 5 giải thích cách làm việc với một số hình ảnh chụp cùng một cảnh quan, các nguyên tắc cơ bản của hình học đa góc nhìn và tính toán tái tạo mô hình ba chiều (3D) từ nhiều hình ảnh khác nhau
Chương 6 giới thiệu một số phương pháp phân cụm và chỉ ra cách
sử dụng chúng để nhóm và sắp xếp hình ảnh dựa trên sự tương đồng hoặc nội dung ảnh
Chương 7 trình bày kỹ thuật truy xuất hình ảnh hiệu quả, có thể lưu trữ các biểu diễn ảnh và tìm kiếm hình ảnh dựa trên nội dung của chúng.Chương 8 mô tả các thuật toán để phân loại nội dung hình ảnh và cách sử dụng chúng để nhận dạng các đối tượng trong hình ảnh
Trang 13Chương 9 giới thiệu các kỹ thuật khác nhau để phân chia một hình ảnh thành các vùng có ý nghĩa bằng cách sử dụng phân cụm, tương tác, hoặc mô hình ảnh.
Chương 10 trình bày cách sử dụng giao diện Python cho thư viện thị giác máy tính OpenCV phổ biến và cách làm việc với dữ liệu đầu vào là video
Chương 11 trình bày ứng dụng của hình học đa góc nhìn kết hợp phân tích ngữ nghĩa và tối ưu lồi để thực hiện xây dựng mô hình ba chiều trong không gian rộng lớn
Chương 12 giới thiệu phương pháp tính toán vị trí của camera đa hướng trên tọa độ cầu
Chương 13 trình bày ứng dụng định vị cho các thiết bị di chuyển trên vùng làm việc rộng lớn ngoài trời kết hợp thị giác máy tính và các loại cảm biến khác để hiệu chỉnh sai số vị trí cho ra kết quả định vị chính xác nhất.Trong phụ lục A và B, người dùng sẽ được hướng dẫn cách cài đặt chương trình và các tập dữ liệu ảnh phổ biến trên thế giới để có thể tải về
Trang 15ví dụ như đọc hình ảnh, chuyển đổi và nhân rộng hình ảnh, tính toán đạo hàm,
vẽ hoặc lưu kết quả sẽ được giới thiệu trong phần này
Thư viện hình ảnh Python (PIL) cung cấp chung cho việc xử lý hình ảnh và nhiều thao tác hình ảnh cơ bản hữu ích như thay đổi kích thước, cắt xén, xoay, chuyển đổi màu sắc và các tác vụ khác Thư viện PIL có thể tải miễn phí tại trang web http://www.pythonware.com/products/pil/
Với thư viện PIL, có thể đọc và ghi các hình ảnh từ hầu hết các định dạng phổ biến nhất hiện nay Mộttrong những module quan trọng nhất trong xử lý hình ảnh là Image module Để đọc một hình ảnh có thể sử dụng đoạn chương trình sau:
Giá trị trả về, pil_im, là một đối tượng hình ảnh
Chuyển đổi màu được thực hiện bằng lệnh convert() Để đọc một hình ảnh và chuyển đổi nó thành thang độ xám, chỉ cần thêm convert (‘L’) như sau:
Dưới đây là một số ví dụ được lấy từ tài liệu PIL, có sẵn tại địa chỉ
là http://www.pythonware.com/library/pil/handbook/index.htm Đầu ra từ các ví dụ được mô tả trong Hình 1.1
Trang 16Hình 1.1: Ví dụ về xử lý ảnh bằng PIL
1.1.1 Chuyển đổi hình ảnh sang định dạng khác
Sử dụng lệnh save(), PIL có thể lưu hình ảnh ở hầu hết các định dạng tệp hình ảnh Ở đây, một ví dụ có thể lấy tất cả các tệp hình ảnh trong một danh sách tên tệp (danh sách tệp) và chuyển đổi hình ảnh thành tệp JPEG
Hàm PIL open() tạo một đối tượng hình ảnh PIL và lệnh save() lưu hình ảnh vào một tệp với tên tệp đã cho trước Thay vào đó, tên tệp mới sẽ giống như tên gốc với đuôi tệp là “.jpg” PIL đủ thông minh để xác định định dạng hình ảnh từ phần mở rộng tập tin Có một kiểm tra đơn giản rằng tệp chưa phải là tệp JPEG và thông báo sẽ được in ra màn hình nếu chuyển đổi không thành công
Trong suốt cuốn sách này, chúng ta thông thường sẽ xử lý một tập nhiều hình ảnh Dưới đây sẽ trình bày cách có thể tạo một danh sách tên tệp cho tất cả các hình ảnh trong một thư mục Tạo một tệp imtools.py để lưu trữ một số đường dẫn và thêm hàm sau:
Trang 171.1.2 Tạo hình thu nhỏ
Sử dụng PIL để tạo hình thu nhỏ khá đơn giản Lệnh thumbnail() lấy một bộ chỉ định kích thước mới và chuyển đổi hình ảnh thành hình ảnh thu nhỏ với kích thước vừa với bộ dữ liệu Để tạo hình thu nhỏ với cạnh dài nhất 128 pixel, hãy sử dụng cú pháp như sau:
1.1.3 Sao chép và dán các vùng
Cắt một vùng từ một hình ảnh được thực hiện bằng lệnh crop()
Vùng được xác định bởi 4 thông số, trong đó tọa độ là (trái, trên, phải, dưới) PIL sử dụng hệ tọa độ có (0, 0) ở góc trên bên trái Ví dụ, vùng được trích xuất có thể được xoay và sau đó đặt lại bằng lệnh paste () như sau:
1.1.4 Thay đổi kích thước và xoay
Để thay đổi kích thước hình ảnh, gọi hàm resize() bằng một bộ thông
số cho kích thước mới
Để xoay hình ảnh, sử dụng các góc ngược chiều kim đồng hồ và xoay () như sau:
Một số ví dụ được hiển thị trong Hình 1.1 Hình ảnh ngoài cùng bên trái là bản gốc, tiếp theo là phiên bản thang độ xám, hình cắt và hình ảnh thu nhỏ
Khi làm việc với toán học và vẽ đồ thị hoặc vẽ các điểm, đường thẳng
và đường cong trên hình ảnh, Matplotlib là một thư viện đồ họa tốt với các tính năng mạnh hơn nhiều so với đồ thị có sẵn trong PIL Matplotlib tạo ra các hình ảnh chất lượng cao giống như nhiều hình minh họa được sử dụng
Trang 18trong cuốn sách này Giao diện Matplotlib PyLab là tập hợp các chức năng cho phép người dùng tạo các đồ thị Matplotlib là chương trình nguồn mở
và có sẵn miễn phí tại http://matplotlib.sourceforge.net/ Tại đây cũng có tài liệu và hướng dẫn chi tiết về cách dùng các công cụ trong đó Dưới đây
là một số ví dụ cho thấy hầu hết các chức năng sẽ cần trong cuốn sách này
1.2.1 Vẽ hình ảnh, điểm và đường
Có thể tạo ra các đồ thị cột, lược đồ hình tròn, các lược đồ phân tán,… với một vài lệnh cho hầu hết các mục đích của thị giác máy tính Quan trọng nhất, muốn hiển thị những điểm đặc trưng, sự đối xứng và các đối tượng được phát hiện bằng cách sử dụng điểm và đường Dưới đây là một ví dụ về vẽ đồ thị với một vài điểm và đường thẳng
Đoạn chương trình này hiển thị hình ảnh, sau đó vẽ bốn điểm kýhiệu bằng dấu sao màu đỏ với tọa độ x và y cho trước, và cuối cùng
vẽ một đường (màu xanh theo mặc định) giữa hai điểm đầu tiên Hình 1.2 cho thấy kết quả của đoạn chương trình Lưu ý rằng PyLab sử dụng gốc tọa độ ở góc trên cùng bên trái như thông thường cho hình ảnh Trục tọa độ rất hữu ích để gỡ lỗi (debug), nhưng nếu muốn một lược đồ đẹp hơn có thể thêm lệnh:
Lệnh này sẽ xóa trục đồ thị như hình bên phải thay vì hình bên trái trong Hình 1.2
Trang 19(a) (b)
Hình 1.2: Ví dụ vẽđồ thị với Matplotlib
Hình (a) hiển thị trục tọa độ Hình (b) không hiển thị trục tọa độ
Có nhiều tùy chọn để định dạng màu sắc và kiểu dáng khi vẽ Hữu ích nhất là các lệnh ngắn được hiển thị trong Bảng 1.1, 1.2 và 1.3 Sử dụng chúng như sau:
1.2.2 Đường biên ảnh và lược đồ
Sau đây xem xét hai ví dụ về các đồ thị đặc biệt: đường biên hình ảnh
và lược đồ hình ảnh Việc quan sát được đường biên ảnh cung cấp nhiều thông tin rất hữu ích Điều này cần hình ảnh thang độ xám (gray scale) vì các đường biên được thực hiện trên ảnh một lớp Sau đây là một số tùy chọn để hiển thị đồ thị
Bảng 1.1: Các lệnh định dạng màu cơ bản để vẽ đồ thị với PyLab
Trang 20Bảng 1.2: Các lệnh định dạng kiểu đường cơ bản để vẽ sơ đồ với PyLab
Bảng 1.3: Các lệnh định dạng đánh dấu đồ thị cơ bản
để vẽ đồ thị với PyLab
Như trước đây, lệnh PIL convert() thực hiện chuyển đổi sang thang độ xám
Lược đồ hình ảnh là một lược đồ thể hiện sự phân bố các giá trị pixel
Số lượng ô được chỉ định cho khoảng của các giá trị và mỗi cột được tính
số lượng pixel có giá trị trong phạm vi của ô Việc hiển thị lược đồ hình ảnh (mức xám) được thực hiện bằng cách sử dụng hàm hist()
Đối số thứ hai chỉ định số lượng cột sẽ sử dụng Lưu ý rằng hình ảnh cần phải được làm phẳng trước vì hist() lấy mảng một chiều làm
Trang 21đầu vào Lệnh flatten() chuyển đổi bất kỳ mảng nào thành mảng một chiều với các giá trị được lấy theo hàng Hình 1.3 cho thấy lược đồ đường biên và lược đồ.
1.2.3 Chú thích tương tác
Đôi khi người dùng cần tương tác với một ứng dụng, ví dụ bằng cách đánh dấu các điểm trong một hình ảnh hoặc cần chú thích một số dữ liệu huấn luyện PyLab đi kèm với một hàm đơn giản, ginput(), cho phép làm điều đó Đây là một ví dụ ngắn:
Hình 1.3: Ví dụ về trực quan hóa các đường biên của hình ảnh và vẽ
lược đồ hình ảnh với Matplotlib
NumPy (http://www.scipy.org) là một gói thư viện được sử dụng phổ biến cho khoa học máy tính với Python NumPy chứa một số khái niệm rất hữu ích như các đối tượng mảng (để đại diện các vectơ, ma trận, hình ảnh
và nhiều hơn nữa) và các hàm đại số tuyến tính Đối tượng mảng NumPy
sẽ được sử dụng trong hầu hết tất cả các ví dụ trong suốt cuốn sách này Đối tượng mảng cho phép thực hiện các thao tác quan trọng như nhân ma trận, hoán vị, giải hệ phương trình, nhân vectơ và chuẩn hóa, cần thực hiện những việc như căn chỉnh hình ảnh, làm cong ảnh, biến đổi mô hình, phân loại hình ảnh, phân nhóm hình ảnh, v.v
Trang 22NumPy có sẵn miễn phí từ http://www.scipy.org/Download và tài liệu trực tuyến (http://docs.scipy.org/doc/numpy/) chứa câu trả lời cho hầu hết của các câu hỏi Để biết thêm chi tiết về NumPy, có thể tham khảo tài liệu số [24].
Ví dụ sau minh họa điều này cho hình ảnh:
Kết quả cho ra như sau:
(800, 569, 3) uint8
(800, 569) float32
Bộ dữ liệu đầu tiên trên mỗi dòng là hình dạng của hình ảnh (hàng, cột, kênh màu) và chuỗi sau là kiểu dữ liệu của các thành phần mảng Hình ảnh thường được chương trình hóa với số nguyên 8 bit không dấu (uint8),
do đó, việc tải hình ảnh này và chuyển đổi sang một mảng sẽ cho loại
“uint8” trong trường hợp đầu tiên Trường hợp thứ hai thực hiện chuyển đổi thang độ xám và tạo mảng với đối số phụ “f” Đây là một lệnh ngắn
để đặt loại floating Để biết thêm tùy chọn loại dữ liệu, xem [24] Lưu ý rằng hình ảnh thang độ xám chỉ có hai giá trị trong thông số kích thước, nó không có thông tin số kênh màu
Các phần tử trong mảng được truy cập với các chỉ số Giá trị tại tọa
độ i, j và kênh màu k được truy cập như sau:
Nhiều phần tử có thể được truy cập bằng cách cắt mảng Dưới đây là một số ví dụ về hình ảnh thang độ xám:
Trang 23Lưu ý, ví dụ chỉ có một chỉ số Nếu chỉ sử dụng một chỉ số, nó được hiểu là chỉ số hàng Cũng lưu ý các ví dụ cuối cùng Chỉ số âm sẽ tính những phần tử từ cuối cùng tính lên Đây là công cụ thường xuyên sử dụng cắt mảng để truy cập các giá trị pixel và đó là một khái niệm quan trọng để hiểu giá trị phần tử trong mảng.
Có nhiều toán tử và cách để sử dụng mảng Chúng sẽ được giới thiệu trong suốt cuốn sách này Xem tài liệu trực tuyến hoặc cuốn sách [24] để biết thêm một số giải thích chi tiết
1.3.2 Biến đổi cấp độ xám
Sau khi đọc hình ảnh cho mảng NumPy, có thể thực hiện bất kỳ thao tác toán học nào muốn thực hiện trên chúng Một ví dụ đơn giản về điều này là biến đổi các mức độ xám của hình ảnh Lấy bất kỳ hàm f nào ánh xạ khoảng 0 255 (hoặc 0 1 sau khi đã chuẩn hóa hình ảnh) với chính nó (có nghĩa là đầu ra có cùng khoảng với đầu vào) Dưới đây là một
số ví dụ
Ví dụ đầu tiên đảo ngược các mức độ xám của hình ảnh, ví dụ thứ hai ép cường độ vào khoảng 100 200 và thứ ba áp dụng hàm bậc hai, làm giảm các giá trị của các pixel tối Hình 1.4 trình bày các hàm và Hình 1.5
là kết quả Có thể kiểm tra giá trị tối thiểu và tối đa của mỗi hình ảnh bằng cách sử dụng:
Trang 24Thực hiện trên các ví dụ hình ảnh bên trên, sẽ nhận được kết quả đầu
Nếu đã thực hiện một số thao tác để thay đổi loại từ “uint8” sang loại
dữ liệu khác, ví dụ như im3 hoặc im4 trong ví dụ trên, cần chuyển đổi lại trước khi tạo hình ảnh PIL
Nếu không hoàn toàn chắc chắn về loại đầu vào, nên làm điều này vì
đó là sự lựa chọn an toàn Lưu ý rằng NumPy sẽ luôn thay đổi loại mảng thành loại “thấp nhất” có thể để mô tả cho dữ liệu Phép nhân hoặc chia với
số có kiểu biến số thực sẽ thay đổi một mảng kiểu số nguyên thành số thực
Hình 1.4: Ví dụ biến đổi mức xám Ba hàm ví dụ cùng với biến đổi cường
độ hiển thị dưới dạng đường đứt nét
Trang 25(a) (b) (c)
Hình 1.5: Biến đổi mức xám Áp dụng các hàm trong Hình 1.4 (a) Đảo ngược hình ảnh với f (x) = 255 - x,
(b) ép hình ảnh với f (x) = (100/255) x + 100,
(c) biến đổi bậc hai với f(x) = 255(x/255) 2
Thay đổi kích thước hình ảnh
Mảng NumPy sẽ là công cụ chính để làm việc với hình ảnh và dữ liệu Không có cách đơn giản để thay đổi kích thước mảng đối với hình ảnh Có thể sử dụng chuyển đổi đối tượng hình ảnh PIL được trình bày ở phần trước để thực hiện chức năng thay đổi kích thước hình ảnh đơn giản Thêm phần sau vào imtools.py Hàm này sẽ có ích cho các phân tích hình ảnh sau này
1.3.3 Cân bằng lược đồ ảnh
Một ví dụ rất dễ hiểu về biến đổi mức xám là cân bằng lược đồ ảnh Dạng chuyển đổi này làm phẳng lược đồ mức xám của một hình ảnh sao cho tất cả các cường độ cân bằng nhất có thể Đây thường là cách tốt để cân bằng cường độ hình ảnh trước khi xử lý thêm và cũng là một cách để tăng độ tương phản hình ảnh
Trong trường hợp này, hàm biến đổi là hàm phân bố tích lũy (cdf) của các giá trị pixel trong ảnh (được chuẩn hóa để ánh xạ phạm vi của các giá trị pixel đến phạm vi mong muốn) Sau đây là chương trình mẫu để thực hiện điều đó Thêm chức năng này vào tập tin imtools.py
Trang 26Hàm lấy hình ảnh thang độ xám và số lượng cột (bins) sẽ sử dụng trong lược đồ làm đầu vào và trả về một hình ảnh có cân bằng lược đồ cùng với hàm phân bố tích lũy được sử dụng để thực hiện ánh xạ các giá trị pixel Lưu ý việc sử dụng phần tử cuối cùng (chỉ số -1) của cdf để chuẩn hóa nó trong khoảng từ 0 1 Thực hiện cân bằng trên một hình ảnh như sau:
Hình 1.6 và 1.7 cho thấy các ví dụ về cân bằng lược đồ ảnh Hàng trên cùng hiển thị lược đồ mức xám trước và sau khi cân bằng cùng với ánh
xạ cdf.Đồ thị ở giữa là hàm biến đổi mức xám Như có thể thấy, độ tương
phản tăng và chi tiết của các vùng tối hiện rõ ràng
Hình 1.6: Ví dụ về cân bằng lược đồ
Trang 27Hình 1.7: Ví dụ về cân bằng lược đồ
1.3.4 Phép tính trung bình pixel ảnh
Phép tính trung bình pixel ảnh là một cách đơn giản để giảm nhiễu hình ảnh và cũng thường được sử dụng cho các hiệu ứng nghệ thuật Tính toán một hình ảnh trung bình từ một tập các hình ảnh có thể được thực hiện khá đơn giản
Giả sử tất cả các hình ảnh có cùng kích thước, có thể tính trung bình của tất cả các hình ảnh đó bằng cách tổng hợp chúng và chia cho số lượng hình ảnh Thêm chức năng sau vào imtools.py
Trong chương trình trên những hình ảnh không đọc được sẽ được bỏ qua trong phép tính trung bình Có một cách khác để tính toán các hình ảnh trung bình bằng cách sử dụng hàm mean() Điều này đòi hỏi tất cả các hình ảnh được xếp chồng lên nhau thành một mảng (và sẽ sử dụng nhiều bộ nhớ nếu có nhiều hình ảnh), hàm này sẽ được sử dụng trong các phần tiếp theo
Trang 281.3.5 Phân tích thành phần chính (PCA) của hình ảnh
Phân tích thành phần chính (PCA) là một kỹ thuật hữu ích để giảm kích thước và tối ưu theo nghĩa là nó thể hiện dữ liệu huấn luyện đa dạng với kích thước càng ít càng tốt Ngay cả một hình ảnh xám có kích thước 100x100 pixel cũng có 10.000 chiều và có thể được xem như là một điểm trong không gian 10.000 chiều Một hình ảnh có kích thước megapixel sẽ
có hàng triệu chiều Với kích thước cao như vậy, không có gì ngạc nhiên khi giảm kích thước có ích trong nhiều ứng dụng thị giác máy tính Ma trận chiếu từ PCA có thể được xem là sự thay đổi hệ tọa độ thành một hệ tọa độ khác trong đó tọa độ sắp xếp theo thứ tự quan trọng giảm dần
Để áp dụng PCA trên dữ liệu hình ảnh, hình ảnh cần được chuyển đổi thành đại diện vectơ một chiều, ví dụ: sử dụng lệnh flatten() của NumPy.Các hình ảnh phẳng được thu thập trong một ma trận bằng cách xếp chúng, một hàng cho mỗi hình ảnh Các hàng sau đó được tính giá trị trung bình trước khi tính toán các hướng chính Để tìm các thành phần chính, phương pháp SVD (singular value decomposition) thường được sử dụng Trong một vài trường hợp đặc biệt khi dữ liệu có nhiều chiều (high dimesionality), phương pháp SVD sẽ tính toán rất chậm Đoạn chương trình mẫu sau đây được viết để thực hiện điều này:
Trang 29Hàm này trước tiên tính trung tâm của dữ liệu bằng cách trừ giá trị trung bình theo từng chiều Sau đó, vectơ riêng tương ứng với các giá trị riêng lớn nhất của ma trận hiệp phương sai được tính toán bằng cách sử dụng phương pháp SVD Ở đây, đã sử dụng hàm range() lấy số nguyên n
ma trận V là trực giao và chứa các hướng tọa độ theo thứ tự phương sai giảm dần của dữ liệu huấn luyện
Chúng ta có thể thực hiện phương pháp này trên một ví dụ về hình ảnh fontchữ Tệp fontimages.zip chứa hình ảnh thu nhỏ của ký tự “a” được
in bằng các fontchữ khác nhau và sau đó được quét Các fontchữ 2359 là
từ một bộ sưu tập các fontchữ có sẵn Giả sử tên tệp của những hình ảnh này được lưu trữ trong một danh sách, imlist, cùng với chương trình trước
đó, trong tệp pca.py, các thành phần chính có thể được tính toán và hiển thị như sau:
Trang 30Lưu ý rằng hình ảnh cần phải được chuyển đổi trở lại từ hình ảnh một chiều bằng cách sử dụng hàm reshape() Khi chạy ví dụ sẽ cho tám hình ảnh trong một cửa sổ hình giống như trong Hình 1.8 Ở đây, đã sử dụng hàm subpolt() để đặt nhiều ô trong một cửa sổ.
Hình 1.8: Hình ảnh trung bình (trên cùng bên trái) và bảy chế độ đầu
tiên, tức là các hướng có nhiều biến thể nhất
1.3.6 Sử dụng Module Pickle
Nếu muốn lưu một số kết quả hoặc dữ liệu để sử dụng sau này, sử dụng module pickle rất hữu ích Pickle có thể lấy hầu hết mọi đối tượng Python và chuyển đổi nó thành định dạng chuỗi Quá trình này được gọi là nén Tái cấu trúc đối tượng từ đại diện chuỗi được gọi là giải nén
Mô tả chuỗi dưới dạng này có thể dễ dàng lưu trữ hoặc truyền gửi đi
Có thể minh họa điều này bằng một ví dụ như sau Giả sử muốn lưu hình ảnh trung bình và các thành phần chính của hình ảnh fontchữ trong phần trước, tiến hành thực hiện các dòng lệnh như sau:
Có thể thấy rằng một số đối tượng có thể được chọn vào cùng một tệp Thông thường có một số giao thức khác nhau có sẵn cho các tệp pkl nhưng nếu không chắc chắn tốt nhất là đọc và ghi tệp nhị phân
Để tải dữ liệu trong một số phiên bản Python khác, chỉ cần sử dụng lệnh load() như sau:
Trang 31Lưu ý rằng thứ tự của các đối tượng nên giống nhau Ngoài ra còn
có một phiên bản tối ưu hóa được viết bằng C gọi là cpickle hoàn toàn tương thích với mô hình pickle tiêu chuẩn Thông tin chi tiết trên trang tài liệu về mô hình pickle tham khảo tại https://docs.python.org/3/library/pickle.html
Trong nội dung cuốn sách này, sẽ sử dụng câu lệnh with để xử lý việc đọc và ghi tệp Đây là cấu trúc được giới thiệu trong Python 2.5,
tự động xử lý việc mở và đóng tệp (ngay cả khi xảy ra lỗi trong khi tệp đang mở) Đây là những gì việc lưu và tải ở trên trông giống như sử dụng lệnh with()
Cấu trúc này rất hữu ích tuy nhiên nếu không muốn sử dụng chỉ cần
Trang 32Ngoài ra, có thể tìm hiểu thêm từ tài liệu trực tuyến: http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html.
Cuối cùng, NumPy có các hàm chuyên dụng để lưu và tải mảng Tìm kiếm save() và load() trong tài liệu trực tuyến để biết chi tiết hơn
1.4 SCIPY
SciPy (http://scipy.org/) là gói thư viện nguồn mở dành cho toán học xây dựng trên NumPy và cung cấp các các toán tử cần thiết bao gồm phép tính tích phân, tối ưu hóa, thống kê, xử lý tín hiệu và quan trọng nhất là xử
lý hình ảnh Những phần tiếp theo sau đây sẽ trình bày nhiều module hữu ích trong thư viện SciPy Thư viện SciPy có sẵn tại tranghttp://scipy.org/Download.Một số tập lệnh và ứng dụng trong thư viện Scipy được bình bày sau đây
1.4.1 Làm mờ ảnh
Một ví dụ kinh điển và rất hữu ích về tích chập hình ảnh là làm mờ hình ảnh dùng mặt nạ Gaussian Về bản chất, hình ảnh (thang độ xám) I tích chập với mặt nạ Gaussian để tạo ra một hình ảnh được làm mờ:
Iσ = ∗I Gσ (1.1)Trong đó * biểu thị tích chập và Gσlà mặt nạ 2D Gaussian với độ lệch chuẩn σ được định nghĩa là:
( 2 2)/2 2
12
SciPy đi kèm với một module để lọc ảnh được gọi là scipy.ndimage.filters có thể được sử dụng để tính toán phép tích chập bằng cách sử dụng phân tách nhanh một chiều Đoạn chương trình mẫu được
mô tả bên dưới:
Ở đây, tham số cuối cùng của gaussian_filter () là độ lệch chuẩn
Trang 33Hình 1.9: Một ví dụ về làm mờ Gaussian bằng cách sử dụng mô hình scipy.ndimage.filters (a) ảnh gốc trong thang độ xám, (b) bộ lọc
Gaussian với σ = 2, (c) với σ = 5, (d) với σ = 10.
Hình 1.9 cho thấy các ví dụ về hình ảnh bị mờ khi tăng dần độ giá trị
σ Giá trị lớn hơn của σ cung cấp ít chi tiết hơn Để làm mờ hình ảnh màu, chỉ cần áp dụng phương pháp tích chập dùng Gaussian cho mỗi kênh màu riêng biệt
Ở đây, việc chuyển đổi trong dòng lệnh cuối cùng dùng để biến đổi ảnh thành kiểu biến “uint8” không phải lúc nào cũng cần thiết ngoài việc đôi khi phải thay đổi các giá trị pixel ở dạng số nguyên không âm 8 bit Có thể sử dụng lệnh sau để chuyển đổi kiểu biến ảnh
Để biết thêm về cách sử dụng module này và các lựa chọn tham số khác nhau, có thể xem tài liệu về SciPy của scipy.ndimage tại: http://docs.scipy.org/doc/scipy/reference/ndimage.html
1.4.2 Tính đạo hàm của ảnh (Image derivatives)
Giá trị cường độ pixel trên ảnh thay đổi như thế nào là thông tin quan trọng, được sử dụng cho nhiều ứng dụng như sẽ thấy trong suốt cuốn sách này Sự thay đổi cường độ được mô tả với các đạo hàm theo trục x và ylà
x
I và I y của ảnh màu xám I (đối với ảnh màu, các đạo hàm thường được lấy cho mỗi kênh màu)
Trang 34Vectơ gradient của ảnh ∇ = I I I x yT Gradient có hai thuộc tính quan trọng đó là độ lớn vectơ gradient
I = ∗I D và I y = ∗I D y (1.5)Hai lựa chọn phổ biến cho Dx và Dy là các bộ lọc Prewitt:
Trang 35Hình 1.10: Một ví dụ về tính toán các đạo hàm hình ảnh bằng cách sử dụng các bộ lọc phái sinh Sobel (a) ảnh gốc theo thang độ xám, (b) đạo
âm là tối Vùng màu xám có giá trị gần bằng không
Sử dụng phương pháp này có nhược điểm là các đạo hàm được lấy theo tỷ lệ được xác định bởi độ phân giải hình ảnh Để phương pháp này bền vững hơn đối với hình ảnh bị nhiễu và tính toán các đạo hàm ở bất kỳ
tỷ lệ nào, có thể sử dụng các bộ lọc đạo hàm Gaussian,
I = ∗I Gσ và I y = ∗I Gσy (1.8)Trong đó Gσx,Gσylà đạo hàm x và y của Gσ, hàm Gaussian có độ lệch chuẩnσ
Hàm tests.gaussian_filter()đã sử dụng để làm mờ trước đó cũng có thể lấy thêm các đối số để tính toán các đạo hàm Gaussian thay thế Để kiểm chứng điều này trên một hình ảnh, chỉ cần thực hiện:
Đối số thứ ba chỉ định thứ tự các đạo hàm sẽ sử dụng theo mỗi hướng bằng cách sử dụng độ lệch chuẩn được xác định bởi đối số
Trang 36thứ hai Hình 1.11 cho thấy các đạo hàm và cường độ gradient cho các tỷ lệ khác nhau So sánh điều này với độ mờ ở cùng tỷ lệ trong Hình 1.9.
Hình 1.11: Một ví dụ về tính toán các đạo hàm hình ảnh bằng các đạo hàm Gaussian (trên cùng) x-đạo hàm, (giữa) y-đạo hàm và (dưới)
độ lớn gradient (a) ảnh gốc trong thang độ xám, (b) Bộ lọc đạo hàm
Gaussian với σ = 2, (c) với σ = 5, (d) với σ = 10
Hình thái học đếm các đối tượng
Hình thái học là một framework và tập hợp các phương pháp xử lý hình ảnh để đo lường và phân tích các hình dạng cơ bản Hình thái thường được áp dụng cho hình ảnh nhị phân nhưng cũng có thể được sử dụng với thang độ xám Hình ảnh nhị phân là một hình ảnh trong đó mỗi pixel chỉ
có hai giá trị, thường là 0 và 1 Hình ảnh nhị phân thường là kết quả của việc lấy ngưỡng một hình ảnh, ví dụ với ý định đếm các đối tượng hoặc đo kích thước của chúng
Trang 37Các toán tử hình thái được trình bày trong scipy.ndimage với module morphology Các chức năng đếm và đo lường cho hình ảnh nhị phân nằm trong các phép đo mô hình scipy.ndimage Phân tích một ví dụ đơn giản về cách sử dụng chúng dưới đây.
Xem xét hình ảnh nhị phân trong Hình 1.12a Để đếm các đối tượng trong hình ảnh đó, sử dụng đoạn chương trình sau:
Đoạn chương trình này tải hình ảnh và lấy ngưỡng để có hình ảnh
nhị phân Nhân với 1 chuyển đổi mảng boolean thành một ảnh nhị
phân Sau đó, hàm label() tìm các đối tượng riêng lẻ và gán nhãn
số nguyên cho pixel theo từng đối tượng thuộc vùng pixel đó Hình 1.12b hiển thị mảng của các nhãn Các giá trị mức xám chỉ ra địa chỉ đối tượng Như có thể thấy, có một số kết nối nhỏ giữa các đối tượng
Sử dụng toán tử mở ảnh (opening)nhị phân có thể loại bỏ những kết nối nhỏ này
Đối số thứ hai của binary_opening() dùng để xác định cấu trúc phần tử dùng trong phép toán hình thái học Trong trường hợp này, đã
sử dụng 9 pixel (4 ở trên, pixel tại chính vị trí của nó và 4 ở dưới) theo hướng y và 5 theo hướng x Có thể dùng câu lệnh này để định nghĩa cấu trúc bất kỳ dùng trong hình thái học Tham số iterations xác định số lần
áp dụng phép toán trên hình ảnh Có thể thử nghiệm và xem số lượng đối tượng thay đổi như thế nào trên các ví dụ cụ thể Hình ảnh sau khi được mở (opening) và hình ảnh nhãn tương ứng được hiển thị trong Hình 1.12c và Hình 1.12d
Trang 38Hình 1.12: Một ví dụ về hình thái học Dùng phép toán mở nhị phân
để tách các đối tượng và sau đó là đếm chúng (a) hình ảnh nhị phân gốc, (b) Nhãn tương ứng với giá trị gốc, mức màu xám biểu thị chỉ số đối tượng, (c) Hình ảnh nhị phân sau khi mở, (d) Nhãn tương ứng
với hình ảnh đã mở
1.4.3 Các module SciPy hữu ích khác
SciPy đi kèm với một số mô hình hữu ích cho đầu vào và đầu ra Hai trong số đó là io và misc
Đọc và ghi các tệp mat:Nếu có một số dữ liệu offline hoặc một số
dữ liệu online được lưu trữ ở định dạng tệp Matlab đuôi mat, có thể đọc
dữ liệu này bằng module scipy.io Đây là cách thực hiện:
Trang 39Bây giờ dữ liệu đối tượng chứa một từ điển với các khóa tương ứng với các tên biến được lưu trong tệp mat gốc Các biến là trong một định dạng mảng Việc lưu vào tập tin mat cũng đơn giản không kém Chỉ cần tạo một từ điển với tất cả các biến muốn lưu và sử dụng savemat ().
Điều này sẽ lưu mảng x để nó có tên “x” khi đọc vào Matlab Thông tin thêm về scipy.io có thể được tìm thấy trong tài liệu trực tuyến:http://docs.scipy.org/doc/scipy/reference/io.html
Lưu mảng dưới dạng hình ảnh: vì chúng ta đang thao tác các giải
thuật trên đối tượng hình ảnh và thực hiện tính toán bằng cách sử dụng các đối tượng mảng, rất hữu ích khi có thể lưu chúng trực tiếp dưới dạng tệp hình ảnh Nhiều hình ảnh trong cuốn sách này được tạo
ra như sau:
Hàm imsave() có sẵn thông qua module scipy.misc Để lưu một mảng im vào tập tin, chỉ cần làm:
module scipy.misc cũng chứa sẵndữ liệu nổi tiếng có tên “Lena”
Việc này sẽ cho kết quả là một phiên bản mảng mức xám có kích thước 512x512 của hình ảnh
Kết thúc chương này với một ví dụ rất hữu ích về khử nhiễu hình ảnh Giảm nhiễu hình ảnh là quá trình loại bỏ nhiễu hình ảnh đồng thời
cố gắng giữ lại các chi tiết và cấu trúc Mô hình khử nhiễu Fatemi (ROF) [28] được giới thiệu ở phần này Loại bỏ nhiễu khỏi hình ảnh rất quan trọng đối với nhiều ứng dụng khác nhau Mô hình ROF có đặc điểm thú vị là nó tìm thấy một phiên bản hình ảnh mượt hơn trong khi vẫn giữ lại được các cạnh và cấu trúc của hình ảnh
Trang 40Rudin-Osher-Kiến thức toán học của mô hình ROF và các kỹ thuật liên quan nằm ngoài nội dung của cuốn sách này Ở đây chỉ giới thiệu nội dungngắn gọn (đơn giản hóa) trước khi trình bày cách triển khai bộ giải ROF dựa trên thuật toán của Chambolle [5].
Tổng biến thiên cường độ pixel của hình ảnh thang độ xám I được định nghĩa là tổng độ lớn của vectơ gradient Trong miền liên tục được mô
trong đó tổng được lấy trên toàn bộ tọa độ ảnh x = [x, y].
Trong cách trình bày dựa theo Chambolle của ROF, mục tiêu là tìm
ra hình ảnh đã được khử nhiễu U để tối thiểu hàm mục tiêu sau:
2
2 ( )
minU I U− + λJ U
(1.11)trong đó khoảng cách | | I - U | | đo lường sự khác biệt giữa ảnh U và ảnh gốc I Điều này có nghĩa thực chất là mô hình tìm kiếm các hình ảnh
“phẳng” nhưng cho phép “nhảy” tại các cạnh giữa các vùng
Trong ví dụ này, đã sử dụng hàm roll(), như tên gọi, “rolls” các giá trị của một mảng theo chu kỳ quanh một trục Điều này rất thuận tiện cho việc tính toán sự khác biệt của điểm lân cận trong ví dụ này cũng đã sử dụng lệnh linalg.norm() để đo sự khác biệt giữa hai mảng (trong trường hợp này là ma trận hình ảnh U và Uold) Lưu hàm denoise() trong tệp rof.py