Nhập môn xử lí ảnh bằng python
Python cung cấp nhiều thư viện hỗ trợ xử lí ảnh, trong đó phổ biến nhất gồm:
OpenCV (cv2)
Là thư viện mạnh và thông dụng nhất, hỗ trợ đầy đủ các thao tác xử lí ảnh và thị giác máy tính như: đọc/ghi ảnh, chuyển đổi không gian màu, lọc ảnh, phát hiện biên, nhận dạng đối tượng,…
NumPy
Dùng để lưu trữ và thao tác dữ liệu ảnh dưới dạng mảng nhiều chiều (ndarray). Hầu hết các thư viện xử lí ảnh trong Python đều dựa trên NumPy.
Pillow (PIL)
Thư viện xử lí ảnh cơ bản, hỗ trợ đọc/ghi, cắt, xoay, thay đổi kích thước ảnh.
Matplotlib
Chủ yếu dùng để hiển thị ảnh và vẽ histogram.
==> cv2 + NumPy là cặp thư viện được sử dụng nhiều nhất.
Khi lập trình xử lí ảnh, cần quan tâm các thông số kỹ thuật sau:
Chiều cao (Height)
Chiều rộng (Width)
h, w = img.shape[:2]
Ảnh xám: 1 kênh
Ảnh màu BGR/RGB: 3 kênh
Ảnh 8-bit: giá trị từ 0 đến 255
0: đen, 255: trắng
Grayscale
BGR / RGB
HSV
YCrCb
Biểu diễn phân bố mức xám hoặc màu của ảnh
Thường dùng 256 mức (bins)
Kích thước kernel (3×3, 5×5,…)
Sigma (Gaussian)
Ngưỡng (threshold)
Trong OpenCV, ảnh được lưu trữ dưới dạng mảng NumPy (ndarray) với các kiểu dữ liệu sau:
| Kiểu dữ liệu | Phạm vi | Mục đích sử dụng |
|---|---|---|
uint8 |
0 – 255 | Ảnh thông thường |
uint16 |
0 – 65535 | Ảnh độ phân giải cao |
int16 |
-32768 – 32767 | Tính gradient |
float32 |
Số thực | Lọc ảnh, chuẩn hóa |
float64 |
Số thực | Tính toán chính xác |
=> Mặc định, ảnh đọc bằng cv2.imread() có kiểu uint8.
Đọc và ghi ảnh bằng Pillow (PIL)
from PIL import Image
# Đọc ảnh
img = Image.open("input.jpg")
# Ghi ảnh
img.save("output.jpg")
# Hiển thị
img.show()
Đọc ảnh bằng matplotlib
import matplotlib.pyplot as plt
img = plt.imread("input.png")
plt.imshow(img)
plt.axis("off")
Ví dụ đầy đủ gồm các thao tác đọc, ghi và hiển thị ảnh trong các mô hình màu khác nhau
import cv2
import numpy as np
import matplotlib.pyplot as plt
# -----------------------------
# 1. Đọc ảnh gốc (BGR)
# -----------------------------
img_bgr = cv2.imread("input.jpg")
if img_bgr is None:
raise ValueError("Không tìm thấy file ảnh input.jpg")
# -----------------------------
# 2. Chuyển đổi các mô hình màu
# -----------------------------
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
img_ycrcb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2YCrCb)
# -----------------------------
# 3. Ghi ảnh ra file
# -----------------------------
cv2.imwrite("output_bgr.jpg", img_bgr)
cv2.imwrite("output_gray.jpg", img_gray)
cv2.imwrite("output_rgb.jpg", img_rgb)
cv2.imwrite("output_hsv.jpg", img_hsv)
cv2.imwrite("output_ycrcb.jpg", img_ycrcb)
# -----------------------------
# 4. Hiển thị ảnh bằng matplotlib
# -----------------------------
plt.figure(figsize=(12, 8))
plt.subplot(2, 3, 1)
plt.imshow(img_rgb)
plt.title("RGB")
plt.axis("off")
plt.subplot(2, 3, 2)
plt.imshow(img_gray, cmap="gray")
plt.title("Grayscale")
plt.axis("off")
plt.subplot(2, 3, 3)
plt.imshow(img_hsv)
plt.title("HSV")
plt.axis("off")
plt.subplot(2, 3, 4)
plt.imshow(img_ycrcb)
plt.title("YCrCb")
plt.axis("off")
plt.subplot(2, 3, 5)
plt.imshow(img_bgr[:, :, ::-1])
plt.title("BGR")
plt.axis("off")
plt.suptitle("HIển thị ảnh trong các mô hình màu khác nhau", fontsize=14)
plt.tight_layout()
plt.show()
Minh họa việc tách ảnh thành các kênh R, G, B rồi tái tạo lại ảnh từ các kênh đó
import cv2
import numpy as np
import matplotlib.pyplot as plt
# -----------------------------
# 1. Đọc ảnh (OpenCV đọc BGR)
# -----------------------------
img_bgr = cv2.imread("input.jpg")
if img_bgr is None:
raise ValueError("Không tìm thấy ảnh!")
# Chuyển sang RGB
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
# -----------------------------
# 2. Tách các kênh màu RGB
# -----------------------------
R = img_rgb[:, :, 0]
G = img_rgb[:, :, 1]
B = img_rgb[:, :, 2]
# -----------------------------
# 3. In thử một phần ma trận giá trị
# -----------------------------
print("Ma tran kenh R (5x5):\n", R[:5, :5])
print("Ma tran kenh G (5x5):\n", G[:5, :5])
print("Ma tran kenh B (5x5):\n", B[:5, :5])
# -----------------------------
# 4. Hiển thị các ma trận kênh màu
# -----------------------------
plt.figure(figsize=(10, 4))
plt.subplot(1, 3, 1)
plt.imshow(R, cmap='gray')
plt.title("Ma tran kenh R")
plt.axis("off")
plt.subplot(1, 3, 2)
plt.imshow(G, cmap='gray')
plt.title("Ma tran kenh G")
plt.axis("off")
plt.subplot(1, 3, 3)
plt.imshow(B, cmap='gray')
plt.title("Ma tran kenh B")
plt.axis("off")
plt.tight_layout()
plt.show()
# -----------------------------
# 5. Ghép lại ảnh từ các ma trận RGB
# -----------------------------
img_reconstructed = np.stack((R, G, B), axis=2)
# -----------------------------
# 6. Hiển thị ảnh gốc và ảnh tái tạo
# -----------------------------
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.title("Anh RGB goc")
plt.axis("off")
plt.subplot(1, 2, 2)
plt.imshow(img_reconstructed)
plt.title("Anh tai tao tu ma tran RGB")
plt.axis("off")
plt.tight_layout()
plt.show()
https://tritue.edu.vn/tuecode/tracnghiem30/site/data/YVdRc01qUTJMRjl5YjNWMFpTeGlZV2wyYVdWMEwzQnZjM1F2ZG1sbGR3PT0%3D