ỨNG DỤNG PHÂN ĐOẠN ẢNH MÀU
3.1 PHƯƠNG PHÁP SỬ DỤNG KHÔNG GIAN MÀU L*a*b*
Mục tiêu là xác định các vùng màu khác nhau dựa vào việc phân tích không gian màu L*a*b*.
3.1.1 Phân tích chương trình
Bước 1: Đọc ảnh
Để để thực hiện việc xử lý ảnh trong quá trình phân đoạn, ảnh đầu vào được chuyển đổi sang một ma trận, mỗi pixel tương ứng với một phần tử trong ma trận.
Hàmimread sẽ cho ra ma trậnfabric. fabric = imread('vaisoi.jpg');
Bước 2: Tính toán các màu mẫu không gian màu L*a*b* với mỗi vùng tương ứng.
Ở đây ta sử dụng 6 màu để phân vùng: Màu nền, Red, Green, Purple, Yellow và Magenta; giả sử nếu hình ảnh có 6 màu thì sẽ phân ra làm 6 vùng khác nhau. Với phương pháp này, ta có thể phân biệt một cách rõ ràng các vùng màu này nếu các màu có sự khác biệt tương đối.
Thực hiện tính toán giá trị màu trung bình trong không gian L*a*b* để có được các mẫu màu; từ những mẫu màu này sẽ phân loại các pixel theo các mẫu màu trên.
sample_regions là ma các trận tương ứng với 6 vùng màu khác nhau, có kích thước bằng với kích thước của ma trận fabric.
load regioncoordinates;
nColors = 6;
sample_regions = false([size(fabric,1) size(fabric,2) nColors]);
for count = 1:nColors
sample_regions(:,:,count) =
roipoly(fabric,region_coordinates(:,1,count),...
region_coordinates(:,2,count));
end
Ví dụ nếu muốn hiển thị vùng có màu đỏ bằng đoạn mã dưới đây: imshow(sample_regions(:,:,2)),title('Vung mau co mau do);
Tiếp theo thực hiện chuyển đổi ảnh RGB sang ảnh L*a*b* sử dụng hàm makecform và applycform.
cform = makecform('srgb2lab');
lab_fabric = applycform(fabric,cform);
Tính trung bình các giá trị a* và b* với mỗi vùng mà đã được tách ra trước đó.
color_markers là ma trận 6 hàng 2 cột (6x2) để chứa các giá trị màu trung bình của các đại lượng a* và b* tương ứng với mỗi vùng màu; giá trị của a* trên cột 1, giá trị của b* trên cột 2. Sau khi tính toán bằng hàm mean2 với ảnh minh họa xong (vaisoi.jpg) kết quả được lưu tại color_markers:
a* b*
Magent Yellow Purple Green
d Backgroud
Re
0
3816 . 105
0189 . 95
1250 . 139
0873 . 149
8854 . 143
6250 . 148
0066 . 182
6415 . 157
1250 . 111
4206 . 194
1875 . 137
ers color_mark
=
a = lab_fabric(:,:,2);
b = lab_fabric(:,:,3);
color_markers = repmat(0, [nColors, 2]);
for count = 1:nColors
color_markers(count,1) = mean2(a(sample_regions(:,:,count)));
color_markers(count,2) = mean2(b(sample_regions(:,:,count)));
end
Bước 3: Phân loại các Pixel sử dụng quy tắc liền kề.
Với mỗi màu được đánh dấu đều có giá trị là a* và b* tương ứng với mỗi hàng trong ma trận color_markers. Ta có thể phân loại các pixel có màu tương ứng này trong ảnh bằng cách tính toán khoảng cách Ơclit giữa các pixel và màu đã được đánh dấu trong ma trận color_markers. Khoảng cách ngắn nhất sẽ cho ta biết pixel này được ghép vào nhóm màu đánh dấu nào. Ví dụ, nếu khoảng cách giữa một pixel và màu đỏ đã được đánh dấu là nhỏ nhất thì pixel này sẽ được đánh dấu là màu đỏ.
Ta tạo ra một mảng color_labels chứa các nhãn màu: 0 = background, 1 = red, 2 = green, 3 = purple, 4 = magenta, and 5 = yellow.
color_labels = 0:nColors-1;
a = double(a);
b = double(b);
Khởi tạo ma trận khoảng cách distance với giá trị 0 và có kích thước ma trận a để lưu các ma trận với các vùng màu về sau:
distance = repmat(0,[size(a), nColors]);
Thực hiện hiện tính toán khoảng cách Ơclit với từng điểm ảnh để tạo ra 6 ma trận khoảng cách distance tương ứng với 6 màu hay 6 vùng ảnh khác nhau.
for count = 1:nColors
distance(:,:,count) = ( (a - color_markers(count,1)).^2 + ...
(b - color_markers(count,2)).^2 ).^0.5;
end
Tiếp theo tạo ra một ma trân value với giá trị của từng phần tử là nhỏ nhất trong các ma trân distance và một ma trận nhãn lable với giá trị của từng phần tử là thứ tự của mà trận distance mà có giá trị của điểm ảnh là nhỏ nhất. Ví dụ, điểm ảnh ở vị trí (2x2) của ma trận distance thứ tự là 3 có giá trị nhỏ nhất là V thì cũng vị trí (2x2) của ma trận value sẽ có giá trị là V và vị trí (2x2) trong ma trận lable sẽ có giá trị là 3.
[value, label] = min(distance,[ ],3);
Gán các giá trị tương ứng của lable theo ma trận color_labels:
label = color_labels(label);
Xóa các ma trận distance vì không dùng đến nữa:
clear value distance;
Bước 4: Hiển thị kết quả phân loại màu.
Sao lưu ma trận lable:
rgb_label = repmat(label,[1 1 3]);
Tạo ra ma trận segmented_images giá trị 0 và bằng kích thước của ảnh:
segmented_images = repmat(uint8(0),[size(fabric), nColors]);
Tạo ra 6 ma trận tương ứng với 6 vùng có màu khác nhau. rgb_label là ma trận ảnh có các giá trị trong khoảng [0..5]. color là ma trận ảnh ban đầu. Ma trận Segmented_images có giá trị 0 có kich thước bằng ảnh ban đầu. Với mỗi thứ tự màu count (vùng), xét từng pixel trong Color, nếu với vị trí tương ứng mà pixel này trong rgb_label có giá trị tương đương (~= ) với giá trị trong color_labels ở vị trí
count thì pixel trong Color được gán bằng 0, pixel ở vị trí tương ứng trong segmented_images cũng nhận giá trị là 0. Ngược lại giá trị của pixel tương ứng trong Color không thay đổi và pixel tương ứng trong segmented_images sẽ nhận giá trị của Color.
Như vậy, sau các vòng lặp sẽ tạo ra các ma trận ảnh (các vùng ảnh) với từng màu tương ứng; các điểm ảnh của màu khác sẽ nhận giá trị 0. Và như vậy khi hiển thị ảnh của từng vùng sẽ nổi lên màu của vùng đó, và các màu còn lại sẽ thay bằng màu đen.
for count = 1:nColors color = fabric;
color(rgb_label ~= color_labels(count)) = 0;
segmented_images(:,:,:,count) = color;
% Hiển thị kết quả:
figure;imshow(segmented_images(:,:,:,count)), title(‘’);
end
3.1.2 Kết quả phân đoạn
Kết quả của việc áp dụng theo phương pháp này cho ta thấy ở dưới đây.Với ảnh đầu vào có 5 màu phân biệt (Red, Green, Purple, Yellow và Magenta) thì sẽ được phân ra làm 5 ảnh thành phần ( đoạn) tương ứng với 5 màu khác nhau.
Ảnh ban đầu Red
Green Purple
Magenta Yellow