tritue.edu.vn


Nhập môn xử lí ảnh bằng python

1. Python dùng thư viện nào để xử lí ảnh

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.


2. Các thông số dùng trong lập trình Python khi xử lí ảnh

Khi lập trình xử lí ảnh, cần quan tâm các thông số kỹ thuật sau:

2.1. Kích thước ảnh

  • Chiều cao (Height)

  • Chiều rộng (Width)

h, w = img.shape[:2] 

2.2. Số kênh màu

  • Ảnh xám: 1 kênh

  • Ảnh màu BGR/RGB: 3 kênh


2.3. Giá trị điểm ảnh (Pixel value)

  • Ảnh 8-bit: giá trị từ 0 đến 255

  • 0: đen, 255: trắng


2.4. Không gian màu

  • Grayscale

  • BGR / RGB

  • HSV

  • YCrCb


2.5. Histogram

  • 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)


2.6. Tham số lọc ảnh

  • Kích thước kernel (3×3, 5×5,…)

  • Sigma (Gaussian)

  • Ngưỡng (threshold)


3. Các kiểu dữ liệu dùng để xử lí ảnh với cv2

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)

Copy
         

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

Copy
         

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

Copy
         
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 đó

Copy
         
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()



Link chia sẻ bài viết
Copy
            https://tritue.edu.vn/tuecode/tracnghiem30/site/data/YVdRc01qUTJMRjl5YjNWMFpTeGlZV2wyYVdWMEwzQnZjM1F2ZG1sbGR3PT0%3D