Để dễ dàng và thuận tiện trong các thao tác chỉnh sửa, xử lý ảnh, em đã nghiên cứu và xây dựng một chương trình cho phép xử lý ảnh đơn giản bằng cách áp dụng các phép lọc khác nhau và cụ
Trang 1TRƯỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM
CHẠY TRÊN ĐIỆN THOẠI DI ĐỘNG
Sinh viên thực hiện: Nguy-n Ngọc Quang – Mã SV: 92282
HẢI PHÒNG 2024
Trang 2LỜI CẢM ƠN
Trong thời gian nghiên cứu tìm hiểu đề tài bài tập lớn tuy gặp nhiều khókhăn trong việc nghiên cứu, nhưng nhờ sự giúp đỡ, giảng dạy tận tình của thầy ởcác tiết học trên lớp, em đã hoàn thành được đề tài theo đúng tiến độ giao.Lời đầu tiên cho em gửi lời cảm ơn đến Thầy TS Nguyễn Hữu Tuân người
đã trực tiếp hướng dẫn, giảng dạy về kiến thức, phương pháp để em có thể hoànthành thành công đề tài bài tập lớn của học phần Xử lý ảnh
Mặc dù đã có nhiều cố gắng trong suốt quá trình thực hiện đề tài, song cóthể còn những mặt hạn chế, thiếu sót Em mong nhận được ý kiến đóng góp và sựchỉ dẫn của các thầy– người có chuyên môn và kiến thức sâu rộng để em có thểrút kinh nghiệm hoàn thành tốt hơn các đề tài sau này
Trang 3TRƯỜNG ĐẠI HỌC HÀNG HẢI
BỘ MÔN KHOA HỌC MÁY TÍNH
BÀI TẬP LỚN HỌC PHẦN: XỬ LÝ ẢNH
-*** -1 Tên đề tài
Đề tài: “xây dựng chương trình xử lý ảnh đơn giản cho phép
sử dụng bộ lọc song phương và nlm chạy trên điện thoại di động”
2 Mục đích
Xây dựng một chương trình qua đó người dùng có thể chọn ảnh đầuvào, sử dụng camera của thiết bị điện thoại để xử lý bằng các phương pháplọc song phương và nlm
3 Công việc cần thực hiện
Hải Phòng, tháng năm 2024
NGƯỜI HƯỚNG DẪN
Trang 4MỤC LỤC
CHƯƠNG I GIỚI THIỆU 1
1.1 Bài toán 1
1.2 Kết quả dự kiến 1
1.3 Phương pháp nghiên cứu 2
1.4 Bố cục đề tài 2
CHƯƠNG II CẤU HÌNH HỆ THỐNG VÀ THUẬT TOÁN CHƯƠNG TRÌNH 3 2.1 Môi trường phát triển 3
2.1.1 Ngôn ngữ lập trình 3
2.1.2 Thư viện sử dụng 5
Tìm hiểu về thuật toán của các phép lọc 9
2.1.3 Các phép lọc tuyến tính 9
2.1.4 Các phép lọc phi tuyến 15
CHƯƠNG III CÀI ĐẶT THỬ NGHIỆM VÀ KẾT LUẬN 21
3.1 Cài đặt môi trường phát triển 21
3.1.1 Cài đặt ngôn ngữ lập trình 21
3.1.2 Cài đặt thư viện 22
3.2 Xây dựng hệ thống 24
3.2.1 Mô tả các bước thực hiện 24
3.2.2 Kết quả 28
3.3 Kết luận và hướng phát triển 32
3.3.1 Ưu điểm 32
3.3.2 Nhược điểm 33
3.3.3 Hướng phát triển 33
TÀI LIỆU THAM KHẢO 35
Trang 5CHƯƠNG I GIỚI THIỆU1.1 Bài toán
Trong thời đại hiện nay, sự phát triển của công nghệ đã góp phần khiến xử
lý ảnh trở nên hữu hiệu và có lợi ích với nhiều ban ngành chứ không chỉ riêng đốivới Khoa học máy tính và nghệ thuật Còn đối với sinh viên chuyên ngành công nghệ thông tin thì Xử lý ảnh là một lĩnh vực đang được quan tâm và trở thành môn học chuyên ngành đối với nhiều trường cao đẳng, đại học trên toàn quốc
Để dễ dàng và thuận tiện trong các thao tác chỉnh sửa, xử lý ảnh, em đã nghiên cứu và xây dựng một chương trình cho phép xử lý ảnh đơn giản bằng cách
áp dụng các phép lọc khác nhau và cụ thể là 2 phép lọc: lọc song
phương(bilateral) và loại bỏ nhiễu bằng bộ lọc Non-local Means(NLM) Người dùng sẽ chọn một bức ảnh cần thao tác, hoặc tự chụp một bức ảnh bằng chính camera điện thoại và chọn một phép lọc để xử lý
Quá trình lựa chọn và nghiên cứu đề tài song song với quá trình học tập trên giảng đường nên tiến độ được dự đoán sẽ hoàn thành cùng với tuần kết thúc học phần
1.2 Kết quả dự kiến
Kết quả sau quá trình nghiên cứu của em sẽ là một chương trình cho phépngười dùng chọn một ảnh đầu vào bằng kho lưu trữ ảnh của điện thoại hoặc chụp trực tiếp từ camera điện thoại, hệ thống sẽ nhận dạng và đọc ảnh đó, nếu ảnh tồn tại và có thể xử lý thì sẽ thực hiện áp dụng phép lọc cụ thể được yêu cầu, sau đó trả lại đầu ra cho người dùng bằng cách ghi ảnh đã thực hiện phép lọc thành 1 tệp trong hệ thống tệp cụ thể của người dùng
Về lợi ích, người dùng có thể dễ dàng xử lý ảnh và lưu kết quả một cách nhanh chóng Chương trình còn mang lại sự tiện lợi vì cho phép người dùng xử lýảnh mà không cần phải sử dụng các công cụ phức tạp
1
Trang 6Với thời gian và năng lực có hạn nên chương trình vẫn còn nhiều thiếu sót,mong thầy có thể cùng giúp đỡ và đóng góp ý kiến với em.
1.3 Phương pháp nghiên cứu
Thu thập và tham khảo các ứng dụng liên quan đã có trước đó:
- Là một chương trình đơn giản và khá phổ biến nên sẽ có nhiều ứng dụng tương tự đi trước, căn cứ vào đó em sẽ hiểu rõ hơn về mô hìnhthiết kế, cách ứng dụng vận hành và các phép lọc hoạt động ra sao
- Tìm hiểu về các công trình nghiên cứu, bài báo khoa học và ứng dụng đã sử dụng các thuật toán tương tự để xây dựng
Thực hiện thử nghiệm và áp dụng thuật toán của các phép lọc:
- Sử dụng các thư viện như OpenCV kết nối với IDE Androi Studio
để thực hiện thuật toán của các phép lọc lên các ảnh thử nghiệm và chạy trên điện thoại di động
- Điều chỉnh các tham số của thuật toán để đạt được kết quả tốt nhất
1.4 Bố cục đề tài
Chương I Giới thiệu: Ở chương này, mô tả bài toán, trình bày mục tiêu và
phương pháp nghiên cứu, bố cục và đặt vấn đề
Chương II Cấu hình hệ thống và thuật toán chương trình: Sau khi giới
thiệu, đi sâu vào thuật toán của các phép lọc, xây dựng và áp dụng một cách hợp
lý, thiết kế hệ thống và mô hình ứng dụng của chương trình
Chương III Cài đặt thử nghiệm và kết luận: Từ những kết quả của bước
trên đi vào cài đặt và thử nghiệm hệ thống, trình bày kết quả đạt được sau khi thiết kế thi công Cuối cùng là tổng kết lại, trình bày những ưu điểm, khuyết điểmtrong quá trình nghiên cứu và định hướng phát triển của đề tài
2
Trang 7CHƯƠNG II CẤU HÌNH HỆ THỐNG VÀ THUẬT TOÁN
CHƯƠNG TRÌNH2.1 Môi trường phát triển
2.1.1 Ngôn ngữ lập trình
Python là một ngôn ngữ lập trình bậc cao cho các mục đích lập trình đa
năng, do Guido van Rossum tạo ra và lần đầu ra mắt vào năm 1991 Python được thiết kế với ưu điểm mạnh là dễ đọc, dễ học và dễ nhớ Python là ngôn ngữ có hình thức rất sáng sủa, cấu trúc rõ ràng, thuận tiện cho người mới học lập trình và
là ngôn ngữ lập trình dễ học; được dùng rộng rãi trong phát triển trí tuệ nhân tạo Cấu trúc của Python còn cho phép người sử dụng viết mã lệnh với số lần gõ phímtối thiểu Vào tháng 7 năm 2018, van Rossum đã từ chức lãnh đạo trong cộng đồng ngôn ngữ Python sau 30 năm làm việc
Python là ngôn ngữ lập trình đa năng và được sử dụng trong rất nhiều lĩnh vực, có thể kể đến như:
- Phát triển phần mềm: Python là một trong những ngôn ngữ phổ biếnnhất của lĩnh vực này Nó được sử dụng để xây dựng các ứng dụng web, ứng dụng di động, ứng dụng máy tính, trò chơi, và nhiều loại phần mềm khác
- Khoa học dữ liệu và máy học: Python được sử dụng rộng rãi trong việc phân tích dữ liệu, khai phá dữ liệu, và xây dựng các mô hình máy học và học sâu Các thư viện như NumPy, Pandas, Matplotlib,
và scikit-learn là các công cụ quan trọng trong lĩnh vực này
- Trí tuệ nhân tạo: Python là một trong những ngôn ngữ phổ biến cho việc phát triển các hệ thống trí tuệ nhân tạo và xử lý ngôn ngữ tự nhiên Các thư viện như TensorFlow, PyTorch và NLTK cung cấp các công cụ mạnh mẽ để phát triển các ứng dụng trong lĩnh vực này
3
Trang 8- Phát triển web: Python có các framework mạnh mẽ như Django và Flask, được sử dụng để xây dựng các ứng dụng web và dịch vụ web.
Hình 2.1 Biểu tượng của Python
Trong dự án lần này chúng ta sẽ sử dụng phiên bản Python 3.12 Vào ngày24/05/2023 thì phiên bản 3.12(beta) đã được phát hành với nhiều cải tiến đáng giámang tính cách mạng trong việc tối ưu hóa của ngôn ngữ lập trình Cụ thể thì phiên bản mới này đã có những sự thay đổi đáng kể như:
1 Thông báo lỗi tốt hơn
2 Khả năng giám sát và gỡ lỗi nhanh hơn
3 Cải tiến khả năng gợi ý code khi đánh máy
4 Cải thiện hiệu suất
Những phát triển này của phiên bản mới đã giúp em cải thiện rất nhiều về hiệu suất của dự án lần này
4
Trang 9Hình 2.2 Phiên bản 3.12 của Python
2.1.2 Thư viện sử dụng
a os
Thư viện là một thư viện tiêu chuẩn của Python cung cấp các công cụ os
và chức năng để tương tác với hệ thống máy tính Với , người lập trình có thể os
thực hiện nhiều thao tác liên quan đến tệp và thư mục, bao gồm tạo, xóa, di chuyển, đổi tên, kiểm tra sự tồn tại, lấy thông tin và nhiều hơn nữa
Các chức năng chính của thư viện bao gồm tạo và xóa tệp và thư mục, os
di chuyển và đổi tên tệp và thư mục, kiểm tra sự tồn tại của tệp và thư mục, lấy thông tin về tệp và thư mục, và tương tác với biến môi trường Thêm vào đó, os
còn cung cấp các phương thức để tạo và thao tác với tiến trình, cũng như tương tác với đường dẫn và hệ điều hành
Trong dự án này, chúng ta dùng thư viện chủ yếu để tạo và đổi tên thư os
mục
5
Trang 10Các tính năng chính của OpenCV bao gồm đọc và ghi ảnh từ và đến nhiều nguồn khác nhau, xử lý và biến đổi ảnh số, phát hiện và theo dõi đối tượng trong ảnh và video, phát hiện biên, làm mịn và làm nổi bật ảnh, và nhiều hơn nữa.Trong Python, OpenCV được tích hợp thông qua thư viện cv2 Để sử dụng
nó, bạn cần phải cài đặt trên máy tính của mình Sau đó, vào môi trường lập trình
và import thư viện cv2 để sử dụng các chức năng và tính năng có sẵn trong thư viện để xử lý ảnh và video
6
Trang 11Hình 2.4 Thư viện OpenCV
c NumPy
NumPy là một thư viện mã nguồn mở và miễn phí trong Python, cung cấp các cấu trúc dữ liệu và công cụ để làm việc với mảng nhiều chiều và các phép toán số học trên chúng Với NumPy, người lập trình có thể thực hiện các tính toán
số học phức tạp và hiệu quả trên dữ liệu mảng, làm cho nó trở thành một công cụ quan trọng trong nhiều lĩnh vực như khoa học dữ liệu, máy học, và tính toán khoahọc
Các tính năng chính của NumPy bao gồm:
1 Mảng nhiều chiều (ndarray): NumPy cung cấp một cấu trúc dữ liệu mảng
nhiều chiều, được gọi là ndarray, cho phép lưu trữ dữ liệu số học trong các mảng đa chiều
2 Phép toán số học và ma trận: NumPy cung cấp các hàm và phương thức
để thực hiện các phép toán số học và ma trận, bao gồm cộng, trừ, nhân, chia, tích vô hướng, tích chập, và nhiều hơn nữa
3 Truy cập và cắt lát mảng: NumPy cung cấp các công cụ để truy cập và cắt
lát mảng, cho phép trích xuất các phần tử, hàng, cột hoặc khối dữ liệu từ mảng
7
Trang 124 Tính toán thống kê và biểu đồ: NumPy cung cấp các hàm để tính toán các
thống kê cơ bản như trung bình, phương sai, và độ lệch chuẩn, cũng như tạo và hiển thị biểu đồ từ dữ liệu mảng
Hình 2 5 Thư viện NumPy
d Tkinter
Tkinter là một thư viện đồ họa cho Python, cung cấp các công cụ để xây dựng các ứng dụng GUI (Giao diện người dùng đồ họa) trên nền tảng desktop.Tkinter là một phần của Python được phân phối hầu hết các phiên bản Python
Hình 2 6 Thư viện Tkinter
Tkinter là một giao diện người dùng đơn giản và rất dễ sử dụng, với các thành phần giao diện người dùng phổ biến như hộp văn bản, nút bấm, danh sách thả xuống,… Nó cho phép người dùng tạo các ứng dụng GUI đơn giản hoặc phứctạp, được sử dụng rộng rãi trong các ứng dụng desktop của Python
8
Trang 13Tìm hiểu về thuật toán của các phép lọc
2.1.3 Các phép lọc tuyến tính
Phép lọc trung bình – Mean Filter
Đây là bộ lọc đơn giản nhất Nó được xây dựng dựa trên ý tưởng tính giá trị một điểm ảnh bằng trung bình cộng các điểm ảnh xung quanh nó
Hình 2 7 Thuật toán Mean
Và đây là kết quả khi thử lọc 1 ảnh với các loại nhiễu khác nhau:
9
Trang 14 Phép lọc Gaussian – Gaussian Filter
Bộ lọc Gauss được cho là bộ lọc hữu ích nhất, được thực hiện bằng cách nhân chập ảnh đầu vào với một ma trận lọc Gauss sau đó cộng chúng lại để tạo thành ảnh đầu ra
Ý tưởng chung là giá trị mỗi điểm ảnh sẽ phụ thuộc nhiều vào các điểm ảnh ở gầnhơn là các điểm ảnh ở xa Trọng số của sự phụ thuộc được lấy theo hàm Gauss (cũng được sử dụng trong quy luật phân phối chuẩn)
Biểu diễn của ma trận lọc Gauss:
Code thực tế lọc Gauss với Python – OpenCV:
10
Trang 15Hình 2 8 Thuật toán Gauss
Và kết quả khi chạy đoạn code trên:
Lọc Prewitt – Đạo hàm ảnh
Đạo hàm của ảnh thực chất là một phương pháp để tìm cạnh của ảnh đó Có nhiềuphương pháp đạo hàm ảnh nhưng ở đây chúng ta sẽ đi sâu vào đạo hàm Prewitt
11
Trang 16Prewitt Masks được định nghĩa như sau:
Sau đây là kết quả của 1 ảnh được áp dụng nhân lọc trên:
Lọc Laplacian – Laplacian Filter
Laplacian được tính theo công thức:
Với ksize = 1, ma trận lọc sẽ được sử dụng là:
12
Trang 17Cài đặt Laplacian trong OpenCV:
Hình 2 9 Thuật toán Laplacian
Và đây là kết quả sau khi thực hiện đoạn code trên:
13
Trang 18
Phép lọc LoG – Laplacian of Gaussian
Phương pháp lọc này có thể hiểu đơn giản là chúng ta áp dụng bộ lọc Gauss cho ảnh đầu vào, sau đó áp dụng tiếp bộ lọc Laplacian cho ảnh kết quả vừa thu được.Trong phương pháp này, bộ lọc Gaussian được kết hợp với Laplacian cho phép hiển thị những vùng ảnh có cường độ thay đổi nhanh do đó làm tăng hiệu quả phát hiện biên Nó cho phép làm việc với một diện tích rộng hơn xung quanh điểm ảnh đang được nghiên cứu nhằm phát hiện chính xác hơn vị trí của đường biên Nhược điểm của phương pháp này là không xác định được hướng của biên
do sử dụng hai bộ lọc Laplacian quá khác nhau
Đây là công thức để áp dụng LoG cho ảnh:
Áp dụng ta được kết quả như sau:
14
Trang 192.1.4 Các phép lọc phi tuyến
Phép lọc trung vị – Median Filter
Phép lọc trung vị cũng được thực hiện với các ma trận lọc Tuy nhiên nó tính trung vị tất cả các giá trị điểm ảnh trong vùng ma trận lọc và sử dụng trung vị nàycho giá trị điểm trung tâm Một điều khá thú vị là với các cách lọc ở trên, giá trị điểm trung tâm được tính mới, còn với phép lọc trung vị, giá trị điểm trung tâm luôn được thay bằng một giá trị điểm ảnh trong bức ảnh đầu vào Do vậy, phươngpháp lọc này có khả năng loại bỏ nhiếu muối tiêu khá tốt
Tương tự các phép lọc trên, ta thay bước lọc thành:
Hình 2 10 Thuật toán Median
Và đây là kết quả thực hiện lọc trung vị:
15
Trang 20
Phép lọc song phương – Bilateral Filter
Đây là một bộ lọc hiệu quả cao trong việc loại bỏ nhiễu mà vẫn giữ lại được các đường viền (cạnh) trong ảnh
Bộ lọc Bilateral cũng sử dụng một bộ lọc Gauss với khoảng cách đến điểm trung tâm, đảm bảo chỉ có các điểm ở gần tham gia vào giá trị của điểm ảnh trung tâm Tuy vậy nó sử dụng thêm một hàm Gauss cho mức xám, đảm bảo chỉ các điểm ảnh có mức xám tương đồng với điểm ảnh trung tâm tham gia vào quá trình làm mịn
Bộ lọc Bilateral có nhược điểm là chậm hơn các bộ lọc khác
Đây là cách sử dụng bộ lọc Bilateral trong OpenCV:
Hình 2 11 Thuật toán Bilateral
Và đây là kết quả, như chúng ta có thể thấy, các texture được lọc rất tốt trong khi các đường biên trong ảnh vẫn được bảo toàn, không bị mờ đi
16
Trang 21 Phép lọc Linear – Linear Sharpen
Phép lọc linear sharpen là một kỹ thuật xử lý ảnh được sử dụng để làm nổi bật cácđặc điểm cạnh và chi tiết trong ảnh bằng cách tăng độ tương phản giữa các pixel gần nhau
Phép lọc sharpen thường sử dụng một ma trận kernel (còn được gọi là ma trận mask) để áp dụng phép toán convolution lên toàn bộ ảnh Ma trận kernel này có thể được thiết kế để tăng giá trị của pixel ở trung tâm của một vùng nhỏ trong ảnh, trong khi giảm giá trị của các pixel lân cận Kết quả là các đặc điểm cạnh và chi tiết trong ảnh trở nên nổi bật hơn
Code thực tế áp dụng Linear Python – OpenCV:
17
Trang 22Hình 2 12 Thuật toán Linear
Đây là kết quả sau khi làm sắc nét ảnh:
Phép lọc Motion – Motion Blur
Bộ lọc motion blur là một loại bộ lọc được sử dụng trong xử lý ảnh để mô phỏng hiệu ứng mờ chuyển động Hiệu ứng này thường được tạo ra bởi sự di chuyển tương đối giữa máy ảnh và đối tượng khi chụp ảnh trong thời gian dài hoặc bởi sự
di chuyển nhanh của đối tượng trong khung hình
Hiệu ứng motion blur tạo ra một mờ dài theo hướng chuyển động của đối tượng, tạo cảm giác chuyển động hoặc động lực trong bức ảnh Điều này thường được sửdụng trong nhiều ứng dụng, từ nhiếp ảnh nghệ thuật đến biên tập ảnh và video.Dưới đây là một ví dụ áp dụng bộ lọc motion blur lên một ảnh sử dụng Python – OpenCV:
18