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”.
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 K i i M h i I h Min 1 , .
Đối với độ đo Max: : Intersection(h(i),h(M)) = ∑ { ( )[ ] ( )[ ]}
=K 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…