Việc nhận dạng ảnh dựa vào màu sắc là duyệt qua toàn bộ ảnh, rồi lọc lấy những điểm ảnh có giá trị màu sắc thích hợp. Phương pháp này rất hiệu quả khi phải nhận dạng những vật ở xa, khi mà hình dạng của vật đã bị biến dạng bởi điều kiện ánh sáng,
do đó không thể nhận dạng được vật thể dựa vào hình dạng. Nhược điểm của phương pháp này là bị ảnh hưởng bởi nhiễu khá nhiều và không phân biệt được đâu là vật cần tìm và đâu là nhiễu, do vậy có thể coi đây là bước lọc đầu tiên để tìm vật thể, sau đấy cần nhận dạng vật thể bằng các kỹ thuật khác cao cấp hơn, như: dựa vào hình dạng, dựa vào vân…
Có rất nhiều không gian màu dùng để mô tả màu sắc của ảnh, nhưng không phải không gian màu nào cũng thích hợp cho việc tìm kiếm ảnh. Sau đây là những không gian màu cơ bản.
3.2.1.1. Không gian màu RGB
Không gian màu RGB là sự kết hợp của ba thành phần màu cơ bản: đỏ ( R ), Xanh lá cây ( G ) và xanh lục ( B ). Mỗi thành phần màu có thể nhận các giá trị từ 0 đến 16, 32, 64, 255 tùy thuộc vào số lượng bít dùng để lưu trữ. Ba thành phần màu sắc nhận những giá trị khác nhau được hòa trộn với nhau để tạo ra không gian màu RGB, nếu dùng 8 bit để mã hóa mỗi màu, tức 3 byte cho toàn không gian màu, thì sẽ nhận được tất cả 28×28×28 ≈16 triệu màu khác nhau.
Hình 3.19: Mô hình màu RGB
Không gian màu RGB là định dạng phổ biến nhất của ảnh số, lý do chính là vì nó tương thích với các thiết bị hiển thị điện tử. Tuy nhiên hạn chế lớn nhất của không gian màu RGB là nó không giống như cách con người cảm nhận về màu sắc, do đó không phù hợp cho việc tìm kiếm ảnh dựa vào màu sắc.
3.2.1.2. Không gian màu CMY
CMY là viết tắt của Cyan-Magenta-Yellow (màu lục lam, màu đỏ tươi, màu vàng), đó là ba màu chính tương ứng với ba màu mực in. Cyan hấp thu sự chiếu sáng
của màu đỏ, Magenta hấp thu màu xanh lục, Yellow hấp thu màu xanh dương. Do đó, tạo ra sự phản ánh tương ứng như khi in ảnh được chiếu sáng với ánh sáng trắng. Hệ thống dưới dạng âm tính vì mã hóa theo dạng hấp thụ màu. Có một số mã hóa như sau:
trắng (0,0,0) vì không có ánh sáng trắng được hấp thụ, đen (255,255,255) vì tất cả các thành phần của màu trắng đều được hấp thụ.
Hình 3.20: Không gian màu CMY
Hệ thống màu CMY dường như là một sự đảo ngược của hệ thống màu RGB. Đặc tính của nó là sự đơn giản, ứng dụng nhiều trong thực tế. Tuy nhiên khuyết điểm của nó cũng tương tự như không gian màu RGB, tức là cách mã hóa khác với cách mà con người cảm nhận về màu sắc. Không thích hợp cho bài toán tìm kiếm ảnh dựa vào nội dung.
3.2.1.3. Không gian màu Lab
Không gian màu L*a*b sử dụng 3 thông số L, a, b để biểu diễn màu sắc:
L: Lightness – độ sáng của màu.
a: là giá trị màu chạy từ màu đỏ đến xanh lá cây.
b: là giá trị màu vàng đến màu xanh nước biển.
Hình 3.21: Không gian màu L*a*b
Các mối quan hệ phi tuyến giữa ba thành phần L , a, b được sẳ dụng để bắt trước sự cảm nhận phi tuyến của mắt người về màu sắc. Vì vậy hệ thống màu Lab được dùng nhiều nhất cho việc màu, thí dụ, để pha chế màu hoặc để kiểm tra chất lượng in.
Các tông màu và độ bão hòa được vẽ lên các trục a và b, trục độ sáng L chạy từ 0 tới 100. Đây là không gian màu có sự tách biệt giữa độ sáng và mà sắc, dó đó cũng rất thích hợp cho việc nhận dạng bằng màu sắc.
3.2.1.4. Không gian màu HSV: Hue-Saturation-Value
Hệ thống màu HSV mã hóa thông tin màu sắc bằng cách chia giá trị Value V từ hai giá trị được mã hóa thuộc về độ hội tụ của màu- Hue H và Saturation S.
Hình 3.22: Không gian màu HSV
Thành phần không gian màu HSV gồm có ba phần: Hue được định nghĩa có giá trị 0-2Π , mang thông tin về màu sắc. Saturation có giá trị 0-1, mang giá trị về độ thuần khiết của thành phần Hue. Value (Intensity) mang thông tin về độ sáng của điểm ảnh. Đôi khi hệ thống màu HSV được coi như là hệ thống màu HSI hoặc HSB khi dùng Intensity hoặc Brightness thay vì Value. Có thể hình dung không gian màu HSV
như là vật hình nón, với trục chính biểu thị cường độ sáng Value, khoảng cách đến trục biểu thị độ tập chung Saturation, góc xung quanh trục biểu thị cho sắc màu Hue.
Hệ thống màu HSV thì thích hợp hơn với một số thiết kế đồ họa bởi vì nó cung cấp sự điều khiển trực tiếp đến ánh sáng và hue. Hệ thống màu HSV cũng hỗ trợ tốt hơn cho những thuật toán xử lý ảnh vì sự tiêu chuẩn hóa về ánh sáng và tập chung vào hai tham số về độ hội tụ màu, và cường độ màu. Sự giống và khác nhau giữa hai ảnh về mặt màu sắc đối với mắt người chỉ mang ý nghĩa tương đối. Do đó khi áp dụng vào bài toán này trên máy tính thì ta cũng giả lập sự tương đối này.
3.2.2. Tìm kiếm dựa vào màu sắc
Có hai phương pháp để tìm kiếm ảnh dựa vào màu sắc, đó là: sử dụng lược đồ ( histogram) và bắt màu. Phương pháp tìm kiếm dựa vào histogram chỉ có thể áp dụng cho những vật thể ở gần, còn đối với các vật thể ở xa, nhất thiết phải sử dụng phương pháp bắt màu.
3.2.2.1. Lược đồ Histogram
Định nghĩa Histogram
Histogram là một bảng tóm tắt thông tin về màu sắc cho một ảnh màu bất kỳ. Có nhiều loại lược đồ Histogram, như: histogram thể hiện độ sáng tối, histogram thể hiện sự phân bố màu sắc…Lược đồ histogram cho biết độ tập chung về độ sáng hoặc màu sắc của ảnh. Trong trường hợp của histogram thể hiện độ sáng tối, trục hoành của lược đồ thể hiện các mức sáng, trục tung của lược đồ thể hiện số lượng điểm ảnh có mức sáng tương ứng với giá trị tại trục hoành. Sự phân bố của các điểm ảnh càng thiên về phía bên trái thì bức ảnh cảng tối, ngược lại, sự phân bố này càng thiên về phía bên phải thì ảnh càng sáng.
Hình 3.23: (a) ảnh gốc, (b) lược đồ độ sáng, (c) lược đồ màu HUE
Lược đồ thể hiện độ sáng chỉ có ý nghĩa trong chỉnh sửa ảnh, đối với vấn đề tìm kiếm ảnh dựa vào màu sắc thì chỉ sử dụng lược đồ màu. Một ảnh có thể có nhiều lược đồ màu khác nhau tùy thuộc vào không gian màu dùng để mã hóa ảnh đó. Ví dụ như ảnh được mã hóa trong không gian màu HSV, sẽ thu được lược đồ Hue của ảnh (Hình 3 .23). Trục x của lược đồ màu Hue thể hiện sự biến thiên của màu từ 0 cho tới 360,
còn trục y mô tả số lượng pixel có màu tương ứng trên trục x. Đối với ảnh màu RGB sẽ có 3 lược đồ màu tương ứng với 3 đại lượng màu cơ bản, đó là: đỏ, xanh lá cây và xanh da trời. Trục x của lược đồ màu RGB mô tả độ sáng tăng dần, còn trục y mô tả số lượng pixel có mức sáng tương ứng trên trục x (
Hình 3.24: (a) ảnh gốc, (b) lược đồ màu đỏ, (c) lược đồ màu xanh lá cây, (d) lược đồ màu xanh da trời
Mặc dù một ảnh có thể có nhiều lược đồ màu, nhưng lược đồ màu Hue của không gian màu HSV là có ý nghĩa nhất trong tìm kiếm ảnh, vì lược đồ màu Hue mô tả một bức tranh tổng thể các màu có trong ảnh. Nhưng đa số ảnh màu ngày nay được lưu trữ dưới chuẩn RGB, do đó cần chuyển đổi cách mã hóa màu sắc sang chuẩn màu HSV.
Việc chuyển đổi này được thực hiện lần lượt trên từng pixel của ảnh. Sau đây là thuật toán chuyển đổi:
double r,g,b,h,s,v,Max,Min;
r = color_rgb.red g = color_rgb.green;
b = color_rgb.blue
Max = max(max(r,g),b);
Min = min(min(r,g),b);
v = Max;
if (v==0) s = 0;
else s = 255*(Max - Min) /v;
if (s==0) h = -1;
else {
if (v==r) h=(g-b)/(Max-Min);
if (v==g) h=2+(b-r)/( Max-Min);
if (v==b) h=4+(r-g)/( Max-Min);
}
h=60*h;
if (h<0) h=360+h;
color_hsv.hue = h;
color_hsv.saturation = s*100/255;
color_hsv.value = v*100/255;
Trong thư viện Opencv có một hàm hỗ trợ việc chuyển đổi không gian màu, đó là hàm: cvCvtColor().
void cvCvtColor(
const CvArr* src,
CvArr* dst,
int code
);
Hàm cvCvtColor() cho phép chuyển đổi giữa nhiều không gian màu khác nhau, phụ thuộc và tham số code của hàm, tham số src là ảnh gốc và dst là ảnh thu được.
Ghi chú 2.1: Thuật toán mô tả việc chuyển đổi không gian màu được trình bày minh họa trong phần “còn trống”.
Cách tính Histogram
Về cơ bản việc tính histogram của một bức ảnh chính là việc đếm số pixel thỏa mãn một giá trị nào đấy, lưu số lượng pixel đếm được vào một bin rồi sắp sếp các bin đó theo giá trị tăng dần. Ví dụ như tính histogram độ Hue của một bức ảnh: Đầu tiên đếm số pixel có độ Hue là 0 trước, lưu giá trị đó vào bin thứ nhất, tiếp tục đếm số pixel có độ Hue là 1, lưu vào bin thứ hai, quá trình tiếp tục như vậy cho đến khi kết thúc 360 giá trị của Hue.
Để tính histogram trong thư viện Opencv có đầy đủ các hàm hỗ trợ công việc này.
- CvHistogram; // Cấu trúc chứa histogram - CvHistogram* cvCreateHist(
int dims,int* sizes, int type,float** ranges, NULL,
int uniform = 1); //Hàm tạo histogram - void cvCalcHist(
IplImage** image, CvHistogram* hist, int accumulate = 0,
const CvArr* mask= NULL ); // Hàm tính histogram
Ghi chú 2.2: Thuật toán mô tả việc tính histogram được minh họa trong phần “còn trống”.
So sánh Histogram
Công đoạn cuối cùng để nhận dạng vật thể dựa vào histogram đó là so sánh histogram. Cụ thể hơn, để nhận biết sự xuất hiện của vật thể trong một bức ảnh thu được, ta so sánh histogram của một bức ảnh mẫu chứa vật thể với từng vùng trong ảnh thu được. Vùng nào có sự tương đồng nhiều nhất thì có thể khẳng định được là vật thể xuất hiện trong vùng đó.
Hình 3.25: Tìm kiếm ảnh bằng histogram
Hình 3 .25 mô tả việc tìm kiếm ảnh dựa vào histogram: ảnh mẫu chứa vật thể giả sử có kích thước D, dịch chuyển khung vuông có cùng kích thước D khắp các vùng trong ảnh thu được, Tính histogram của phần ảnh bị giới hạn trong kích thước D, so sánh histogram đó với histogram của ảnh mẫu. Có nhiều phương pháp để so sánh 2 histogram: Gọi h(I) và h(M) là hai lược đồ của hai ảnh I và M, mỗi lược đồ có K bin, các phương pháp so sánh là đo khoảng cách Min-Max và đo khoảng cách Euclid.
• Đo khoảng cách min-max:
Được thực hiện trên ý tưởng lấy phần giao cắt của 2 lược đồ cần so sánh:
Đối với độ đo Min: Intersection(h(i),h(M)) = ∑ { ( ) [ ] ( ) [ ] }
= K i
i M h i I h Min
1
, .
Đối với độ đo Max: : Intersection(h(i),h(M)) = ∑ { ( ) [ ] ( ) [ ] }
= K i
i M h i I h Max
1
, .
Matching(h(i),h(M)) =
( ) ( )
( )
( ) [ ] ( ) [ ]
∑ ∑
= =
K i
K i
i M h i I h Max
1 1
,
M h , I h on Intersecti
.
• Đo khoảng cách Euclid:
Đây là cách tính khoảng cách thông thường giữa các K bin.
Intersection(h(i),h(M)) = ∑ ( ( ) ( ) )
= K −
i
M h I h
1
2
Hoặc có thể là:
Intersection(h(i),h(M)) = ∑ ( ( ) [ ] ( ) [ ] )
= K −
i
i M h i I h
1
,
Trong thư viện Opencv có một hàm thực hiên toàn bộ công việc so sánh histogram và trả lại kết quả vào một ảnh khác, đó là: cvMatchTemplate.
Hình 3.26: Kết quả tìm kiếm bằng histogram
Ghi chú 2.3: Thuật toán so sánh histogram để tìm kiếm vật thể được minh họa trong phần “còn trống”.
Như đã trình bày ở trên, nhược điểm của phương pháp tìm kiếm vật thể dựa vào histogram là chỉ có thể áp dụng trong khoảng cách gần. Do phương pháp này đòi hỏi kích thước của ảnh mẫu và vật thể phải bằng nhau, thêm vào đó sự sai khác về màu sắc và độ sáng của ảnh chứa vật thể với ảnh mẫu chỉ có thể nằm trong một giới hạn nhỏ. Phương pháp này có thể được áp dụng cho bước tìm kiếm cuối cùng, khi vật thể đã thể hiện rõ ràng trong ảnh thu được.
3.2.2.2. Bắt màu
Định nghĩa
Bản chất của phương pháp này là tìm kiếm trên ảnh những pixel mang màu sắc giống hoặc gần giống vật thể. Để hạn chế sự ảnh hưởng của điều kiện ánh sáng, việc lọc màu được thực hiện trên không gian màu HSV. Do màu HSV có sự phân biệt giữa màu sắc và ánh sáng. Chẳng hạn vật thể có màu đỏ, khi đó chỉ cần lọc trên ảnh thu được những pixel có độ Hue xấp xỉ 0 (Hình 3 .22).
Ưu điểm của phương pháp này là có thể áp dụng khi khoảng cách tới vật thể xa, thuật toán đơn giản, do đó tốc độ tìm kiếm nhanh. Nhưng nhược điểm của phương pháp này là: Không thể phân biệt được đâu là vật thể và đâu là nhiễu, để hạn chế điều này vật thể chọn làm đối tượng tìm kiếm phải có màu sắc khác biệt với màu sắc của môi trường xung quanh. Một nhược điểm nữa là: độ sáng thay đổi có thể làm thay đổi màu Hue của vật thể, do đó phải chọn vật thể có màu ít phản quang.
Thực hiện
Ảnh chứa vật thể phải chuyển sang mô hình màu HSV, sau đó trích ra khoảng màu tương đồng với vật thể cần tìm kiếm. Giả sử màu cần tìm kiếm có màu đỏ thì cần trích ra những điểm có giá trị Hue sấp xỉ 0.
Hình 3.27: Ảnh thu được sau khi trích màu
Nhiễu là vấn đề trầm trọng trong phương pháp này, do đó cần phải triệt tiêu nhiễu.
Nhận thấy bản chất của nhiễu chính là một vài pixel do sự phản xạ của ánh sáng làm cho chúng có cùng màu với vàu của vật thể cần tìm kiếm. Các pixel này phân bố rời
rạc và có độ tập trung không cao, ngược lại so với vật thể cần tìm kiếm. Do đó có thể sử dụng biện pháp ăn mòn theo đường biên để giảm và triệt tiêu nhiễu này.
Ăn mòn theo đường biên ( erosion ) có thể làm giảm kích thước của tất cả những phần màu trắng (Hình 3 .27), đồng thời làm tăng độ rộng những lỗ trống màu đen nằm giữa vật thể. Hình vẽ bên dưới mô tả quá trình ăn mòn theo đường biên.
Hình 3.28: Ăn mòn theo đường biên Thư viện Opencv có hàm cvErode thực hiện công việc này.
Hình 3.29: Ảnh thu được sau khi bị ăn mòn
Tùy vào độ sâu của việc ăn mòn mà nhiễu có thể bị triệt tiêu hoàn toàn hay là không. Nhưng như đã trình bày việc ăn mòn làm giảm kích thước của vật và làm tăng kích thước của những ô trống, do đó cần phải làm giản nở ( dilation ) ảnh sau khi thực hiện ăn mòn. Công việc này thực chất là ngược lại của việc ăn mòn. Trong Opencv có hàm cvDilate có thể làm được điều này.
Hình 3.30: Ảnh thu được sau khi đà giãn nở
Phương pháp trích lọc màu như trình bày ở trên khá đơn giản nhưng thật sự hiệu quả khi phải tìm kiếm những vật thể ở xa. Nhưng phương pháp này tìm kiếm tất cả những khu vực có màu giống vật thể, không thể phân biệt được đâu là vật cần tìm đâu là vật khác có màu giống như vậy. Do đó trích lọc màu có thể coi như bước tìm kiếm đầu tiên, khi robot còn ở xa vật cần tìm kiếm, cần kết hợp với các kỹ thuật khác để nhận dạng chính xác vật cần tìm, như: tìm kiếm dựa vào hình dạng, dựa vào những đặc điểm đặc trưng…