FilterBySizeAndAngle (Lọc theo Kích thước và góc)
Input: Tập contour Output: Tập contour
Mục đích: dựa trên các tiêu chí về tỉ lệ, góc, kích thước để xác định contour nào có khả năng là biển số, contour nào không phải biển số để loại bỏ bớt trong tập các contour tìm được.
for(int i=0; i < listContour.Count; i++) {
isDel = false; Ratio = h / w if(ratio < 0.6) {
if( h và w không thõa mãn ngưỡng) { remove(i) isdel = true } if(!isdel) {
if(Ratio không thõa mãn ngưỡng) { listContour.remove(i) isdel = true; } } if(!isdel)
if(contour đè lên biên hình) remove(i) if(!isdel) { if { if(angle < -45) if(w > h) remove(i) else if(w < h) remove(i) } } } return listContour;
ScanningLine (Scan theo dòng)
Input: Tập contour Output: Tập contour
Mục đích: Quét trên các dòng cắt để đểm số điểm cắt trên vùng biển số, so sánh với ngưỡng để tìm ra vùng có khả năng là biển số và loại bỏ các vùng không phải biển số.
Xác định vị trí dòng quét của biển số vuông và dài Foreach(Contour in Tập contour)
{
Với mỗi dòng quét, lần lượt xét pixel từ biên trái sang phải If(Pixel thay đổi từ trắng sang đen) Số điểm cắt++
If (biển số vuông)
If (Số điểm cắt < 16 || Số điểm cắt > 40) Remove Contour If biển số dài
If (số điểm cắt < 16 || Số điểm cắt > 50) Remove Contour }
DigitCount (Đếm số ký tự trên vùng Contour)
Output: Tập contour
Mục đích: Với mỗi contour đưa vào hàm, đếm số contour con thõa mãn là ký tự trong contour này. So sánh với ngưỡng để xem contour này có phải là biển số hay không. Các contour con được tìm bằng hàm FindContour và sau đó đưa qua bộ lọc contour để cho ra các contour con có khả năng là ký tự nhất.
for(int i = 0 ; i < listContour.Count; i++) {
image = ExtractImage(listContour[i]) image = OtsuThreshold(image)
List<Contour> list = FindContour(image)
list = FilterContour(list) //Hàm lọc contour if(list.Count < 6 || list.Count > 10) remove(i) }
return listContour;
FilterContour (Lọc các contour con có khả năng là ký tự)
Input: Tập contour Output: Tập contour
Mục đích: Với 1 tập contour con được tìm, lọc theo các tiêu chí về kích thước, tỉ lệ, góc, … để xác định contour nào có khả năng chứa ký tự, contour nào không phải thì loại bỏ. Kết quả của hàm này được sử dụng cho hàm đếm ký tự (DigitCount).
Canny(image) T = FindContour() for(i=0, i < T.Length,i++) { isDel = false; if(!isDel) if(contour.angle > -45)
If(contour.w > contour.h) remove(i) else iF(contour.w < contour.h) remove(i) if(!isDel)
if(biển số vuông)
if(contour.w && contour.h != ngưỡng A) remove(i) else
if(contour.w && contour.h != ngưỡng B) remove(i) if(!isDel)
if(!isDel)
if(contourA overlap contourB)
if(contourA.angle > contourB.angle) remove(contourA) else remove(contourB)
T.Sort()
for(i=0 ; i<T.lenght ; i++)
if(contour(i).h > 20% AvgHeight(All contour) remove(i)
TachKyTu (Tách ký tự)
Input: Tập contour Output: Tập contour
Mục đích: tách các ký tự trong vùng biển số để đưa vào mạng neural nhận dạng
Số ký tự = DemKyTu(ngưỡng Otsu) N = Otsu
if(Số ký tự < 7 || Số ký tự > 9) {
for(ngưỡng = 25; ngưỡng <= 160; ngưỡng +=5) {
Temp = DemKyTu(ngưỡng)
If(temp > Số ký tự && temp <= 9) { Số ký tự = temp N = ngưỡng } } } Return Số ký tự, N
GetContour (Lấy ra Contour đích chứa biển số)
Input: Tập contour Output: Contour
Mục đích: một vùng biển số sẽ có nhiều contour bao lên nó. Các contour này đều thõa mãn là vùng chứa biển số nên hàm này sẽ loại bớt các contour dư thừa và giữ lại 1 contour chứa biển số dựa theo số lượng pixel đen phân bố trên đó.
Min = 9999999 Vị trí = 0;
foreach(contour in ListContour) {
Tỉ lệ pixel đen trắng = PixelCount(contour) If(tỉ lệ pixel đen trắng < Min)
{
Min = Tỉ lệ pixel đen trắng Vị trí = vị trí contour }
}
Return ListContour(vị trí)