Giải thuật xử lý ảnh số và ứng dụng C++

Giải thuật xử lý ảnh số là nền tảng quan trọng trong nhiều lĩnh vực công nghệ hiện đại. Tài liệu này tập trung phân tích các kỹ thuật cốt lõi thông qua ngôn ngữ lập trình C++, bao gồm: nguyên lý ảnh số, thao tác cơ bản, bộ lọc nhiễu, phát hiện biên, trích xuất đặc trưng và các kỹ thuật nâng cao khác.

1. Cơ sở toán học của ảnh số

Ảnh số được biểu diễn dưới dạng ma trận hai chiều với các phần tử gọi là pixel. Mỗi pixel lưu trữ giá trị cường độ sáng theo mô hình màu cụ thể (RGB, HSL, CMYK...). Quy trình xử lý bắt đầu từ việc đọc file ảnh, chuyển đổi không gian màu và thực hiện các phép biến đổi hình học.

2. Xử lý ảnh cơ bản

2.1 Đọc và hiển thị ảnh

Trong C++, thư viện OpenCV cung cấp các hàm hiệu quả để làm việc với ảnh:

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    Mat src = imread("sample.jpg", IMREAD_COLOR);
    if (src.empty()) return -1;
    
    namedWindow("Hien thi anh", WINDOW_AUTOSIZE);
    imshow("Hien thi anh", src);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

Mã nguồn trên minh họa cách sử dụng imread() để đọc file và imshow() để hiển thị ảnh. Các tham số như IMREAD_GRAYSCALE cho phép chuyển đổi sang ảnh xám.

2.2 Biến đổi hình học

Các phép quay và thu phóng ảnh được thực hiện qua các hàm:

  • resize(): Thay đổi kích thước ảnh
  • warpAffine(): Thực hiện phép quay
  • flip(): Lật ảnh theo trục
Mat resized;
resize(src, resized, Size(), 0.5, 0.5, INTER_LINEAR);

Mat rotated;
Point2f center(src.cols/2., src.rows/2.);
Mat rot_mat = getRotationMatrix2D(center, 45, 1.0);
warpAffine(src, rotated, rot_mat, src.size());

Tham số INTER_LINEAR ở đây xác định phương pháp nội suy sử dụng trong quá trình thu phóng.

3. Bộ lọc và giảm nhiễu

3.1 Các loại bộ lọc

Loại bộ lọcĐặc điểmCông thức
Bộ lọc trung bìnhGiảm nhiễu nhưng làm mờ biênG(x,y) = 1/9 Σf(x+i,y+j)
Bộ lọc GaussianBảo vệ biên tốt hơnG(x,y) = 1/(2πσ²) e^(-x²+y²/2σ²)
Bộ lọc MedianHiệu quả với nhiễu muối tiêuG(x,y) = median{f(x+i,y+j)}

3.2 Triển khai C++

Mat filtered;
GaussianBlur(src, filtered, Size(5,5), 1.5);
medianBlur(src, filtered, 5);

Lựa chọn tham số kích thước kernel và độ lệch chuẩn (σ) ảnh hưởng trực tiếp đến kết quả lọc.

4. Phát hiện biên

4.1 Thuật toán Sobel

Thuật toán này tính toán đạo hàm theo hai hướng x và y:

$$ G_x = \begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix}, G_y = \begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix} $$
Mat grad_x, grad_y;
Sobel(src, grad_x, CV_16S, 1, 0, 3);
Sobel(src, grad_y, CV_16S, 0, 1, 3);

4.2 Thuật toán Canny

Quy trình 4 bước: 1. Lọc nhiễu bằng Gaussian 2. Tính gradient 3. Dừng cực trị 4. Kết nối biên

Canny(src, edges, 100, 200);

5. Trích xuất đặc trưng

5.1 SIFT và ORB

  • SIFT: Tính bất biến về tỷ lệ, góc xoay
  • ORB: Kế thừa FAST và BRIEF, tốc độ nhanh
Ptr<SIFT> sift = SIFT::create();
sift->detectAndCompute(src, noArray(), keypoints, descriptors);

5.2 So khớp đặc trưng

Sử dụng BruteForce Matcher hoặc FLANN:

BFMatcher matcher(NORM_L2);
matcher.match(descriptors1, descriptors2, matches);

6. Ứng dụng thực tế

  • Xác định đối tượng trong tự lái
  • Phân tích hình ảnh y tế
  • Nhận diện khuôn mặt
  • Khôi phục hình ảnh 3D

Thẻ: C++ image processing opencv edge detection feature extraction image filtering

Đăng vào ngày 17 tháng 6 lúc 20:40