1. Trang chủ
  2. » Tất cả

Giáo trình thị giác máy tính và ứng dụng

322 61 6
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 322
Dung lượng 15,95 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

LÊ MỸ HÀ

THỊ GIÁC MÁY TÍNH

VÀ ỨNG DỤNG

GIÁO TRÌNH

Trang 2

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT

Trang 3

Giá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 5

MỤ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 6

Chươ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 7

5.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 8

Chươ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 9

10.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 10

12.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 11

LỜ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 12

Cá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 13

Chươ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 15

ví 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 16

Hì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 17

1.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 18

trong 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 20

Bả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 22

NumPy 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 23

Lư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 24

Thự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 26

Hà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 27

Hì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 28

1.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 29

Hà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 30

Lư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 31

Lư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 32

Ngoà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 33

Hì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

II 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 34

Vectơ gradient của ảnh ∇ = II I x yT Gradient có hai thuộc tính quan trọng đó là độ lớn vectơ gradient

I = ∗I DI 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 35

Hì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 36

thứ 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 37

Cá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 38

Hì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 39

Bâ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 40

Rudin-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

Ngày đăng: 22/11/2022, 23:13

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w