Báo cáo bài tập lớn môn Lập trình với Python đề tài "Xử lý ảnh với Python"
Báo cáo bài tập lớn môn Lập trình với Python đề tài "Xử lý ảnh với Python" của Học viện Công nghệ Bưu chính Viễn thông với những kiến thức và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học vào thực tiễn cuộc sống. Mời bạn đọc đón xem!
Môn: Lập trình với Python
Trường: Học viện Công Nghệ Bưu Chính Viễn Thông
Thông tin:
Tác giả:
Preview text:
lOMoARcPSD| 36067889 MỤC LỤC
LỜI CẢM ƠN .............................................................. Error! Bookmark not defined.
MỤC LỤC ...................................................................................................................... 0
CHƯƠNG I. DANH SÁCH THÀNH VIÊN NHÓM VÀ NHIỆM VỤ ..................... 1
CHƯƠNG II. TỔNG QUAN VỀ CHƯƠNG TRÌNH ................................................ 1
2.1. Giới thiệu chương trình ...................................................................................... 1
2.2. Giao diện của chương trình ............................................................................... 2
2.3. Sơ đồ các chức năng của chương trình ............................................................. 3
2.4. Các nút và chức năng ......................................................................................... 3
2.5. Chi tiết từng chức năng ...................................................................................... 4
III. KẾT QUẢ CỦA MỘT SỐ CHỨC NĂNG ......................................................... 12
TÀI LIỆU THAM KHẢO .......................................................................................... 15 lOMoARcPSD| 36067889
CHƯƠNG I. DANH SÁCH THÀNH VIÊN NHÓM VÀ NHIỆM VỤ
Nguyễn Quốc Toàn – B21DCCN714: - Xây dựng ý tưởng
- Tìm hiểu, xây dựng chương trình và chỉnh sửa code - Hỗ trợ làm báo cáo Vũ Lê Hùng – B21DCCN059: - Xây dựng ý tưởng
- Tìm hiểu ứng dụng, chỉnh sửa code - Làm slide thuyết trình
Nguyễn Thị Trà Mi – B21DCCN518: - Xây dựng ý tưởng
- Tìm hiểu ứng dụng, chỉnh sửa code - Thuyết trình
Vũ Ngọc Sơn – B21DCCN654: - Xây dựng ý tưởng
- Tìm hiểu ứng dụng, chỉnh sửa code - Làm báo cáo
CHƯƠNG II. TỔNG QUAN VỀ CHƯƠNG TRÌNH
2.1. Giới thiệu chương trình
- Chương trình được xây dựng để thực hiện một số chức năng liên quan đến xử lí
ảnh trong Python bằng các thuật toán, sử dụng các thư viện như Opencv, numpy,
imutils và thiết kế giao diện chương trình với PyQt5 và Qt Designer.
- OpenCV là một thư viện chuyên sâu về xử lý ảnh và thị giác máy tính, NumPy
là một thư viện tính toán khoa học chủ yếu cho việc làm việc với mảng và ma trận, và
imutils là một bộ công cụ tiện ích giúp đơn giản hóa việc xử lý ảnh trong OpenCV.
- PyQt5 là một bộ lệnh Python cho toolkit đồ họa người dùng Qt, một
frameworkmạnh mẽ cho phát triển ứng dụng đồ họa người dùng, còn PyQt Designer là
một công cụ đồ họa giúp tạo giao diện người dùng một cách thuận tiện và sau đó tích
hợp được với mã nguồn Python thông qua PyQt5. lOMoARcPSD| 36067889
2.2. Giao diện của chương trình
- Ban đầu sẽ thiết kế giao diện trên phần mềm Qt Designer và xuất ra file
có đuôi “.ui”, sau đó chuyển về file đuôi “.py” bằng câu lệnh:
pyuic5 -x MainWindow.ui -o MainWindow.py
- Giao diện khi chạy file “.py”: lOMoARcPSD| 36067889
2.3. Sơ đồ các chức năng của chương trình
2.4. Các nút và chức năng
- Open: Mở thư mục chứa các file ảnh chuẩn bị sẵn và xuất ảnh ra màn hình.
- Save: Lưu ảnh sau khi đã được chỉnh sửa.
- Print: In ảnh sau khi đã được chỉnh sửa.
- Exit: Thoát chương trình.
- Resize: Chỉnh lại kích thước của ảnh. - Crop: Cắt ảnh.
- Turn left: Xoay ảnh chiều từ phải sang trái.
- Turn right: Xoay ảnh chiều từ trái qua phải.
- Trắng đen: Chuyển hình ảnh thành màu trắng đen.
- Tương phản: Chuyển hình ảnh thành màu tương phản.
- Đổi màu: Đổi màu cho hình ảnh.
- Đậm màu: Làm đậm màu hình ảnh.
- Vẽ viền vật thể: Vẽ viền của đối tượng trong ảnh.
- Thêm nhiễu hạt: Thêm nhiễu hạt (noise) cho ảnh.- Làm nét: Làm nét ảnh.
- Làm tối 4 góc: Làm tối 4 góc của hình ảnh.
- Hiện thị ảnh vừa khung: Hiển thị ảnh vừa với khung.
- Hiện thị ảnh đúng kích thước: Hiện thị ảnh đúng kích thước.
- Khôi phục: Đưa ảnh về mặc định.
- Thanh kéo thả chỉnh sáng: Điều chỉnh ánh sáng cho ảnh.
- Thanh kéo thả chỉnh mờ: Điều chỉnh độ mờ của ảnh. lOMoARcPSD| 36067889
2.5. Chi tiết từng chức năng 2.5.1. Open
- Sử dụng hàm “MoAnh” gán vào chức năng “Open” để xuất ảnh ra từ folder có sẵn.
- Hàm QFileDialog.getOpenFileName cung cấp hộp thoại cho phép người dùng chọn ảnh.
- Hàm cv2.imread dùng để đọc ảnh sau khi người dùng chọn . 2.5.2. Save
- Sử dụng hàm “LuuAnh” gán vào chức năng “Save” để lưu hình ảnh sau khi đã chỉnh sửa.
- Lớp QFileDialog.getSaveFileName cung cấp hộp thoại cho phép người dùng lưu ảnh.
- Hàm cv2.imwrite dùng để viết ảnh vào file người dùng vừa lưu. 2.5.3. Print
- Sử dụng hàm “Print” gán vào chức năng “Print” để mở hộp thoại in và in hình
ảnh sau khi đã chỉnh sửa.
- “printer = QPrinter(QPrinter.HighResolution)” tạo ra một đối tượng
“QPrinter”.Đối tượng này đại diện cho máy in, được cấu hình ở độ phân giải cao
HighResolution và cho phép tương tác với máy in. lOMoARcPSD| 36067889
- “dialog = QPrintDialog(printer)” tạo một hộp thoại in để hiển thị tùy chọn in
cho người dùng và cho phép chọn máy in và cấu hình in khác nhau 2.5.4. Exit
- Sử dụng hàm “QuitMessage” gán vào chức năng “Exit” để mở hộp thoại
in và in hình ảnh sau khi đã chỉnh sửa.
- QMessageBox.question tạo hộp thoại câu hỏi với lựa chọn Yes/No
- Nếu người dùng bấm Yes đóng chương trình (self.close()) 2.5.5. Resize
- Sử dụng hàm “resizeImage” thông qua hàm “resizeActive” để gán vào chức
năng Resize để chỉnh lại kích thước ảnh theo chiều dài và chiều rộng nhập vào.
- Sử dụng hàm “cv2.resize” từ thư viện OpenCV để thay đổi kích thước của ảnh
thành kích thước mới “dsize = (new_width, new height)”.
- “simpledialog.askstring” mở hộp thoại để người dùng nhập chiều dài và chiều rộng mới của ảnh. 2.5.6. Crop
- Sử dụng hàm “cropImage” thông qua hàm “cropActive” để gán vào chức năng
Crop để cắt ảnh theo 2 tọa độ (x1,y1) và (x2,y2) nhập vào. lOMoARcPSD| 36067889
- “self.dialogOpen” mở hộp thoại thông báo hướng dẫn nhập tọa độ để cắt ảnh.
- “simpledialog.askstring” mở hộp thoại để người dùng nhập tọa độ cắt ảnh. 2.5.7. Turn Left
- Sử dụng hàm “turnLeftImage” thông qua hàm “turnLeftActive” để gán vào
chức năng Turn left để xoay ảnh từ phải sang trái lOMoARcPSD| 36067889
- Xoay ảnh gồm ba bước:
+ Đầu tiên, cần lấy tâm của vòng quay. Đây thường là tâm của hình ảnh mà bạn đang định xoay.
+ Tiếp theo, tạo ma trận quay 2D. OpenCV cung cấp hàm getRotationMatrix2D()
+ Cuối cùng, áp dụng phép biến đổi affine cho hình ảnh, sử dụng ma trận chuyển
đổi đã tạo ở bước trước. Hàm warpAffine() trong OpenCV sẽ thực hiện công việc này.
+Hàm warpAffine() áp dụng một phép biến đổi affine cho hình ảnh. Sau khi áp
dụng phép biến đổi affine, tất cả các đường thẳng song song trong hình ảnh ban đầu
cũng sẽ vẫn song song trong hình ảnh đầu ra.
- Với đối số angle_value có chỉ số dương ảnh sẽ được quay ngược chiều kim
đồng hồ2.5.8. Turn Right
- Sử dụng hàm “turnRightImage” thông qua hàm “turnRightActive” để gán vào
chức năng Turn right để xoay ảnh từ trái sang phải.
- Xoay ảnh gồm ba bước tương tự với chức năng TurnLeft nhưng đối số
angle_value có chỉ số âm ảnh sẽ được quay theo chiều kim đồng hồ. 2.5.9. Trắng đen
- Sử dụng hàm “negative” thông qua hàm “DenTrang” để gán vào nút chức năng
“Đen trắng” để chuyển hình ảnh thành hình ảnh màu đen trắng.
- Hàm cvtColor trong thư viện Opencv thực hiện chức năng chuyển đổi giữa các
hệ màu mà ở đây là giữa hệ màu BGR và GRAY. lOMoARcPSD| 36067889 2.5.10. Tương phản
- Sử dụng hàm “contrast” thông qua hàm “TuongPhan” để gán vào nút chức
năng“Tương phản” để chuyển hình ảnh thành hình ảnh màu tương phản.
- Hàm cvtColor trong thư viện OpenCV thực hiện chức năng chuyển đổi giữa
cáchệ màu mà ở đây là giữa hệ màu BGR và LAB. 2.5.11. Đổi màu
- Sử dụng hàm “matrix” thông qua hàm “DoiMau” để gán vào nút chức năng
“Đổi màu” để đổi màu của hình ảnh.
- Hàm np.random.rand trong thư viện numpy thực hiện chức năng tạo ra một ma
trận ngẫu nhiên có kích thước 3x3, số kênh của ảnh kết quả sẽ bằng số hàng của ma trận ta thêm vào.
- Hàm transform() sẽ thực hiện biến đổi các phần tử trong ma trận ảnh và tạo ra
một ảnh mới có màu, độ sáng khác nhau vì ma trận được tạo ngẫu nhiên. Tham số
None sẽ tạo mới một ma trận mới thay vì việc lưu trữ nó tại một nơi. 2.5.12. Đậm màu
- Sử dụng hàm “cartoon” thông qua hàm “DamMau” để gán vào nút chức năng
“Đậm màu” để làm đậm các viền của hình ảnh. lOMoARcPSD| 36067889
- Đầu tiên ta sẽ đổi màu của ảnh sang màu xám nhờ vào hàm cvtColor().
- Sử dụng “cv2.medianBlur” để áp dụng bộ lọc median với kích thước kernel là 5
vào ảnh, để thêm nhiễu vào ảnh.
- Sau khi làm nhiễu được ảnh màu xám ta tiến hành lấy viền hình ảnh bằng
adaptiveThreshold(ngưỡng tuỳ biến).
2.5.13. Vẽ viền vật thể
- Sử dụng hàm “gauss” thông qua hàm “VeVienVatThe” để gán vào nút chức
năng “Vẽ viền vật thể” để chuyển hình ảnh thành hình ảnh màu tương phản.
- Vẽ viền vật thể gồm các bước:
+ Chuyển hình ảnh sang màu đen trắng bằng cách sử dụng “cv2.cvtColor” với
mã màu “cv2.COLOR_BGR2GRAY”.
+ Áp dụng bộ lọc Gaussian bằng “cv2.GaussianBlur” để làm mờ hình ảnh đen
trắng. Bộ lọc có kích thước 5x5, độ mờ là 0.
+ Sử dụng “cv2.Canny” để tạo ra cạnh vật thể của hình ảnh đã mờ. Tham số (10,
10) là ngưỡng trên và ngưỡng dưới.
2.5.14. Thêm nhiễu hạt -
Sử dụng hàm “Noise” thông qua hàm “ThemNhieuHat” để gán vào nút chức
năng “Thêm nhiễu hạt” để thêm nhiễu hạt cho hình ảnh lOMoARcPSD| 36067889 -
Sử dụng “cv2.medianBlur” để áp dụng bộ lọc median với kích thước kernel là 5
vào ảnh, để thêm nhiễu vào ảnh. 2.5.15. Làm nét
- Sử dụng hàm “sharpen” thông qua hàm “LamNetAnh” để gán vào nút chức
năng “Làm nét” để chuyển hình ảnh thành hình ảnh màu tương phản.
- Tăng độ nét (sharpening) của ảnh bằng mặt nạ tích chập 2D tùy biến làm sắc nét hình ảnh.
- Đầu tiên xác định một mặt nạ 2D tùy chỉnh, sau đó sử dụng hàm filter2D() để
áp dụng phép toán tích chập cho hình ảnh.
2.5.16. Làm tối 4 góc
- Sử dụng hàm “vignette” thông qua hàm “Lamtoi4goc” để gán vào nút chức
năng “Làm tối 4 góc” để chuyển hình ảnh thành hình ảnh màu tương phản. lOMoARcPSD| 36067889
- Sử dụng “img.shape[:2]” để lấy chiều dài và chiều rộng của ảnh.
- Tạo hai kernel Gaussian 1D (kernel_x và kernel_y) bằng cách sử dụng
“cv2.getGaussianKernel” với độ rộng sigma = 200 và sau đó tạo kernel Gaussian 2D
(kernel) bằng cách tích chập chúng.
- Tạo ra một mask được chuẩn hóa kernel bằng cách chia cho norm của chúng.
Mask này được dùng để thay thế độ sáng của hình ảnh.
- Chạy qua từng kênh màu (RGB) trong hình ảnh và nhân với mask đã tính từ
kernel Gaussian. Điều này làm cho độ sáng của hình ảnh bị giảm cả ở 3 kênh màu, dẫn
đến hiệu ứng làm tối 4 góc của hình ảnh.
2.5.17. Hiển thị ảnh vừa khung và ảnh đúng kích thước
- Hiển thị ảnh vừa khung: gắn self.hienthi = 1 .
- Hiển thị ảnh đúng kích thước: gắn self.hienthi = 2.
- Sau đó gọi hàm displayImage để hiển thị ảnh lên màn hình label.
- Trong hàm hiển thị ảnh, Nếu đang ở chế độ hiển thị ảnh vừa khung (self.hienthi
==1) thì sẽ resize ảnh theo kích thước màn hình label 1001x601 rồi mới hiển thị lên
màn hình. Còn nếu ở chế độ hiển thị đúng kích thước ảnh (self.hienthi == 2) thì sẽ
hiển thị theo kích thước đang có của ảnh.
2.5.18. Khôi phục về ảnh gốc
- Sử dụng hàm “KhoiPhuc” gắn vào nút chức năng “Khôi phục” để đưa ảnh về trạng thái ban đầu
2.5.19. Thanh kéo chỉnh sáng
- Thanh trượt được gắn vào chức năng “ChinhSang”. lOMoARcPSD| 36067889
- “self.uic.verticalSlider.value()” lấy giá trị “beta” – độ sáng của ảnh, được điều
chỉnh bởi người dùng thông qua thanh trượt.
- “cv2.convertScaleAbs()” được dùng để điều chỉnh độ sáng của ảnh, “alpha”
ảnhhưởng đến tương phản của ảnh, “beta” ảnh hưởng độ sáng của ảnh.
2.5.20. Thanh kèo chỉnh mờ
- Thanh trượt được gắn vào chức năng “ChinhMo”.
- “self.uic.verticalSlider_2.value()” lấy giá trị “new_value” được điều chỉnh bởi
người dùng thông qua thanh trượt.
- Tạo một tuple “ksize” chứa kích thước của một kernel (new_value, new_value)
để thực hiện thao tác mờ.
- “cv2.blur()” được dùng để áp dụng thao tác mờ lên ảnh sử dụng kernel có kích thước “ksize”.
III. KẾT QUẢ CỦA MỘT SỐ CHỨC NĂNG - Ảnh gốc: - Crop: lOMoARcPSD| 36067889 - Đen trắng: - Vẽ viền vật thể: lOMoARcPSD| 36067889 - Chỉnh sáng: - Chỉnh mờ: lOMoARcPSD| 36067889
TÀI LIỆU THAM KHẢO
Tìm hiểu về thư viện Opencv:
https://www.mygreatlearning.com/blog/opencv-tutorial-in-python/
Thuật toán công cụ và phương pháp trong xử lí ảnh bằng Python:
https://neptune.ai/blog/image-processing-python
Thiết kế giao diện : https://blog.lienvu.com/2021/08/thiet-ke-giao-dien-ui-python- voi-pyqt5.html