PHÂN ĐOẠN ẢNH MÀU
2.3. MỘT VÀI PHƯƠNG PHÁP PHÂN ĐOẠN ẢNH MÀU
2.3.3. Phương pháp mở rộng vùng
Ý tưởng của phương pháp này là xét ảnh từ các miền nhỏ nhất rồi nối chúng lại nếu thỏa mãn tiêu chuẩn để được miền đồng nhất lớn hơn. Tiếp tục các miền thu được cho đến khi không thể nối thêm được nữa. Số miền còn lại cho ta kết quả phân đoạn. Như vậy miền nhỏ nhất của bước xuất phát là điểm ảnh.
Phương pháp này hoàn toàn ngược với phương pháp tách cây tứ phân. Điều quan trọng ở đây là nguyên lý nối 2 vùng. Việc nối 2 vùng được thực hiện theo nguyên tắc sau [2]:
+ Hai vùng phải đáp ứng tiêu chuẩn, cùng màu hay cùng mức xám.
+ Hai vùng phải kế cận nhau.
Khái niệm kế cận [1,2]: trong xử lý ảnh, người ta dùng khái niệm liên thông để
thông. Với 4 liên thông một điểm ảnh I(x,y) sẽ có 4 kế cận theo 2 hướng x và y;
trong khi đó với 8 liên thông, điểm I(x,y) sẽ có 4 liên thông theo 2 hướng x, y và 4 liên thống khác theo hướng chéo 450
Dựa theo nguyên lý của phương pháp nối, ta có 2 thuật toán:
+ Thuật toán tô màu Blob Coloring: sử dụng khái niệm 4 liên thông, dùng một của sổ di chuyển trên ảnh để so sánh với tiêu chuẩn nối.
+ Thuật toán đệ quy cục bộ: sử dụng phương pháp tìm kiếm trong cây để làm tăng kích thước của vùng.
a. Xác định điểm ảnh mở rộng
Thực hiện việc tìm ra các điểm ảnh xuất phát để từ đó các vùng được mở rộng bắt đầu từ những điểm này. Trong phương pháp này có sử dụng không gian màu L*a*b*. [14] Các thành phần trong L*a*b* của điểm xuất phát là rất quan trọng trong mỗi bước lặp khi phân đoạn. Đầu tiên, các màu của ảnh được đánh chỉ số, sau đó đếm số lượng các điểm ảnh trong từng màu đã được đánh chỉ số.
Để rõ hơn, ta mô tả bằng giải thuật như sau:
pixel: record of L:lightness a:a_component b:b_component end;
Image: array [1..width,1..height] of pixel;
PixelData: record of color: pixel
counter: number of pixels end;
IndexTable: Array[1..MaxIndex] of PixelData begin
for x:=1 to image_width do for y:=1 to image_height do
if image_pixel[x,y] not included into segment then begin
a) 4 liên thông b) 8 liên thông
ActualIndex:=1; z:=1; IndexedColor:=false;
repeat
if IndexTable[z].PixelData.color=image[x,y] then begin //Màu đã được đánh chỉ số
inc(IndexTable[z].PixelData.counter);
IndexedColor:=true;
end
increment(z);
until (z>ActualIndex) or (indexedcolor=true);
if indexedcolor=false then //Màu chưa được đánh chỉ số begin
Inc( IndexTable[ActualIndex].PixelData.counter);
IndexTable[ActualIndex].PixelData.color:=image[x,y];
Inc(ActualIndex);
end;
end;
Tiếp theo, thuật toán tìm trong bảng chỉ số (IndexTable) mà tại vị trí
MaxIndex có số điểm ảnh nhiều nhất. (IndexTable[MaxIndex].PixelData.counter value). Màu tai vị trí MaxIndex; (IndexTable[ActualIndex].PixelData.color) chính là màu của điểm ảnh cần mở rộng.
b. Thuật toán mở rộng vùng
Trên cơ sở các đã tìm được các điểm ảnh ban đầu, ở nội dung này sẽ đưa ra thuật toán để mở rộng vùng dựa trên các điểm đó. Tiêu chí để phân đoạn ở đây là dựa vào 4 liên thông, dựa trên khoảng cách của điểm ảnh khởi đầu tới 4 điểm ảnh lân cận của nó trong không gian L*a*b*. Xuất phát từ điểm ảnh khởi đầu thuật toán đi tìm các điểm ảnh có cùng màu với điểm khởi đầu và bổ sung vào đoạn đang xét.
Quá trình trên mô tả bằng đoạn giải thuật sau:
begin
for x:=1 to width do for y:=1 to height do
if Image[x,y]=seed_pixel_color then begin
set new segment number p; //Khởi tạo đoạn mới GrowUpSegment(x,y);
end;
end;
Thủ tục GrowUpSegment(x,y) xác định tiêu chí mở rộng vùng. Nếu tiêu chí mở rộng vùng K() thỏa mãn với điểm ảnh hiện tại và sau đó kiểm tra đến 4 điểm lân cận của nó. Thủ tục mô tả như sau:
GrowUpSegment(x,y);
begin
if Pixel(x,y) not in any segment and K(Image(x,y),seed_pixel_color) then
begin
Include Pixel(x,y) to segment p;
GrowUpSegment(x-1,y);
GrowUpSegment(x+1,y);
GrowUpSegment(x,y-1);
GrowUpSegment(x,y+1);
End End
≥
−
<
= −
K ab ab False
K ab ab True p
p K
p p
p p s
2 1
2 1
: ) :
, ( 1 2
2
1 p
p ab
ab − là khoảng cách theo Oclit giữa hai điểm ảnh p1 và p2 trong không gian L*a*b*; K là hằng số.
Các tham số L*a*b* của đoạn được tính bằng giá trị trung bình của màu tương ứng và giá trị cường độ sáng của tất cả các điểm ảnh trong một đoạn.
c. Ứng dụng vào khoanh vùng chữ trong ảnh
[14] Khoanh vùng chữ dựa trên việc so sánh các đoạn ký tự trong ảnh phân đoạn bằng cách sử dụng một vài quy tắc. Các quy tắc này sử dụng các tham số hình học và màu sắc của các đoạn. Thuật toán tạo ra một tập các đoạn thể hiện dưới đây:
1. Các đoạn này có màu tương tự nhau:
c4
b b a a L
LSk − Sl + Sk − Sl + Sk − Sl <
Trong đó L,aSk,aSl,bSk,bSl là các thành phần màu của các đoạn đã được kiểm tra; c4là hằng số.
2. Các đoạn này có chiều cao tương tự nhau
2
1 c
H c H
l k
S S >
>
Trong đó HSk,HSllà chiều cao của các đoạn đã điểm tra;
2 1,c
c là hằng số.
3. Các đoạn tương ứng với các chữ trên một dòng thẳng đứng.
c3
H Y Y
i S
Sk l
− <
Trong đó YSk,YSl là khoảng cách điểm ảnh thấp nhất trong đoạn đến đáy của ảnh; Hilà chiều cao ảnh; c3 là hằng số.
4. Khe hở giữ các đoạn trong tập các đoạn văn bản tạo ra là không rộng.
c4
S X X
h S Sk − l <
Trong đó XSk,XSlkhoảng cách đoạn bên trái nhất đến đoạn bên phải nhất trong các đoạn; Shtổng số các đoạn; c4 là hằng số.
Dưới đây là các quy tắc sử dụng trong thuật toán để tạo ra tập các đoạn:
for Sn:=S0to Smax
{ }n
n S
N := p:=n+ 1 repeat
if { }S Kk(Sz,Sp)
∃z then
{ }p n
n N S
N := ∪ p=p+1 until p=max
Trong đó max là số đoạn tối đa;
Nn là số văn bản được tạo ra; Sn là đoạn thứ n.
Thuật toán khoanh vùng văn bản có thể xem như mỗi đoạn như là một tập mẫu và so sánh nó với các đoạn đoạn còn lại. Kk là tiêu chí để xác định một đoạn.
*. Làm nổi vùng chữ
Sau khi thục hiện phân đoạn và khoanh vùng văn bản xong, các vùng ảnh được tạo ra, các vùng là chữ đã được khoanh vùng dạng hình chữ nhật. Lúc này, ta áp dụng thuật toán làm nổi chữ trong các vùng đã khoanh.
create_set_bounding_rectangle;
background_color:=average_color_of_rest_of_pixels_within_bounding_rectangle;
for x:=0 to bounding_rectangle_width do for y:=0 to bounding_rectangle_height do begin
distance_to_letter:=LabDistance(
bounding_rectangle_pixel(x,y), letter_Color);
distance_to_background(bounding_rectangle_pixel(x,y), background_Color);
if distance_to_letter>distance_to_background then output_image_pixel(x,y):=0
else
output_image_pixel(x,y):=1 end;
Hàm LabDistance(pixel1,pixel2) tính khoảng cách giữa hai điểm pixel1 và pixel2 trong không gian màu L*a*b*.
Ví dụ thể hiện qua hình 2.6 dưới đây sẽ cho ta thấy rõ hơn về kết quả của việc áp dụng thuật toán mở rộng vùng vào ứng dụng trong văn bản. Hình 2.6a là ảnh ban đầu. Hình 2.6b là kết quả sau khi áp dụng thuật toán mở rộng vùng để phân đoạn và khoanh vùng văn bản, những vùng có chữ trong ảnh đã được khoanh vùng bằng các ô hình chữ nhật có viền xanh. Hình 2.6c là kết quả sau khi áp dụng thuật toán làm nổi vùng văn bản đối với hình 2.6b. Trên hình này, ta thấy vùng văn bản nổi rõ hơn nhờ việc làm cho các vùng nền mờ đi và vùng văn bản được tô đậm bằng màu đen.
a) b) c)