Professional Documents
Culture Documents
Class: 21CLC010
MSSV: HỌ VÀ TÊN:
21127512 Nguyễn Lê Hoàng Kha
GVHD:
Vũ Quốc Hoàng
Nguyễn Văn Quang Huy
Ngô Đình Hy
Phan Thị Phương Uyên
4 Chuyển đổi ảnh RGB thành ảnh xám / sepia Đã hoàn thành
6 Cắt ảnh theo kích thước (cắt ở trung tâm) Đã hoàn thành
- Mỗi điểm màu được biểu diễn bằng giá trị trong khoảng [0,255], nếu giá trị càng tăng về cực
255 thì màu sẽ càng sáng, ngược lại nếu giá trị giảm về cực 0 thì màu sẽ càng tối.
- Với lý thuyết trên, dù ảnh đầu vào làm gray hay rgb thì ta chỉ cần cộng một scarlar vào tất cả
các channels màu của pixels thì ảnh sẽ sáng lên.
- Hàm adjust_image_brightness() có tham số đầu vào gồm: img – mảng 3 chiều được reshape
thành mảng 2 chiều được lấy từ ảnh, inc_brightness_value – giá trị tăng độ sáng.
- Bước 1: tạo một img_tmp được sao chép từ img để tránh những thay đổi lên mảng gốc img.
- Bước 2: cú pháp img_tmp += inc_brightness_value sẽ là phép ma trận cộng một scalar trong
numpy tất cả các phần tử trong ma trận sẽ có giá trị tăng thêm inc_brightness_value.
- Bước 3: giới hạn giá trị của các phần tử trong mảng trong khoảng [0,255] bằng hàm where(),
do mảng đã được đổi kiểu dữ liệu từ int8 sang int32 khi lấy mảng từ ảnh nên sẽ tránh được
trường hợp overflow khi lấy các phẩn tử cộng cho một số.
- Bước 4: trả về mảng img_tmp
c) Kết quả
Hành động Trước khi chỉnh sửa Sau khi chỉnh sửa
- Dựa vào thuật toán tăng độ tương phản “Constrast Stretching”, ta sẽ áp dụng ma trận nhân cho
scalar, hoặc có thể nói một mảng ndarray nhân cho scalar (Image Processing Algorithms Part
5: Contrast Adjustment, 2015).
- Hàm adjust_image_contrast() có các tham số đầu vào gồm, img - mảng hai chiều được reshape
từ mảng ba chiều lấy từ ảnh, contrast_level – độ contrast mong muốn.
- Bước 1: tạo một img_tmp được sao chép từ img để tránh những thay đổi lên mảng gốc img.
- Bước 2: tính giá trị cho contrast correction factor theo công thức sau:
259(𝐶 + 255)
𝐹= , 𝑣ớ𝑖 𝐹 𝑙à 𝑓𝑎𝑐𝑡𝑜𝑟, 𝐶 𝑙à 𝑐𝑜𝑛𝑡𝑟𝑎𝑠𝑡_𝑙𝑒𝑣𝑒𝑙
255(259 − 𝐶)
- Bước 3: lấy mảng img trừ cho 128, sau đó nhân lại cho factor và cộng lại 128.
- Bước 4: giới hạn các giá trị của mảng từ [0,255] bằng hàm np.where().
c) Kết quả
Hành động Trước khi chỉnh sửa Sau khi chỉnh sửa
Ảnh RGB
tăng tương
phản
Ảnh xám
tăng tương
phản
3. Lật ảnh ngang dọc
- Lật ảnh ngang thực chất là sự chuyển đổi vị trị các pixel đối xứng qua trục hoành có trục hoành
đi qua tâm ảnh và vuông góc với hai cạnh cắt ngang.
- Lật ảnh dọc thực chất là sự chuyển đổi vị trị các pixel đối xứng qua trục tung có trục tung đi
qua tâm ảnh và vuông góc với hai cạnh cắt ngang.
- Hàm flip_image() có tham số truyền vào bao gồm: img – mảng 3 chiều được lấy từ ảnh gốc,
direction có các giá trị lần lượt 1, 2 tương ứng với lật ảnh dọc hay ngang.
- Bước 1: tạo một img_tmp được sao chép từ img để tránh những thay đổi lên mảng gốc img.
- Bước 2: tùy vào giá trị direction mà ta thực hiện lật dọc hay ngang:
o Trường hợp lật dọc: chạy vòng lặp for w (chiều rộng ảnh) lần với i, ta gán giá trị cả cột thứ
i của img_tmp bằng giá trị cột thứ w – 1 – i của img gán giá trị cột bằng giá trị đối xứng
bên kia với trục tung nêu trên.
o Trường hợp lật ngang: chạy vòng lặp for h (chiều cao ảnh) lần với i, ta gán giá trị cả dòng
thứ i của img_tmp bằng giá trị dòng thứ w – 1 – i của img gán giá trị dòng bằng giá trị
đối xứng với trục hoành nêu trên.
- Bước 3: trả về mảng img_tmp
c) Kết quả
Hành động Trước khi chỉnh sửa Sau khi chỉnh sửa
RGB
(xoay dọc)
Xám
(xoay
ngang)
4. Chuyển đổi ảnh RGB thành ảnh xám/sepia
- Hàm adjust_image_channel có tham số đầu vào gồm: img – mảng hai chiều được reshape từ
mảng ba chiều khi lấy mảng từ ảnh, type – dùng để xác định kiểu chuyển đổi.
- Bước 1: gán biến h bằng giá trị của img.shape[0], tương đương số dòng của mảng.
- Bước 2: tùy vào giá trị của type mà ta thực hiện chuyển đổi gray hay sepia:
o Trường hợp gray:
Bước 1: tạo một mảng hai chiều rgb gồm 3 màu red, green, blue tương ứng [255,0,0],
[0,255,0], [0,0,255]
Bước 2: tạo một mảng hai chiều distances có kích thước (h,3) để lưu trữ dữ liệu
Bước 3: cho i chạy trong khoảng 3, ta lần lượt tính khoảng cách của các pixel trong
img tới từng kênh màu rgb theo công thức sau:
(𝑎 − 𝑏 )
Hệ thống sẽ lấy giá trị từng cột trong sepia_ratio tích vô hướng với từng dòng trong
img. Giá trị output ở dòng 1 cột 1 = 1.351 = 0.393*1 + 0.769*1 + 0,189*1. Hệ thống
tiếp tục thực hiện phép tính và cho ra kết quả mới R’, G’, B’ như mong đợi.
Bước 3: trả về values đã được giới hạn giá trị không lớn hơn 255 với hàm
np.where(values>255,255,values)
c) Kết quả
Hành động Trước khi chỉnh sửa Sau khi chỉnh sửa
RGB thành
xám
Xám thành
sepia
5. Làm mờ, làm nét ảnh
- Cả hai làm mờ và làm nét ảnh đều áp dụng phương pháp tích chập giữa kernel và image
với công thức và bảng kernel được cho như sau (Wikipedia contributors, 2023):
𝑉ớ𝑖 𝑔(𝑥, 𝑦) 𝑙à ả𝑛ℎ đã đượ𝑐 𝑙ọ𝑐, 𝑓(𝑥, 𝑦) 𝑙à ả𝑛ℎ 𝑔ố𝑐, 𝑤 𝑙à 𝑏ộ 𝑙ọ𝑐 𝑘𝑒𝑟𝑛𝑒𝑙
𝑇ấ𝑡 𝑐ả 𝑐á𝑐 𝑝ℎầ𝑛 𝑡ử 𝑐ủ𝑎 𝑘𝑒𝑟𝑛𝑒𝑙 𝑐ó 𝑔𝑖ớ𝑖 ℎạ𝑛 − 𝑎 ≤ 𝑑𝑥 ≤ 𝑎 𝑣à − 𝑏 ≤ 𝑑𝑦 ≤ 𝑏
- Box blur:
1 1 1 1
1 1 1
9
1 1 1
- Sharpen kernel:
0 −1 0
−1 5 −1
0 −1 0
b) Giải thích hàm
Blur:
- Hàm box_blur_image() có tham số đầu vào là img – mảng ba chiều được lấy từ ảnh
- Bước 1: gán giá trị kích thước của shape vào các biến h, w, c
- Bước 2: tạo một img_tmp được sao chép từ img để tránh những thay đổi lên mảng gốc img.
- Bước 3: ta thực hiện thuật toán trên từng kênh màu, được xác định bằng z
- Bước 4: ta chạy hai vòng for để đi qua tất cả các điểm ảnh thuộc kênh màu z, tại điểm ảnh có
tọa độ [y,x,z] , ta thực hiện slicing ảnh gốc [y-1:y+2,x-1:x+2,z] để được vùng ảnh có 9 điểm
ảnh.
- Bước 5: lấy trung bình tổng 9 điểm ảnh như công thức với kernel đã nêu trên, gán giá trị nhận
được cho điểm ảnh img_tmp[y,x,z]
- Bước 6: trả về mảng được giới hạn giá trị trong khoảng [0.255] bằng hàm np.clip()
Sharpen:
- Hàm sharpen_image() có hàm số đầu vào là img – mảng ba chiều được lấy từ ảnh.
- Bước 1: tạo một mảng kernel được nên như trên.
- Bước 2: gán giá trị kích thước của shape vào các biến h, w, c
- Bước 3: tạo một img_tmp được sao chép từ img để tránh những thay đổi lên mảng gốc img.
- Bước 4: ta chạy hai vòng for để đi qua tất cả các điểm ảnh thuộc kênh màu z, tại điểm ảnh có
tọa độ [y,x,z] , ta thực hiện slicing ảnh gốc [y-1:y+2,x-1:x+2,z] để được vùng ảnh có 9 điểm
ảnh.
- Bước 5: ta thực hiện tích chập mảng được slicing với kernel bằng phép nhân (*) hai mảng, sau
đó lấy tổng bằng ham sum(), xem ví dụ bên dưới để hiểu hơn:
o Giải thích: thực hiện phép nhân hai ma trận có cùng kích thước trong mảng numpy sẽ cho
ra kết quả:
𝑎 ⋯ 𝑎 𝑏 ⋯ 𝑏 𝑎 ×𝑏 ⋯ 𝑎 ×𝑏
𝐴×𝐵 = ⋮ ⋱ ⋮ + ⋮ ⋱ ⋮ = ⋮ ⋱ ⋮
𝑎 ⋯ 𝑎 𝑏 ⋯ 𝑏 𝑎 ×𝑏 ⋯ 𝑎 ×𝑏
- Bước 6: trả về mảng được giới hạn giá trị trong khoảng [0.255] bằng hàm np.clip()
c) Kết quả
Hành động Trước khi chỉnh sửa Sau khi chỉnh sửa
Làm mờ
ảnh RGB
Làm nét
ảnh xám
6. Cắt ảnh ở trung tâm
- Sử dụng slicing mảng ba chiều được lấy từ ảnh gốc để trả về mảng đã được cắt.
- Hàm cut_image() có tham số đầu vào là mảng ba chiều được lấy từ ảnh gốc.
- Bước 1: tạo một img_tmp được sao chép từ img để tránh những thay đổi lên mảng gốc img.
- Bước 2: gán giá trị kích thước của shape vào các biến h, w, c.
- Bước 3: trả về mảng được slicing với kích thước như hình.
c) Kết quả
Hành động Trước khi chỉnh sửa Sau khi chỉnh sửa
Cắt ảnh ở
trung tâm
7. Cắt ảnh hình tròn
- Ta tính khoảng cách từ tọa độ các điểm pixel ảnh đến tọa độ tâm hình tròn, nếu khoảng cách
từ điểm đó đến tâm hình tròn xa hơn bán kính được đặt trước thì ta tô đen điểm ảnh đó.
- Hàm circle_img() có các tham số đầu vào gồm: img - ảnh hai chiều được reshape từ ảnh ba
chiều được lấy từ ảnh gốc, h và w lần lượt là chiều cao, chiều rộng của ảnh gốc.
- Bước 1: chọn bán kính r bằng ½ h hoặc ½ w tùy thuộc h hay w nhỏ hơn.
- Bước 2: chọn tọa độ center bằng [½ h, ½ w]
- Bước 3: sử dụng list comprehension để tạo mảng tọa độ của từng điểm ảnh trong mảng hai
chiều.
- Bước 4: tính khoảng cách từng tọa độ điểm đến tọa độ center và gán vào dist_from_center =
((cord - center)**2).sum(axis=1)**0.5
o Tại cord - center: chương trình sẽ broad cast mảng center một chiều thành mảng hai chiều
có số dòng bằng số dòng của cord, sau đó lấy giá trị từng dòng cord trừ cho giá trị của
center.
o Ta bình phương tất cả các phần tử bằng **2 và cộng các cột bằng sum(axis = 1), cuối cùng
ta lấy căn giá trị từng dòng bằng **0.5.
- Bước 5: gán các điểm ảnh = [0,0,0] có index tương ứng với index của mảng dist_from_center
lớn hơn hoặc bằng r.
- Bước 6: trả về mảng img_tmp
c) Kết quả
Hành động Trước khi chỉnh sửa Sau khi chỉnh sửa
Cắt ảnh
hình tròn
III. Tham khảo
Grayscale to RGB conversion. (n.d.). Tutorialspoint.
https://www.tutorialspoint.com/dip/grayscale_to_rgb_conversion
How to convert a color image into sepia image - Image Processing Project - dyclassroom | Have
convert-a-color-image-into-sepia-image
Image Processing Algorithms Part 5: Contrast adjustment. (2015, October 29). Dreamland
algorithms/image-processing-algorithms-part-5-contrast-adjustment/
https://en.wikipedia.org/wiki/Kernel_(image_processing)