Đầu tiên, em xin giới thiệu sơ lược về khái niệm mà em đang sử dụng để phát hiện biển số. Có ba chương trình hoặc file ‘.m’ cho đề tài này.
Template Creation (template_creation.m) - Điều này được sử dụng để gọi các hình ảnh đã lưu của chữ và số và sau đó lưu chúng dưới dạng một mẫu mới trong bộ nhớ MATLAB.
Letter Detection (Letter_detection.m) - Đọc các ký tự từ hình ảnh đầu vào và tìm chữ và số tương ứng phù hợp nhất.
Plate Detection (Plate_detection.m) – Xử lý hình ảnh và sau đó gọi hai file .m ở trên để phát hiện số.
Hình 3. 10 Giải thuật cho hệ thống nhận diện biển số xe
3.5.1 Template Creation
Đầu tiên tạo một thư mục cho đề tài (tên thư mục của em là Number Plate Detection) để lưu và lưu trữ các tệp. Em đã lưu trữ các hình ảnh nhị phân của tất cả các bảng chữ cái và số trong thư mục con có tên là 'alpha'. Bây giờ, hãy mở cửa sổ Trình chỉnh sửa trong MATLAB, như được hiển thị trong hình ảnh bên dưới,
Hình 3. 11 Template creation
Sao chép và dán đoạn mã dưới đây vào tệp template_creation.m và lưu tệp trong thư mục dự án (Phát hiện Biển số).
%Alphabets A=imread('alpha/A.bmp');B=imread('alpha/B.bmp');C=imread('alpha/C.bmp'); D=imread('alpha/D.bmp');E=imread('alpha/E.bmp');F=imread('alpha/F.bmp'); G=imread('alpha/G.bmp');H=imread('alpha/H.bmp');I=imread('alpha/I.bmp'); J=imread('alpha/J.bmp');K=imread('alpha/K.bmp');L=imread('alpha/L.bmp'); M=imread('alpha/M.bmp');N=imread('alpha/N.bmp');O=imread('alpha/O.bmp'); P=imread('alpha/P.bmp');Q=imread('alpha/Q.bmp');R=imread('alpha/R.bmp'); S=imread('alpha/S.bmp');T=imread('alpha/T.bmp');U=imread('alpha/U.bmp'); V=imread('alpha/V.bmp');W=imread('alpha/W.bmp');X=imread('alpha/X.bmp'); Y=imread('alpha/Y.bmp');Z=imread('alpha/Z.bmp'); %Natural Numbers one=imread('alpha/1.bmp');two=imread('alpha/2.bmp'); three=imread('alpha/3.bmp');four=imread('alpha/4.bmp'); five=imread('alpha/5.bmp'); six=imread('alpha/6.bmp'); seven=imread('alpha/7.bmp');eight=imread('alpha/8.bmp'); nine=imread('alpha/9.bmp'); zero=imread('alpha/0.bmp'); %Creating Array for Alphabets
letter=[A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]; %Creating Array for Numbers
number=[one two three four five six seven eight nine zero]; NewTemplates=[letter number];
save ('NewTemplates','NewTemplates') clear all
Hình 3. 12 Đoạn mã lưu hình ảnh
Ở đây, trong đoạn mã trên, ta đang lưu các hình ảnh vào một biến bằng cách sử dụng lệnh ‘imread () '. Chức năng này được sử dụng để gọi hình ảnh từ thư mục hoặc từ bất kỳ vị trí nào của PC vào MATLAB. Hãy lấy một ví dụ từ đoạn mã trên:
A=imread('alpha/A.bmp');
Trong đó A là biến và trong ‘alpha / A.bmp’, ‘alpha’ là tên thư mục và ‘A.bmp’ là tên tệp. Sau đó, tạo một ma trận gồm ‘chữ cái’ và ‘số’ và lưu nó trong biến ‘NewTemplates’ bằng cách sử dụng lệnh ‘save (tên tệp, biến)’.
%Creating Array for Alphabets
letter=[A B C D E F G H I J K L M N O P Q R S T U V W X Y Z];
%Creating Array for Numbers
NewTemplates=[letter number]; save ('NewTemplates','NewTemplates') clear all
Bây giờ hãy bắt đầu viết mã Letter_detection.m, trong một cửa sổ soạn thảo mới.
3.5.2 Letter Detection
Ở đây em đang tạo tệp mã thứ hai có tên là Letter_detection.m. Bây giờ, sao chép và dán đoạn mã dưới đây vào tệp đó và lưu tệp trong thư mục dự án với tên Letter_detection. function letter=readLetter(snap) load NewTemplates snap=imresize(snap,[42 24]); rec=[ ]; for n=1:length(NewTemplates) cor=corr2(NewTemplates{1,n},snap); rec=[rec cor]; end ind=find(rec==max(rec)); display(find(rec==max(rec))); % Alphabets listings. if ind==1 || ind==2 letter='A';
elseif ind==3 || ind==4 letter='B';
elseif ind==5 letter='C'
elseif ind==6 || ind==7 letter='D'; elseif ind==8 letter='E'; elseif ind==9 letter='F'; elseif ind==10 letter='G'; elseif ind==11 letter='H'; elseif ind==12 letter='I'; elseif ind==13 letter='J'; elseif ind==14 letter='K'; elseif ind==15
letter='L'; elseif ind==16 letter='M'; elseif ind==17 letter='N';
elseif ind==18 || ind==19 letter='O';
elseif ind==20 || ind==21 letter='P';
elseif ind==22 || ind==23 letter='Q';
elseif ind==24 || ind==25 letter='R'; elseif ind==26 letter='S'; elseif ind==27 letter='T'; elseif ind==28 letter='U'; elseif ind==29 letter='V';
elseif ind==30 letter='W'; elseif ind==31 letter='X'; elseif ind==32 letter='Y'; elseif ind==33 letter='Z'; %*-*-*-*-* % Numerals listings. elseif ind==34 letter='1'; elseif ind==35 letter='2'; elseif ind==36 letter='3';
elseif ind==37 || ind==38 letter='4';
elseif ind==39 letter='5';
letter='6'; elseif ind==43 letter='7';
elseif ind==44 || ind==45 letter='8';
elseif ind==46 || ind==47 || ind==48 letter='9';
else
letter='0'; end
end
Ở đây, trong đoạn mã hình 3.13, ta đã tạo một hàm có tên là ký tự cung cấp cho ta kết quả đầu ra là chữ và số của hình ảnh đầu vào từ lớp ‘alpha’ bằng cách sử dụng lệnh ‘readLetter () '. Và sau đó tải các mẫu đã lưu bằng cách sử dụng lệnh tải ‘NewTemplates.
Sau đó, em đã thay đổi kích thước hình ảnh đầu vào để nó có thể được so sánh với hình ảnh của mẫu bằng cách sử dụng lệnh 'imresize (tên tệp, kích thước)'. Sau đó, vịng lặp for được sử dụng để so sánh hình ảnh đầu vào với mọi hình ảnh trong mẫu để có được sự phù hợp nhất.
Ma trận ‘rec’ được tạo để ghi lại giá trị tương quan cho từng mẫu chữ và số với mẫu ký tự từ hình ảnh đầu vào, như được hiển thị trong đoạn mã dưới đây,
Sau đó, lệnh 'find ()' được sử dụng để tìm chỉ mục tương ứng với ký tự được so khớp cao nhất. Sau đó, theo chỉ mục đó, ký tự tương ứng được in bằng câu lệnh‘if- else '.
Bây giờ, sau khi hoàn thành, hãy mở một cửa sổ soạn thảo mới để bắt đầu mã cho chương trình chính.
3.5.3 Number Plate Detection
Đây là tệp mã thứ ba và cuối cùng có tên là Plate_detection.m, hãy sao chép và dán đoạn mã dưới đây vào tệp này và lưu vào thư mục dự án.
close all; clear all;
im = imread(' Number Plate Images/ image1.png'); imgray = rgb2gray(im);
imbin = imbinarize(imgray); im = edge(imgray, 'prewitt');
%Below steps are to find location of number plate Iprops=regionprops(im,'BoundingBox','Area', 'Image'); area = Iprops.Area; count = numel(Iprops); maxa= area; boundingBox = Iprops.BoundingBox; for i=1:count if maxa<Iprops(i).Area maxa=Iprops(i).Area;
boundingBox=Iprops(i).BoundingBox; end end im = imcrop(imbin, boundingBox); im = bwareaopen(~im, 500); [h, w] = size(im); imshow(im); Iprops=regionprops(im,'BoundingBox','Area', 'Image'); count = numel(Iprops); noPlate=[]; for i=1:count ow = length(Iprops(i).Image(1,:)); oh = length(Iprops(i).Image(:,1)); if ow<(h/2) & oh>(h/3)
letter=Letter_detection(Iprops(i).Image); noPlate=[noPlate letter]
end end
Các lệnh cơ bản được sử dụng trong đoạn mã hình 3.14 được đề cập gồm: imread() - Lệnh này được sử dụng để mở hình ảnh vào MATLAB từ thư mục đích.
rgb2gray() - Lệnh này được sử dụng để chuyển đổi hình ảnh RGB sang định dạng thang độ xám.
Hình 3. 14 Đoạn mã Plate detection
imbinarize() - Lệnh này được sử dụng để Binarize hình ảnh thang độ xám 2-D hoặc đơn giản ta có thể nói nó chuyển đổi hình ảnh thành định dạng đen trắng.
edge() - Lệnh này được sử dụng để phát hiện các cạnh trong hình ảnh, bằng cách sử dụng các phương pháp khác nhau như Roberts, Sobel, Prewitt và nhiều phương pháp khác.
regionprops() - Lệnh này được sử dụng để đo các thuộc tính của vùng ảnh. numel() - Lệnh này dùng để tính số phần tử của mảng.
imcrop() - Lệnh này được sử dụng để cắt hình ảnh theo kích thước đã nhập. bwareaopen() - Lệnh này được sử dụng để xóa các đối tượng nhỏ khỏi ảnh nhị phân.
Bằng cách sử dụng các lệnh trên trong mã, em đang gọi hình ảnh đầu vào và chuyển đổi nó thành thang độ xám. Sau đó, thang độ xám được chuyển đổi thành ảnh nhị phân và cạnh của ảnh nhị phân được phát hiện bằng phương pháp Prewitt.
- Kỹ thuật sử dụng 2 mặt nạ nhập chập xấp xỉ đạo hàm theo hai hướng 2 và y là:
Bước 1: Tính và Bước 2: Tính +
- Ngoài ra để phát hiện biên theo đường chéo ta sử dụng mặt nạ:
;
Sau đó, mã dưới đây được sử dụng để phát hiện vị trí của biển số trong tồn bộ hình ảnh đầu vào, Iprops=regionprops(im,'BoundingBox','Area', 'Image'); area = Iprops.Area; count = numel(Iprops); maxa= area; boundingBox = Iprops.BoundingBox; for i=1:count if maxa<Iprops(i).Area maxa=Iprops(i).Area; boundingBox=Iprops(i).BoundingBox; end
end
Sau đó, cắt biển số và xóa các đối tượng nhỏ khỏi ảnh nhị phân bằng cách sử dụng lệnh ‘imcrop () 'và‘ bwareaopen ()' tương ứng.
Sau đó, đoạn mã dưới đây được sử dụng để xử lý hình ảnh biển số xe bị cắt đó và hiển thị số được phát hiện ở định dạng hình ảnh và văn bản (trong cửa sổ lệnh).
Iprops=regionprops(im,'BoundingBox','Area', 'Image'); count = numel(Iprops); noPlate=[]; for i=1:count ow = length(Iprops(i).Image(1,:)); oh = length(Iprops(i).Image(:,1)); if ow<(h/2) & oh>(h/3)
letter=Letter_detection(Iprops(i).Image); noPlate=[noPlate letter]
end end
Hình 3. 15 Lưu hình ảnh nhị phân
Trong tệp template_creation.m, em đã thiết kế mã để lưu tất cả các hình ảnh nhị phân của chữ và số vào một thư mục hoặc tệp có tên là 'NewTemplates'. Sau đó, thư mục đó được gọi trong Letter_detection.m có thể thấy hình 3.15.
Sau đó, trong tệp mã Plate_detection.m, tệp mã Letter_detection.m được gọi khi em xử lý hình ảnh như trong hình dưới đây,
Hình 3. 16 Xử lý hình ảnh
Bây giờ, hãy nhấp vào nút ‘RUN’ để chạy file .m
Hình 3. 17 Chạy file
MATLAB có thể mất vài giây để phản hồi, hãy đợi cho đến khi nó hiển thị thơng báo bận ở góc dưới bên trái như hình dưới đây,
Hình 3. 18 Thơng báo bận
Khi chương trình bắt đầu, ta sẽ nhận được cửa sổ bật lên hình ảnh biển số và số trong cửa sổ lệnh