Tổng quanGiới thiệu Trong đồ án cá nhân lần này, sinh viên được yêu cầu cài đặt một chương trình giúp xử lý ảnh đầuvào về độ sáng, độ tương phản, lật ảnh, chuyển đổi ảnh thành ảnh xám/ s
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN
KHOA CÔNG NGHỆ THÔNG TIN
TOÁN ỨNG DỤNG VÀ THỐNG KÊ CHO CÔNG NGHỆ THÔNG TIN
|GIÁO VIÊN HƯỚNG DẪN|
GV Phan Thị Phương Uyên
Trang 2Mục lục
Tổng quan 3
Giới thiệu 3
Thông tin thành viên 3
Danh mục công việc 3
Mô tả ý tưởng 3
Độ sáng và độ tương phản 4
Lật ảnh 4
Kernel 5
Gaussian blur: 5
Laplacian Filter 6
Phương trình đường tròn 6
Lọc ảnh từ RGB sang ảnh xám hay sepia 6
Ảnh xám 6
Ảnh sepia 7
Áp dụng thuật toán 7
Mô tả các hàm 9
Bảng đánh giá mức độ hoàn thành 14
Các nguồn dữ liệu 21
Trang 3Tổng quan
Giới thiệu
Trong đồ án cá nhân lần này, sinh viên được yêu cầu cài đặt một chương trình giúp xử lý ảnh đầuvào về độ sáng, độ tương phản, lật ảnh, chuyển đổi ảnh thành ảnh xám/ sepia, làm mờ/ rõ và cắtảnh Mục đích là áp dụng các kiến thức toán học về vector cũng như làm việc vơi các thư việntoán học của NumPy
Quy mô: Cá nhân
Ngôn ngữ: Python
Thông tin thành viên
Tên: Trần Lê Bảo Duy
Trang 4Độ sáng và độ tương phản
Độ sáng liên quan đến mức sáng tối của một điểm ảnh trong hình ảnh Sau khi chuyển hình ảnh
về dạng mảng numpy, ta có thể thay đổi giá trị độ sáng của một điểm ảnh bằng công thức:
G(x,y)=F(x,y)+B
Với:
F(x,y) là giá trị điểm ảnh chưa được xử lý tại vị trí (x,y)
G(x,y) là giá trị điểm ảnh sau khi được xử lí tại vị trí (x,y)
B là giá trị thay đổi độ sáng.[1]
Độ tương phản là sự khác biệt của giá trị đen và trắng trên ảnh Tương tự như độ sáng, sau khichuyển về dạng mảng numpy, ta có thể thay đổi độ tương phản bằng công thức sau:
G(x,y)=A⋅F(x,y)
Với:
F(x,y) là giá trị điểm ảnh chưa được xử lý tại vị trí (x,y)
G(x,y) là giá trị điểm ảnh sau khi được xử lí tại vị trí (x,y)
A là giá trị thay đổi về độ chênh lệch tương phản.[1]
Lật ảnh
Trong ma trận, ta có thể lật ma trận để tạo ra 1 ma trận mới với các phần tử tương tự như ma trận
cũ và các phần tử ở vị trí mới đối xứng qua 1 trục với phần tử gốc có giá trị như nhau
Trang 5Hay còn gọi là convolution matrix, hay mask Là 1 kĩ thuật quan trọng trong xử lý hình ảnh.
Kernel là một ma trận nhỏ được sử dụng để làm mờ, làm sắc nét, dập nổi, phát hiện canh,… Điềunày được thực hiện bằng cách thực hiện một phép chập giữa hạt nhân và hình ảnh Hoặc đơngiản hơn, khi mỗi pixel trong hình ảnh đầu ra là một chức năng của các pixel gần đó (bao gồm cảchính nó) trong hình ảnh đầu vào, hạt nhân là chức năng đó.[3]
Trong đồ án này, em sử dụng các kernel để có thể làm mờ, làm sắc nét Cụ thể như sau:
Gaussian blur:
Trong xử lý hình ảnh, hiệu ứng mờ Gaussian (còn được gọi là làm mịn Gaussian) là kết quả của việc làm mờ hình ảnh bằng hàm Gaussian(được đặt theo tên của nhà toán học và khoa học
Carl Friendrich Gauss)
Đây là một hiệu ứng được sử dụng rộng rãi trong phần mềm đồ họa, thường để giảm nhiễu hìnhảnh và giảm chi tiết Hiệu ứng hình ảnh của kỹ thuật làm mờ này là hiệu ứng nhòe mượt màgiống như xem ảnh qua màn hình mờ
Do ảnh được tạo ra dưới dạng mảng numpy 2 chiều nên công thức được sử dụng như sau:
Các giá trị nhận được từ công thức trên được sử dụng để xây dựng 1 kernel để áp dụng cho ảnhgốc Giá trị mới của mỗi pixel được đặt thành trung bình có trọng số của vùng lân cận của pixel
đó Giá trị của pixel gốc nhận được trọng lượng nặng nhất (có giá trị Gaussian cao nhất) và cácpixel lân cận nhận được trọng số nhỏ hơn khi khoảng cách của chúng đến pixel ban đầu tăng lên.Điều này dẫn đến hiệu ứng nhòe giúp bảo toàn ranh giới và cạnh
Hiệu ứng mờ Gaussian thường được tạo ra bằng cách kết hợp một hình ảnh với Kernel của cácgiá trị Gaussian Trong thực tế, tốt nhất là tận dụng thuộc tính có thể tách rời của Gaussian blurbằng cách chia quá trình thành hai lần truyền Trong lần truyền đầu tiên, hạt nhân một chiềuđược sử dụng để làm mờ hình ảnh chỉ theo hướng ngang hoặc dọc Trong lần truyền qua thứ hai,
Trang 6kernel truyền vào sẽ được sử dụng để làm mờ theo hướng còn lại Hiệu ứng kết quả giống nhưkết hợp với hạt nhân hai chiều trong một lần truyền, nhưng ít tính toán hơn.
Laplacian Filter
Là 1 công cụ được sử dụng trong việc phát hiện cạnh và làm sắc nét trong xử lý ảnh, Laplacian làmột toán tử đạo hàm bậc hai được sử dụng để xác định các vùng có sự thay đổi cường độ sángmạnh Nó được định nghĩa như là tổng của các đạo hàm bậc hai theo hai chiều (x và y) [5]
Trong xử lý ảnh, với mảng hai chiều, Laplacian có thể được đưa ra dưới dạng kernel sau:
Khi áp dụng kernel này lên một ảnh, nó sẽ tính toán sự khác biệt giữa giá trị cường độ sáng củamột điểm ảnh và giá trị cường độ sáng trung bình của các điểm ảnh xung quanh Kết quả là, cácđiểm ảnh ở biên (cạnh) sẽ có giá trị lớn hơn so với các điểm ảnh ở vùng đồng nhất.[6]
Lọc ảnh từ RGB sang ảnh xám hay sepia
Ảnh xám
Ảnh xám hay còn gọi là ảnh đơn sắc (monochromatic) Ảnh 8 mức xám mỗi điểm ảnh sẽ có giátrị nằm trong đoạn [0-7], ảnh 256 mức xám mỗi điểm ảnh sẽ có giá trị nằm trong đoạn [0-255].Giá trị của điểm ảnh bằng 0 đại diện cho điểm ảnh tối (đen), giá trị điểm ảnh lơn nhất đại diệncho điểm ảnh sáng (trắng)
Độ sáng được tính theo công thức: (chuyển đổi từ hệ màu RGB)
S = 0.2989R + 0.5870G + 0.1140B[7]
Trang 7ta sẽ lấy giá trị lớn nhất hoặc nhỏ nhất trong giới hạn.
4 Thay đổi độ tương phản:
Cũng tương tự như khi gia giảm độ sáng, thay đổi độ tương phản cũng cần phải giới hạnlại giá trị của mỗi điểm ảnh
5 Đảo ảnh:
6 Chuyển ảnh RGB về ảnh xám:
Ta thực hiện phép nhân ma trận giữa các giá trị RGB của điểm ảnh với trọng số [0.2989,0.5870, 0.1140] Tương tự, ta cũng cần phải giới hạn lại giá trị của các điểm ảnh để chocác điểm ảnh nằm trong khoảng phù hợp Sau đó, sao chép giá trị grayscale vào ba kênh(R, G, B) để tạo ra một ảnh RGB Dù tất cả các kênh đều giống nhau (grayscale), việc sửdụng định dạng RGB giúp hiển thị ảnh đúng cách trong các công cụ yêu cầu định dạng bakênh
7 Chuyển ảnh RGB về ảnh Sepia:
Áp dụng bộ lọc Sepia, ta nhân ma trận ảnh với ma trận chuyển vị của bộ lọc Sepia để cóthể áp dụng bộ lọc này cho từng điểm ảnh, chuyển giá trị RGB về thành giá trị màu
Trang 8Sepia Ta vẫn phải giới hạn lại các giá trị của điểm ảnh để đảm bảo rằng các giá trị trả vềphù hợp.
với giá trị càng ra ngoài càng giảm dần
Chuẩn hóa Tổng tất cả các giá trị trong kernel được chuẩn hóa để bằng 1 Điều này đảmbảo rằng khi áp dụng kernel này lên ảnh, cường độ của các điểm ảnh không thay đổi
Áp dụng kernel vào việc làm mờ ảnh Tạo 1 vùng đệm dựa trên kích thước của kernel và
độ lệch chuẩn σ đã cho trước vùng đệm này sẽ được thêm vào các cạnh của ảnh để đảmbảo kích thước của ảnh không thay đổi sau khi dung kernel
Tạo mảng mới có cùng kích thước với ảnh gốc để lưu kết quả làm mờ Sau đó duyệt quatất cả các điểm ảnh trong ảnh gốc, tại mỗi điểm ảnh, ta lại áp dụng kernel Gaussian đểtính tổng của các vùng xung quanh pixel với kernel và lưu kết quả lại vào mảng mới
9 Làm rõ ảnh:
Tạo một bộ lọc Laplacian- là một mảng 3x3 được sử dụng để phát hiện các cạnh trongảnh
Tạo vùng đệm xung quanh ảnh gốc để xử lý các điểm ảnh biên khi áp dụng bộ lọc
Tạo một mảng mới có kích thước tương tự ảnh cũ Sau đó áp dụng bộ lọc Laplacian: tínhtoán độ mạnh của các cạnh, vòng lập duyệt qua các kênh màu và tăng cường giá trị củacủa các điểm ảnh bằng cách cộng với độ mạnh của cạnh
Sau đó lưu ảnh đã được làm rõ vào mảng mới tạo
10 Cắt ảnh theo kích thước:
Xác định kích thước, số lượng kênh màu
Xác định vị trí bắt đầu (trái và trên) của vùng cần cắt sao cho vùng này nằm ở trung tâmcủa hình ảnh
Tính toán vị trí kết thúc (phải và dưới) của vùng cần cắt dựa trên kích thước mới.u củaảnh
Sử dụng các tọa độ đã tính để cắt phần trung tâm của hình ảnh
Trang 9Hiển thị hình ảnh đã được cắt và lưu vào tệp tin.
11 Căt ảnh hình tròn theo bán kính:
Xác định kích thước và số lượng kênh màu của hình ảnh Xác định tâm của hình ảnh, tọa
độ trung tâm theo chiều cao và chiều rộng
Tạo một mặt nạ, trong đó các điểm ảnh trong bán kính được chỉ định có giá trị True.Dùng mặt nạ để giữ lại các điểm ảnh trong vòng tròn và loại các điểm ảnh bên ngoàivòng tròn
Tham số truyền vào: img_path (đường dẫn đến file hình ảnh), kiểu str
Kết quả trả về: mảng NumPy (cao, rộng, số kênh màu)
Hàm hiển thị hình ảnh- show_img
Mục đích: hiển thị hình ảnh tử mảng dữ liệu NumPy
Tham số truyền vào: img_2D: mảng dữ liệu 2D kiểu NumPy
Kết quả trả về: hiển thị hình ảnh lên màn hình
Hàm lưu hình ảnh- save_img
Mục đích: lưu một hình ảnh vào đường dẫn cho trước
Tham số truyền vào:
img_2D: mảng dữ liệu 2D dạng Numpy
Trang 10 img: Mảng NumPy (ảnh).
brighten: Giá trị nguyên để tăng độ sáng
darken: Giá trị nguyên để giảm độ sáng
Mục đích: Thay đổi độ tương phản của hình ảnh, tăng hoặc giảm độ tương phản, sau đó hiển thị
và lưu hình ảnh đã thay đổi
Tăng độ tương phản: Nhân mỗi pixel của hình ảnh với giá trị contrast, sau đó cắt giá trị
để nằm trong khoảng 0-255 và chuyển đổi thành kiểu uint8
Giảm độ tương phản: Chia mỗi pixel của hình ảnh cho giá trị contrast, sau đó cắt giá trị
để nằm trong khoảng 0-255 và chuyển đổi thành kiểu uint8
Kết quả trả về: Không trả về giá trị, chỉ hiển thị và lưu hình ảnh đã thay đổi.
Lật dọc hình ảnh: Sử dụng hàm np.flipud để lật hình ảnh theo chiều dọc
Kết quả trả về: Không trả về giá trị, chỉ hiển thị và lưu hình ảnh đã lật.
Trang 11 Lật ngang hình ảnh: Sử dụng hàm np.fliplr để lật hình ảnh theo chiều ngang.
Kết quả trả về: Không trả về giá trị, chỉ hiển thị và lưu hình ảnh đã lật.
Kết quả trả về: Không trả về giá trị, chỉ hiển thị và lưu hình ảnh đã chuyển đổi.
Trang 12 size: Kích thước của kernel (phải là số lẻ).
sigma: Độ lệch chuẩn của phân phối Gaussian
Kết quả trả về: Mảng NumPy 2D đại diện cho kernel Gaussian.
kernel_size: Kích thước của kernel Gaussian
sigma: Độ lệch chuẩn cho kernel Gaussian
Cách hoạt động:
Tạo kernel Gaussian
Thêm đệm cho hình ảnh
Áp dụng kernel Gaussian lên mỗi pixel để tạo ra hình ảnh đã làm mờ
Kết quả trả về: Không trả về giá trị, chỉ hiển thị và lưu hình ảnh đã làm mờ.
Áp dụng bộ lọc Laplacian lên từng kênh màu để tăng cường các cạnh
Kết quả trả về: Không trả về giá trị, chỉ hiển thị và lưu hình ảnh đã làm nét.
Hàm crop_center
Trang 13Mục đích: Cắt phần trung tâm của hình ảnh theo kích thước chiều rộng và chiều cao mới, sau đó
hiển thị và lưu hình ảnh đã cắt
Tham số:
img: Mảng NumPy (ảnh)
new_width: Chiều rộng mới cho ảnh cắt
new_height: Chiều cao mới cho ảnh cắt
Mục đích: Hàm thực thi chính của chương trình Hàm này sẽ tiến hành một số bước như sau:
1 Yêu cầu người dùng nhập đường dẫn đến ảnh lưu trong thiết bị thông qua hàm input
2 Tiến hành đọc ảnh bằng hàm read_img
3 Nhập vào lựa chọn người dùng muốn thực hiên như sau từ 1 đến 7:
1 thay đổi độ sáng
2 thay đổi độ tương phản
3 lật ảnh Sau khi chọn có thêm lựa chọn lật ngang hoặc dọc
Trang 144 chuyển đổi ảnh thành ảnh xám hay ảnh Sepia
Trang 15Giảm độ sáng:
2 Thay đổi độ
tương phản
100% Tăng độ tương phản:
Trang 16Giảm độ tương phản:
Trang 173.1 Lật ảnh ngang 100%
3.2 Lật ảnh dọc 100%
Trang 184.1 RGB thành ảnh
4.2 RGB thành ảnhSepia 100%
Trang 195.1 Làm mờ ảnh 100%
5.2 Làm sắc nét ảnh 100%
Trang 21nhỏ 2x
Đánh giá tốc độ chạy của từng hàm:
STT Chức năng/ Hàm Mức độ hoàn thành Thời gian xử lý
2 Thay đổi độ tương phản 100% 0.3s cho cả tăng và giảm
7.2 Cắt ảnh theo khung elip 0%
Qua bảng xử lý trên, ta có thể nhận xét rằng thuật toán làm mờ ảnh là thuật toán phức tạp nhấtvới thời gian xử lý cao hơn hẳn so với các thuật toán khác
Các nguồn dữ liệu
Xử Lý Ảnh Với OpenCV: Độ Sáng, Độ Tương Phản Và Biểu Đồ Tần Số Histogram(iostream.co) [1] Truy cập vào ngày 30/07/2024
https://vinbigdata.com/camera-ai/xu-ly-hinh-anh-trong-python-tu-thuat-toan-den-cong-cu.html#4_NumPy [2] Truy cập vào 30/07/2024
https://en.wikipedia.org/wiki/Kernel_(image_processing) [3] Truy cập ngày 30/07/2024
https://en.wikipedia.org/wiki/Gaussian_blur [4] Truy cập ngày 30/07/2024
https://www.educative.io/answers/what-is-the-laplacian-filter [5] Truy cập vào ngày 30/07/2024https://en.wikipedia.org/wiki/Discrete_Laplace_operator [6] Truy cập vào ngày 30/07/2024https://vtct.wordpress.com/2013/05/13/tao-anh-xam-grayscale/ [7] Truy cập vào ngày30/07/2024
array [8] Truy cập vào ngày 30/07/2024