Việc phân tích đặc trưng texture (kết cấu) của ảnh đóng vai trò quan trọng trong nhiều lĩnh vực xử lý ảnh, từ nhận dạng vật thể, phân loại vật liệu đến chẩn đoán y tế. Đặc trưng texture cung cấp thông tin về sự sắp xếp không gian của các pixel ảnh, mô tả độ mịn, thô, đều hoặc ngẫu nhiên của một vùng ảnh. Trong ngữ cảnh hình ảnh y tế, các đặc trưng này đặc biệt hữu ích để phát hiện những thay đổi tinh tế trong cấu trúc mô, chẳng hạn như trong phân loại tổn thương.
Một trong những phương pháp phổ biến nhất để tính toán các đặc trưng texture là sử dụng Ma trận Đồng Xuất Hiện Mức Xám (Gray-Level Co-occurrence Matrix - GLCM). GLCM ghi lại tần suất một cặp pixel với các mức xám cụ thể xuất hiện ở một khoảng cách và hướng nhất định trong ảnh.
1. Khởi tạo và Tiền xử lý Ảnh
Trước khi tính toán GLCM, ảnh thường cần được tiền xử lý. Các bước phổ biến bao gồm chuyển đổi sang ảnh xám, điều chỉnh kích thước và giảm số lượng mức xám để tối ưu hóa hiệu suất tính toán.
function anhKetQua = chuanBiAnh(anhDauVao)
% chuanBiAnh: Hàm hỗ trợ tiền xử lý ảnh cho phân tích texture.
% Đầu vào: anhDauVao (Ma trận ảnh gốc, có thể là ảnh màu hoặc ảnh xám).
% Đầu ra: anhKetQua (Ảnh đã được tiền xử lý, kiểu uint8).
% Chuyển sang ảnh xám nếu ảnh đầu vào là ảnh màu
if size(anhDauVao, 3) == 3
anhXam = rgb2gray(anhDauVao);
else
anhXam = anhDauVao;
end
% Giảm kích thước ảnh để tăng tốc độ xử lý
anhKichThuocNho = imresize(anhXam, 0.8);
% Đảm bảo kiểu dữ liệu là uint8, đây là yêu cầu phổ biến cho GLCM
anhKetQua = im2uint8(anhKichThuocNho);
end
Hàm graycomatrix của MATLAB được sử dụng để tạo GLCM. Quan trọng là phải chọn đúng tham số Offset (khoảng cách và hướng) và NumLevels (số lượng mức xám để lượng tử hóa ảnh).
% Ví dụ sử dụng: Tải và chuẩn bị một ảnh
duongDanAnhMau = 'hinh_anh_benh_ly.jpg'; % Thay đổi tên file ảnh phù hợp
anhGoc = imread(duongDanAnhMau);
anhDaChuanBi = chuanBiAnh(anhGoc);
% Xác định số mức xám cho GLCM (ví dụ: 32 mức thay vì 64 để giảm độ phức tạp)
soMucXamGLCM = 32;
% Định nghĩa các offset (hướng và khoảng cách)
% Sử dụng nhiều offset để thu thập thông tin texture đa hướng
% Ví dụ: [0 1] (ngang), [-1 1] (chéo lên trái), [-1 0] (dọc), [-1 -1] (chéo lên phải)
cacOffsetGLCM = [0 1; -1 1; -1 0; -1 -1];
% Tạo ma trận đồng xuất hiện
% Tham số 'Symmetric', true đảm bảo GLCM đối xứng, thường được dùng để giảm phương sai
maTranGLCMMulti = graycomatrix(anhDaChuanBi, 'Offset', cacOffsetGLCM, ...
'NumLevels', soMucXamGLCM, 'Symmetric', true);
% graycomatrix trả về một ma trận GLCM cho mỗi offset.
% Để có một tập đặc trưng tổng thể, ta thường gộp chúng lại, ví dụ bằng cách lấy trung bình.
glcmTongHop = mean(maTranGLCMMulti, 4); % Lấy trung bình qua dimension 4 (offset)
2. Tính toán các Đặc trưng Texture
Từ GLCM đã được chuẩn hóa, ta có thể tính toán nhiều đặc trưng khác nhau. MATLAB cung cấp hàm graycoprops để tính một số đặc trưng chuẩn như Contrast, Homogeneity, Correlation và Energy. Tuy nhiên, để có thêm các đặc trưng chuyên biệt hoặc tùy chỉnh, chúng ta cần tự viết hàm tính toán.
Dưới đây là một hàm ví dụ để tính một tập hợp các đặc trưng GLCM, bao gồm các đặc trưng chuẩn và một số đặc trưng tùy chỉnh dựa trên công thức thường gặp hoặc được nhắc đến:
function [vecDacTrung] = tinhDacTrungTexture(maTranGLCM)
% tinhDacTrungTexture: Tính toán một tập hợp các đặc trưng texture từ GLCM.
% Đầu vào: maTranGLCM (Ma trận đồng xuất hiện chuẩn hóa).
% Đầu ra: vecDacTrung (Vector hàng chứa các giá trị đặc trưng texture).
% Đảm bảo ma trận GLCM đã được chuẩn hóa (tổng các phần tử bằng 1)
% Điều này quan trọng vì nhiều công thức đặc trưng yêu cầu P(i,j) là xác suất
tongPhanTu = sum(maTranGLCM(:));
if tongPhanTu == 0
warning('Ma trận GLCM rỗng, không thể tính đặc trưng. Trả về vector 0.');
vecDacTrung = zeros(1, 9); % Kích thước dựa trên số lượng đặc trưng đầu ra
return;
end
p_glcm = maTranGLCM / tongPhanTu; % Chuẩn hóa
[hang, cot] = size(p_glcm);
% Khởi tạo các biến cho các đặc trưng tùy chỉnh
nangLuongTuChinh = 0; % Năng lượng (Energy), T5
entropyGLTuChinh = 0; % Entropy mức xám (Gray-level Entropy), T11
tuongPhanTuyChinh = 0; % Tương phản/Quán tính (Contrast/Inertia), T14
khoanhKhacNghichDaoTuyChinh = 0; % Khoảnh khắc khác biệt nghịch đảo (IDM), T15
uuTheGradientNhoTuChinh = 0; % Ưu thế Gradient nhỏ, T1 (dựa trên công thức đã cho)
% Lặp qua ma trận GLCM để tính toán các đặc trưng tùy chỉnh
for r = 1:hang % Chỉ số hàng (i)
for c = 1:cot % Chỉ số cột (j)
p_rc = p_glcm(r, c);
% T5: Năng lượng (Energy)
nangLuongTuChinh = nangLuongTuChinh + p_rc^2;
% T11: Entropy mức xám (Gray-level Entropy)
if p_rc > 0 % Tránh log2(0)
entropyGLTuChinh = entropyGLTuChinh - p_rc * log2(p_rc);
end
% T14: Tương phản/Quán tính (Contrast/Inertia)
tuongPhanTuyChinh = tuongPhanTuyChinh + (r - c)^2 * p_rc;
% T15: Khoảnh khắc khác biệt nghịch đảo (Inverse Difference Moment - IDM)
% Dạng này thường được gọi là Homogeneity hoặc Inverse Difference Moment
% Sử dụng (r-c)^2 để làm khác biệt với T1 trong ví dụ này.
if (1 + (r - c)^2) ~= 0
khoanhKhacNghichDaoTuyChinh = khoanhKhacNghichDaoTuyChinh + (p_rc / (1 + (r - c)^2));
end
% T1: Ưu thế Gradient nhỏ (Small Gradient Dominance)
% Dựa trên công thức cung cấp, có dạng giống IDM
if (1 + abs(r - c)) ~= 0
uuTheGradientNhoTuChinh = uuTheGradientNhoTuChinh + (p_rc / (1 + abs(r - c)));
end
end
end
% Các đặc trưng chuẩn từ hàm graycoprops của MATLAB
thongKeChuan = graycoprops(p_glcm, {'Contrast','Homogeneity','Correlation','Energy'});
% Gộp tất cả các đặc trưng vào một vector duy nhất
vecDacTrung = [
thongKeChuan.Contrast, ... % Tương phản (standard)
thongKeChuan.Homogeneity, ... % Đồng nhất (standard)
thongKeChuan.Correlation, ... % Tương quan (standard)
thongKeChuan.Energy, ... % Năng lượng (standard)
nangLuongTuChinh, ... % Năng lượng (custom)
entropyGLTuChinh, ... % Entropy mức xám (custom)
tuongPhanTuyChinh, ... % Tương phản/Quán tính (custom)
khoanhKhacNghichDaoTuyChinh,... % Khoảnh khắc nghịch đảo (custom)
uuTheGradientNhoTuChinh % Ưu thế Gradient nhỏ (custom)
];
end
Các đặc trưng như Energy và Entropy thường được sử dụng để đánh giá độ đều và độ phức tạp của texture. Ví dụ, trong phân tích mô bệnh học, một mô bệnh có thể có Energy thấp hơn (cấu trúc ít đồng nhất) và Entropy cao hơn (độ phức tạp và ngẫu nhiên cao hơn) so với mô lành.
3. Quy trình Trích xuất Đặc trưng Hàng loạt và Chuẩn hóa
Để xử lý một tập dữ liệu ảnh lớn, quy trình trích xuất đặc trưng cần được thực hiện hàng loạt. Sử dụng parfor (vòng lặp song song) có thể tăng tốc đáng kể quá trình này.
% Quy trình trích xuất đặc trưng hàng loạt cho một thư mục ảnh
thuMucDuLieu = 'du_lieu_anh_phan_loai'; % Thư mục chứa các ảnh
dinhDangFile = '*.png'; % Thay đổi định dạng file nếu cần (ví dụ: '*.jpg')
danhSachFiles = dir(fullfile(thuMucDuLieu, dinhDangFile));
soLuongAnh = length(danhSachFiles);
% Xác định số lượng đặc trưng đầu ra từ hàm tinhDacTrungTexture
% (ví dụ: 9 đặc trưng như trong hàm ví dụ)
soDacTrung = 9;
maTranDacTrung = zeros(soLuongAnh, soDacTrung);
% Thiết lập pool song song cho 'parfor'
% Kiểm tra và xóa pool cũ nếu có để đảm bảo cài đặt mới
if ~isempty(gcp('nocreate'))
delete(gcp);
end
pool = parpool('local', feature('numcores')); % Mở pool với số core CPU hiện có
% Vòng lặp song song để xử lý từng ảnh
parfor k = 1:soLuongAnh
tenFileHienTai = fullfile(thuMucDuLieu, danhSachFiles(k).name);
% Chuẩn bị ảnh
anhDaXuLy = chuanBiAnh(imread(tenFileHienTai));
% Tạo GLCM với một tập offset và số mức xám nhất định
cacOffsetBatch = [0 1; 1 0]; % Ví dụ chỉ dùng 2 offset đơn giản
glcmBatch = graycomatrix(anhDaXuLy, 'Offset', cacOffsetBatch, 'NumLevels', 64, 'Symmetric', true);
glcmTongHopBatch = mean(glcmBatch, 4); % Trung bình hóa các GLCM từ nhiều offset
% Tính toán và lưu các đặc trưng
maTranDacTrung(k,:) = tinhDacTrungTexture(glcmTongHopBatch);
end
delete(pool); % Đóng pool song song sau khi hoàn tất
% Lưu kết quả đặc trưng vào một file CSV
tenFileDauRaCSV = 'cac_dac_trung_texture_da_trich_xuat.csv';
writematrix(maTranDacTrung, tenFileDauRaCSV);
% Chuẩn hóa đặc trưng để loại bỏ ảnh hưởng của thang đo
% Chuẩn hóa Z-score là một phương pháp phổ biến
maTranDacTrungChuanHoa = zscore(maTranDacTrung);
% maTranDacTrungChuanHoa giờ có thể được sử dụng làm đầu vào cho các thuật toán học máy
Sau khi trích xuất, các đặc trưng thường có thang đo và dải giá trị khác nhau. Việc chuẩn hóa (ví dụ: Z-score) là cần thiết để đảm bảo không có đặc trưng nào chiếm ưu thế quá mức trong các thuật toán học máy, cải thiện hiệu suất của mô hình phân loại hoặc phân cụm. Mặc dù các đặc trưng texture truyền thống có thể không mạnh bằng các đặc trưng học sâu trong nhiều tác vụ, chúng vẫn là một công cụ phân tích giá trị, đặc biệt khi được kết hợp với các phương pháp khác.