CHƯƠNG 2 CƠ SỞ LÝ THUYẾT
2.6 Các phương pháp xử lý cơ bản với một đối tượng ảnh đầu vào
ẢNH ĐẦU VÀO.
2.6.1 Chuyển đổi ảnh màu sang ảnh xám.
Thông thường ảnh được thu về trước khi qua quá trình xử lý là những ảnh màu. Đa số ảnh màu được tao ra bằng việc sử dụng các tổ hợp thích hợp của các cường độ ánh sáng đỏ (RED), xanh lục GREEN) và xanh lam (BLUE). Mỗi điểm ảnh được biểu thị bởi 24bit thông tin (trong tiếng Anh thông thường được biết đến như bits per pixel hay bpp). Nó tương ứng với mỗi 8 bit cho màu đỏ, xanh lá cây và xanh lam, tạo thành một tổ hợp 256 các giá trị có thể, hay 256 mức cường độ cho mỗi màu. Với hệ thống như thế, khoảng 16,7 triệu màu rời rạc có thể tái tạo.
Như vậy tương ứng với một bức khung có độ phân giải HD sẽ chứ 1280 x 720 x 24 = 22.118.400 bit. điều này sẽ gây độ phức tạp rất lớn cho việc xử lý. Vì vậy, ta cần giảm số bit thông tin biểu diễn 1 pixel để việc xử lý thuận tiện hơn bằng cách chuyển đổi từ ảnh màu sang ảnh xám[5].
Trong ảnh xám, mỗi pixel có giá trị 8 bits thông tin. Ở mức này, cấu trúc ảnh vẫn giữ nguyên, giá trị ma trận ảnh đơn giản rất nhiều. Phù hợp với quá trình xử lý chỉ quan tâm đến cấu trúc ảnh mà không cần đến màu sắc ảnh. Công thức tổng quát được sử dụng phổ biến đổi ảnh màu thành ảnh xám là:
P = aCr + bCb + cCg (2.1)
Trên thực tế trong tài liệu phần mềm matlab cung cấp là hàm chuyển đổi ảnh màu sang ảnh xám rbg2gray() có định nghĩa sẵn các trọng số a, b, c cụ thể trong công thức dưới đây:
P = 0.299 * Cr + 0.587 * Cg + 0.114 * Cb (2.2)[14]
Trong đó: Cr, Cb, Cg là các giá trị mức màu R, B, G. Tùy theo mức độ thu nhận ảnh màu gốc hoặc tùy theo các thiết bị thu nhận mà hệ số a, b, c có các giá trị khác nhau sao cho (a+b+c) <=1.
Trên thực tế thường sử dụng 2 công thức dưới đây để chuyển đổi ảnh màu sang ảnh xám
Hình 2.14. Chuyển ảnh màu thành ảnh xám.
Do ảnh đôi khi được chụp ở nơi quá sáng hay quá tối sẽ làm cấu trúc ảnh sau khi chuyển đổi thành ảnh xám sẽ không rõ ràng, để có thể làm nổi bật cấu trúc ảnh lên. Ta có thể dựa vào lược đồ xám để điều chỉnh đô tương phản giúp ảnh rõ hơn. Vậy là lược đồ xám là gì?
Lược đồ xám: Là một biểu đồ với trục tung là mức xám, trục hoành là các pixel. Lược đồ này biểu diễn tần suất xuất hiện của các mức xám trên ảnh.
Hình 2.15. Lược đồ xám.
Điều này rất cần thiết cho việc nhận dạng ảnh, nhất là với các ảnh chứa nhiều chi tiết thì lại càng quan trọng.
2.6.2 Nhị phân hóa ảnh.
Đây là cách biến đổi các giá trị pixel của ảnh sang giá trị nhị phân (đơn giản nhất) 0 hoặc 1 Khi đó ma trận ảnh sẽ ở mức tối thiểu giá trị giúp việc xử lý đơn giản nhất nhưng đôi khi gây sai lệch cấu trúc ảnh (do các đường viền khác biệt nhỏ dễ bị đồng hóa). Đây chỉ là bước xử lý cho các ảnh có ít chi tiết.
Để nhị phân hóa ảnh, ta dựa vào ngưỡng xám trung bình, nếu lớn hơn thì đưa giá trị về 1, nhỏ hơn thì đưa về 0 (thực chất là mức 0 và 255 thể hiện 2 màu đen và trắng).
2.6.3 Các phương pháp lọc nhiễu ảnh nhằm cải thiện ảnh.
Hình ảnh sau khi thu nhận cần qua một bước tiền xử lý và lọc ảnh, đây là công đoạn gần như bắt buộc bởi ảnh nhận được hầu hết đều có nhiễu, mờ... nên cần loại bỏ nhiễu và làm rõ nét hơn để cho ảnh có chất lượng tốt để đem sử dụng. Các kỹ thuật tăng cường ảnh được phân nhóm theo công dụng: làm trơn nhiễu, nổi biên. Để làm trơn nhiễu hay tách nhiễu, người ta sử dụng các bộ lọc tuyến tính (lọc trung bình, thông thấp) hay lọc phi tuyến (trung vị, giả trung vị, lọc đồng hình). Từ bản chất của nhiễu (thường tương ứng với tần số cao) và từ cơ sở lý thuyết lọc là: bộ lọc chỉ cho tín hiệu có tần số nào đó thông qua do đó, để lọc nhiễu người ta thường dùng lọc thông thấp (theo quan điểm tần số không gian) hay lấy tổ hợp tuyến tính để san bằng (lọc trung bình). Để làm nổi cạnh (ứng với tần số cao), người ta dùng các bộ lọc thông cao, lọc Laplace.
Trên thực tế tồn tại nhiều loại nhiễu; tuy nhiên người ta thường xem xét 3 loại nhiễu chính: nhiễu cộng, nhiễu nhân và nhiễu xung:
Nhiễu cộng thường phân bố khắp ảnh. Nếu gọi ảnh quan sát (ảnh thu được) là Xqs, ảnh gốc là Xgốc, nhiễu là η, ảnh thu được có thể biểu diễn bởi:
Xqs = Xgốc + η (2.3)
Nhiễu nhân thường phân bố khắp ảnh và ảnh thu được sẽ biểu diễn với công thức:
Xqs = Xgốc * η (2.4)
Nhiễu xung thường gây đột biến tại một số điểm ảnh.
2.6.4 Làm trơn nhiễu bằng lọc tuyến tính.
Do có nhiều loại nhiễu can thiệp vào quá trình xử lý ảnh nên cần có nhiều bộ lọc thích hợp. Với nhiễu cộng và nhiễu nhân ta dùng các bộ lọc thông thấp, trung bình và lọc đồng hình (Homomorphie); với nhiễu xung ta dùng lọc trung bị, giả trung vị, lọc ngoài (Outlier)
a) Lọc trung bình không gian.
lọc (ma trận 3x3) quét qua lần lượt từng điểm ảnh của ảnh đầu vào input. Tại vị trí mỗi điểm ảnh lấy giá trị của các điểm ảnh tương ứng trong vùng 3x3 của ảnh gốc "lấp" vào ma trận lọc. Giá trị điểm ảnh của ảnh đầu ra là giá trị trung bình của tất cả các điểm ảnh trong cửa sổ lọc. Việc tính toán này khá đơn giản với hai bước gồm tính tổng các thành phần trong cửa sổ lọc và sau đó chia tổng này cho số các phần tử của cửa sổ lọc.
Với lọc trung bình, mỗi điểm ảnh được thay thế bằng trung bình trọng số của các điểm lân cận và được mô tả theo công thức sau:
v(m,n) = ∑ ∑( , ) ( − , − ) (2.5)
Với: y(m, n): ảnh đầu vào. v(m, n): ảnh đầu ra. a(k, l) : là cửa sổ lọc.
với ak,l = và Nw là số điểm ảnh trong cửa sổ lọc W. Ví dụ về bộ lọc trung bình.
Hình 2.17. Ví dụ bộ lọc trung bình. Nhận xét về bộ lọc trung bình.
Bộ lọc trung bình lam mịn các sai khác địa phương bên trong ảnh, do đó nó bản chất là một bộ lọc thông thấp.
Nó có thể được thực hiện với một mặt nạ cuộn trong đó tất cả các hệ số đều bằng 1/N. Bộ lọc này sẽ có khuynh hướng làm nhèo ảnh trong khi làm giảm bớt hiệu ứng của nhiễu.
Có thể thấy rằng kích thước mặt nạ càng lớn, thì hiệu ứng nhòe càng rõ rệt.
Kiểu bộ lọc này làm việc tốt nhất với các loại nhiễu Gauss và nhiễu phân bố đều.
b) Lọc thông thấp.
Lọc thông thấp thường được sử dụng để làm trơn nhiễu. Về nguyên lý của bộ lọc thông thấp giống như đã trình bày trên. Trong kỹ thuật này người ta hay dùng một số nhân chập có dạng sau: = 0 1 0 1 2 1 0 1 0 = ( ) 1 1 1 1
Ta dễ dàng nhận thấy khi b =1, Hb chính là nhân chập Ht1 (lọc trung bình). Để hiểu rõ hơn bản chát khử nhiễu cộng của các bộ lọc này, ta viết lại phương trình thu nhận ảnh dưới dạng:
Xqs [m, n] = Xgốc[m,n] + η[m,n] (2.6)
Trong đó: η[m, n] là nhiễu cộng có phương sai σ2n. Như vậy, theo cách tính của lọc trung bình ta có:
Y[ , ] = ∑ ∑ , ∈ (m-k, n-l)+η[ , ] (2.7)
Hay: Y[ , ] = ∑ ∑ . ∈
Như vậy, nhiễu cộng trong ảnh đã giảm đi Nw lần.
c) Lọc đồng hình (Homomorphie Filter)
Kỹ thuật lọc này hiệu quả với ảnh có nhiễu nhân. Thực tế, ảnh quan sát được gồm ảnh gốc nhân với một hệ số nhiễu. Gọi X (m, n) là ảnh thu được, X(m, n) là ảnh gốc và η(m, n) là nhiễu, như vậy:
X(m, n) = X (m, n) * η(m, n ) (2.8)
Lọc đồng hình thực hiện lấy logarit của ảnh quan sát. Do vậy ta có kết quả sau:
Rõ ràng, nhiễu nhân có trong ảnh sẽ bị giảm. Sau quá trình lọc tuyến tính, ta chuyển về ảnh cũ bằng phép biến đổi hàm e mũ.
2.6.5 Làm trơn nhiễu bằng lọc phi tuyến.
Các bộ lọc phi tuyến cũng hay được dùng trong kỹ thuật tăng cường ảnh. Trong kỹ thuật này, người ta dùng bộ lọc trung vị, giả trung vị, lọc ngoài. Với lọc trung vị, điểm ảnh đầu vào sẽ được thay thế bởi trung vị các điểm ảnh còn lọc giả trung vị sẽ dùng trung bình cộng của 2 giá trị “trung vị” (trung bình cộng của max và min).
d) Lọc trung vị
Trung vị được viết với công thức:
V(m, n) = Trungvi( ) y(m – k, n – l) với {k, l} ∈W (2.10)
Kỹ thuật này đòi hỏi giá trị các điểm ảnh trong cửa sổ phải xếp theo thứ tự tăng hay giảm dần so với giá trị trung vị. Kích thước cửa số thường được chọn sao cho số điểm ảnh trong cửa số là lẻ. Các cửa sổ hay dùng là cửa sổ có kích thước 3x3, hay 5x5 hay 7x7.
Tính chất của lọc trung vị:
Lọc trung vị là loại lọc phi tuyến. Điều này dẽ nhận thấy từ:
Trungvi(x(m)+y(m)) ≠ Trungvi(x(m)) + Trungvi(y(m)). (2.11)
Có lợi cho việc loại bỏ các điểm ảnh hay các 24ang mà vẫn bảo toàn độ phân giải.
Hiệu quả giảm khi số điểm trong cửa sổ lớn hay bằng một nửa số điểm trong cửa sổ.
Điều này dễ giải thích vì trung vị là (Nw+1)/2 giá trị lớn nhất nếu Nw lẻ. Lọc trung vị cho trường hợp 2 chiều coi như lọc trung vị tách được theo từng chiều.
2.6.6 Phân vùng ảnh:
Phân vùng ảnh là một quá trình chia một bức ảnh số thành nhiều phần khác nhau (tập hợp các điểm ảnh, hay có thể gọi là superpixels). Mục tiêu của phân vùng ảnh là để đơn giản hóa và hoặc thay đổi biểu diễn của một tấm ảnh vào
sử dụng để xác định vị trí các đối tượng, đường biên (đường thẳng, cong, …) Hay nói cách khác phân vùng ảnh là một quá trình gán nhãn (assigning a lablel) cho mỗi điểm ảnh trong một bức ảnh, các điểm ảnh trong cùng một nhãn sẽ có những đặc tính giống nhau về màu sắc, cường độ hoặc kết cấu của ảnh.
Kết quả của việc phân vùng ảnh là tập hợp các phân đoạn (segments) bao gồm có thể là toàn bộ bức ảnh hoặc tập hợp các đường biên chiết xuất từ hình ảnh. Các điểm ảnh trong cùng một vùng có đặc tính tương tự nhau về màu sắc, cường độ hoặc kết cấu. Các vùng lân cận thì khác nhau đáng kể về các đặc trưng trên.
Phân vùng ảnh là một bước quan trọng trong nhiều lĩnh vực khác nhau như lĩnh vực hình ảnh y tế (medical imaging), phát hiện và nhận dạng đối tượng, hệ thống camera giám sát, hệ thống điều khiển giao thông, … Kỹ thuật này là bước tiền xử lý quan trọng trong hầu hết các hệ thống xử lý ảnh, kết phân vùng tốt sẽ giúp cho quá trình xử lý về sau đạt hiệu quả cao hơn nhằm tiết kiệm về chi phí tính toán, thời gian cũng như tăng độ chính xác của các ứng dụng trên.
2.7 CÁC HÀM CƠ BẢN ĐƯỢC SỬ DỤNG TRONG QUA TRÌNH PHÁT HIỆN VÀ ĐẾM SỐ LƯỢNG PHƯƠNG TIỆN TRONG ĐỀ TÀI[3].
2.7.1 Hàm imread().
Lệnh imread() sẽ đọc một file thành một ma trận. Matlab trợ giúp rất nhiều định dạng đồ hoạ thông dụng chẳng hạn: BMP, GIF, JPEG, PNG, TIFF … Để biết thêm các kiểu gọi hàm và tham số truyền vào, xem trợ giúp online của Matlab.Kết quả trả về của hàm imread() là một ma trận có cùng kích thước với ảnh đầu vào
2.7.2 Hàm imshow() và imagesc().
Để hiển thị hình ảnh trong matlab ta dùng 2 lệnh sau imshow() và imagesc(). Lệnh imshow () cho chúng ta một hình ảnh trong định dạng tiêu chuẩn là 8-bit, giống như trong một trình duyệt web. Lệnh imagesc () hiển thị các hình ảnh trên các trục đồ thị với giá trị min là màu đen và giá trị tối đa là màu trắng.
Ví dụ:
img = imread('ImageProcessing_1/BerkeleyTower.png'); imshow(img);
imagesc(img);
Kết quả sau khi chạy code.
Hình 2.18.Hiển thị ảnh bằng hàm imshow()
Hình 2.19 Hiển thị ảnh bằng hàm imagesc()
2.7.3 Hàm rgb2gray().
Lệnh rgb2gray() chuyển đổi hình ảnh RGB thành trắng đen bằng cách loại bỏ các thông tin màu sắc và độ bão hòa nhưng vẫn giữ độ sáng.
Ví dụ:
img = imread('ImageProcessing_1/BerkeleyTower.png');
gray = rgb2gray(img); imshow(gray);
Hình 2.20.Chuyển đổi ảnh màu thành ảnh xám.
2.7.4 Hàm imadjust()
Lệnh imadjust() điều chỉnh giá trị cường độ hình ảnh. Câu lệnh này làm tăng độ tương phản của hình ảnh đầu ra
Ví dụ: img = imread('BerkeleyTower.png'); gray = rgb2gray(img); adj_img = imadjust(gray); subplot(121); imshow(gray); subplot(122); imshow(adj_img);
Kết quả sau khi chạy code.
2.7.5 Hàm tự tính ngưỡng để chuyển sang ảnh nhị phân graythresh(), và hàm chuyển đổi ảnh nhị phânimbinarize(). hàm chuyển đổi ảnh nhị phânimbinarize().
Bằng cách so sánh giá trị điểm ảnh với một ngưỡng T cố định. Nếu giá trị điểm ảnh lớn hơn T thì gán điểm ảnh màu trắng và ngược lại. Trong phần mềm matlab có hỗ trợ lệnh graythresh() với đầu với là 1 ảnh xám và trả về một hằng
số T phục vụ cho quá trinh chuyển đổi ảnh nhị phân qua hàm imbinarize(). Ví dụ: img = imread('BerkeleyTower.png'); gray = rgb2gray(img); T = graythresh(gray) binary_img = imbinarize(gray,T); subplot(121); imshow(gray); subplot(122); imshow(binary_img);
Kết quả sau khi chạy code.
Hình 2.22. Chuyển đổi ảnh xám sang ảnh nhị phân.
2.7.6 Hàm imdilate()
Lệnh imdilate() là lệnh thao tác giãn nở/ phình to các đối tượng ảnh. Ví dụ:
A= imread('text.png'); B = strel('line',11,90); A1 = imdilate(BW,B);
figure; imshow(A), title('Original') figure; imshow(A1), title('Dilated')
B chính là nhân tạo hình. Trong Matlab, chương trình cũng cung cấp cho ta nhiều nhân tạo hình khác nhau, để biết thêm chi tiết gõ help strel.
Hình 2.23. Ảnh đầu vào.
Hình 2.24. Ảnh sau khi giản nở.
2.7.7 Hàm imerode()
Lệnh imerode() có chưc năng làm xói mòn/ co hẹp các đối tượng ảnh đơn sắc.
A = imread('text.png'); B = strel('line',11,90); A2= imerode(A,B);
Cũng giống như hàm imdilate(). B đóng vai trò là nhân tạo hình.
Hình 2.25. Ảnh đầu vào.
Hình 2.26. Ảnh sau khi xói mòn.
2.7.8 Hàm bwareaopen().
Lệnh bwareaopen() dùng để xóa các đối tượng nhỏ có số lượng pixel nhỏ hơn mong muốn để lấy được các đướng tượng cần phân tích.
A= imread('text.png'); A2 = bwareaopen(A, 50); imshowpair(A,A2,'montage')
Hình 2.27. So sánh ảnh gốc và ảnh sau khi xử lý bằng hàm bwareaopen()
2.7.9 Hàm bwlable
Lệnh bwlable có chức năng gắn nhãn các thành phần được kết nối trong hình ảnh nhị phân. Ví dụ: BW = logical 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 0 L = bwlabel(BW,4) L = 1 1 1 0 0 0 0 0 1 1 1 0 2 2 0 0 1 1 1 0 2 2 0 0 1 1 1 0 0 0 3 0 1 1 1 0 0 0 3 0 1 1 1 0 0 0 3 0 1 1 1 0 0 3 3 0
Chương 3. TÍNH TOÁN VÀ THIẾT KẾ. 3.1 GIỚI THIỆU. 3.1 GIỚI THIỆU.
Mục tiêu của đồ án: thiết kế được mô hình và giao diện chương trình trên matlab đếm đối tượng từ ảnh đầu vào. Đếm đối tượng bằng cách xử lý lý ảnh đầu vào bằng các phương pháp, thuật toán khác nhau như đã nêu ở chương 2 để đưa ra được kết quả là số đối tượng cụ thể có trong ảnh. Cuối cùng truyền tín hiệu điều khiển xuống Arduino để điều khiển tín hiệu đèn giao thông phù hợp với đối tượng đếm được.
3.2 TÍNH TOÁN VÀ THIẾT KẾ HỆ THỐNG3.2.1 Thiết kế sơ đồ khối hệ thống. 3.2.1 Thiết kế sơ đồ khối hệ thống.
Hình 3.1. Sơ đồ khối hệ thống. Chức năng của từng khối:
Khối ảnh đầu vào: Ảnh được camera đặt trên mỗi trục đường mở mỗi ngã Ảnh đầu vào Bộ xử lý ảnh đầu vào (máy tính) Bộ điều khiển (arduino) Hiển thị (đèn giao thông)
Người tham gia giao thông
được chụp dưới định dạng file đuôi .PNG, .JPEG, .PEG, …để thuận tiện cho việc truyền dữ liệu xuống bộ xử lý ảnh đầu vào (máy tính).
Bộ xử lý ảnh đầu vào (máy tính): Máy tính sẽ thu nhận tín hiệu hình ảnh từ camera để làm dữ liệu ảnh đầu vào cho bộ xử lý ảnh. Bộ xử lý ảnh cụ thể là phần mềm Matlab sẽ phân tích và xử lý hình ảnh để đưa ra kết quả tổng số lượng phương tiện tham gia trên mỗi tuyến đường.