車牌識別之顏色選取

車牌定位是車牌識別中第一步,也是最重要的一步。

由于中國車牌種類多樣,顏色不一, 再加上車牌經常有污損,以及車牌周圍干擾因素太多,都成為了車牌定位的難點。

這里首先使用最簡單算法來描述車牌定位,以及他的缺陷和改進。

一、投影法

1、車輛圖像信息獲取


2、HSV顏色轉換

把RGB數據轉換成HSV空間圖像數據

hsvzation(image,hsv,width,height);


3、HSV顏色過濾

設置藍色車牌底色閾值范圍,進行顏色過濾

藍色車牌

H值范圍:190 ~ 245

S值范圍: 0.35 ~ 1

V值范圍: 0.3 ~ 1

過濾后圖像如下:



4、噪聲處理

過濾后,一般要進行去噪處理,這里早點不明顯,如果車牌周圍有藍色物體,噪點就非常明顯了

這里使用平均去噪,一些孤立白點將被去除,效果如下:



5、邊緣檢測

去噪后,進行邊緣檢測,邊緣檢測的目的就是為了突出車牌信息的突變,因為車牌背景和字體顏色區分開了;

這樣做的目的也是為了防止周圍有和車牌底色相同顏色的物體干擾,尤其是車輛顏色,因為經過邊緣檢測后車體顏色沒有那么多跳變干擾或者與車牌跳變規律不一樣,這樣就可以濾去車體顏色,去除干擾



6、確定車牌位置

通過水平投影和垂直投影確定車牌位置。

這里投影方法有很大缺陷,在車牌周圍除了車輛還有其他背景信息時尤為明顯,這在下面的另一種方法中改善



7、截取車牌圖像



二、投影法定位缺陷示例

1、讀取復雜背景的車牌圖像



2、HSV濾波

HSV過濾后可以看到明顯的干擾信息,車輛后面的欄桿,和車輛同樣的顏色



3、均值去噪

去噪后,雖然大部分噪點都去除了,但是欄桿依然清晰



4、邊緣檢測

邊緣檢測后的圖像,車牌區域的形狀特征,給我們解決投影缺陷的一些啟示



5,、 投影后錯誤的定位



6、車牌提取錯誤

后半塊車身,比例也不符合車牌特征



由此看見,在復雜背景的車牌識別中,全局投影就無法抑制干擾,在下面黃色車牌示例中就更加明顯;

投影法簡單,但只是在只有整體車輛信息,沒有復雜背景信息的時候才可以使用。


三、基于候選區域判斷方法

這個方法放棄了投影,直接遍歷整個圖像信息,檢查每個聯通域的長度和寬度,當符合車牌的寬高比時,才選定為候選區域,由后面處理流程進行處理,來判斷是否能夠提取正常的字符。


前兩個步驟還是同上面一樣的。

1、HSV空間轉換


2、均值去噪



3、水平膨脹

目的:盡可能的形成連通域



4、邊緣檢測

也可以不用邊緣檢測,這里主要考慮到 盡量減少 圖像白點 遍歷中的運算



5、候選區域篩選

候選區域篩選,?這是區別投影方法的主要部分,

從上圖可以看出有幾個候選區域,大概有4塊, 而中間的車牌有明顯矩形特征,符合一定的長寬比例, 其他三塊區域不具備這樣的特征,在篩選的過程中予以舍棄。

篩選的方法采用 深度優先遍歷, 當遇到連通域時,記錄他的長度和高度,并設定閾值,當符合長寬比時,才會選中為候選區域,否則予以舍棄,當然還可以添加別的算法,比如檢測跳變,畢竟符合這一比率的不一定就是車牌區域。

下圖中黃框就是篩選后的區域:



連通域篩選函數如下:

[cpp]?view plaincopy
  1. int?find_connected_region_location(struct?BMP_img?*img,?unsigned?char?*src,?int?xthreashold,?int?ythreashold,?float?rateLow,?float?rateHigh)??
  2. {??
  3. ????int?i,j;??
  4. ????int?x1,?y1,?x2,?y2;??
  5. ????int?width;??
  6. ????int?height;??
  7. ????unsigned?char?*temp;??
  8. ????//int?queue_count;??
  9. ????int?head,?rear;??
  10. ????struct?XY_Queue?*queue;??
  11. ????static?int?direction[4][2]={{1,?0},?{-1,?0},?{0,?1},?{0,?-1}};??
  12. ??
  13. ????width?=?img->width;??
  14. ????height?=?img->height;??
  15. ??
  16. ????queue?=?(struct?XY_Queue?*)malloc(sizeof(struct?XY_Queue)?*?width?*?height);??
  17. ??
  18. ????temp?=?(unsigned?char?*)malloc(width?*?height?*?sizeof(unsigned?char));??
  19. ??
  20. ????if(temp?==?NULL)??
  21. ????{??
  22. ????????printf("find_connected_region_location?mem?alloc?fail\n");??
  23. ????????return?-1;??
  24. ????}??
  25. ????memcpy(temp,?src,?width?*?height);??
  26. ??
  27. ????head?=?rear?=?0;??
  28. ????img->region_num?=?0;??
  29. ??
  30. ????for(i?=?0;?i?<?height;?i++)??
  31. ????????for(j?=?0;?j?<?width;?j++)??
  32. ????{??
  33. ????????if(temp[i?*?width?+?j]?==?255)??
  34. ????????{??
  35. ??????????????????????
  36. ????????????queue[rear].x?=?j;??
  37. ????????????queue[rear].y?=?i;??
  38. ????????????rear?++;??
  39. ????????????temp[i?*?width?+?j]?=?0;??
  40. ??
  41. ????????????img->pre_region[img->region_num].x1?=?j;??
  42. ????????????img->pre_region[img->region_num].x2?=?j;??
  43. ????????????img->pre_region[img->region_num].y1?=?i;??
  44. ????????????img->pre_region[img->region_num].y2?=?i;??
  45. ??
  46. ????????????if(img->region_num?>?CAN_REGION_NUM)??
  47. ????????????{??
  48. ????????????????printf("over?the?CAN_REGION_NUM\n");??
  49. ????????????????return?-1;??
  50. ????????????}??
  51. ??
  52. ????????????while(head?<?rear)??
  53. ????????????{??
  54. ????????????????x1?=?queue[head].x;??
  55. ????????????????y1?=?queue[head].y;??
  56. ????????????????head?++;??
  57. ??
  58. ????????????????if(x1?<?img->pre_region[img->region_num].x1)??
  59. ????????????????????img->pre_region[img->region_num].x1?=?x1;??
  60. ????????????????else?if(x1?>?img->pre_region[img->region_num].x2)??
  61. ????????????????????img->pre_region[img->region_num].x2?=?x1;??
  62. ????????????????if(y1?<?img->pre_region[img->region_num].y1)??
  63. ????????????????????img->pre_region[img->region_num].y1?=?y1;??
  64. ????????????????else?if(y1?>?img->pre_region[img->region_num].y2)??
  65. ????????????????????img->pre_region[img->region_num].y2?=?y1;??
  66. ??????????????????
  67. ??????
  68. ????????????????for(i?=?0;?i?<?4;?i++)??
  69. ????????????????{??
  70. ????????????????????x2?=?x1?+?direction[i][0];??
  71. ????????????????????y2?=?y1?+?direction[i][1];??
  72. ??
  73. ????????????????????if(x2?>?0?&&?x2?<?width?&&?y2?>?0?&&?y2?<?height?&&?temp[y2?*?width?+?x2])??
  74. ????????????????????{??
  75. ????????????????????????temp[y2?*?width?+?x2]?=?0;??
  76. ????????????????????????queue[rear].x?=?x2;??
  77. ????????????????????????queue[rear].y?=?y2;??
  78. ????????????????????????rear?++;??
  79. ????????????????????}??
  80. ??????????????
  81. ????????????????}??
  82. ????????????}??
  83. ????????????if((img->pre_region[img->region_num].x2?-?img->pre_region[img->region_num].x1?>?xthreashold)?&&?(img->pre_region[img->region_num].y2?-?img->pre_region[img->region_num].y1?>?ythreashold))??
  84. ????????????{??
  85. ??
  86. ????????????????img->pre_region[img->region_num].width?=?img->pre_region[img->region_num].x2?-?img->pre_region[img->region_num].x1?+?1;??
  87. ????????????????img->pre_region[img->region_num].height?=?img->pre_region[img->region_num].y2?-?img->pre_region[img->region_num].y1?+?1;??
  88. ????????????????img->pre_region[img->region_num].rate?=?(float)img->pre_region[img->region_num].width/img->pre_region[img->region_num].height;??
  89. ????????????????if((img->pre_region[img->region_num].width?<?img->width?/?2)?&&?(img->pre_region[img->region_num].height?<?img->height?/?2))??
  90. ????????????????if((img->pre_region[img->region_num].rate?>?rateLow)?&&?(img->pre_region[img->region_num].rate?<?rateHigh))??
  91. ????????????????{??
  92. ????????????????????if(img->pre_region[img->region_num].x2?+?PRE_LOCATION_BIAS?>?img->width)??
  93. ????????????????????????????img->pre_region[img->region_num].x2?=?img->width;??
  94. ????????????????????else??
  95. ????????????????????????????img->pre_region[img->region_num].x2?+=?PRE_LOCATION_BIAS;??
  96. ????????????????????if(img->pre_region[img->region_num].x1?-?PRE_LOCATION_BIAS?<?0)??
  97. ????????????????????????????img->pre_region[img->region_num].x1?=?0;??
  98. ????????????????????else??
  99. ????????????????????????????img->pre_region[img->region_num].x1?-=?PRE_LOCATION_BIAS;??
  100. ????????????????????if(img->pre_region[img->region_num].y2?+?PRE_LOCATION_BIAS?>?img->height)??
  101. ????????????????????????????img->pre_region[img->region_num].y2?=?img->height;??
  102. ????????????????????else??
  103. ????????????????????????????img->pre_region[img->region_num].y2?+=?PRE_LOCATION_BIAS;??
  104. ????????????????????if(img->pre_region[img->region_num].y1?-?PRE_LOCATION_BIAS?<?0)??
  105. ????????????????????????????img->pre_region[img->region_num].y1?=?0;??
  106. ????????????????????else??
  107. ????????????????????????????img->pre_region[img->region_num].y1?-=?PRE_LOCATION_BIAS;??
  108. ??
  109. ????????????????????img->pre_region[img->region_num].width?=?img->pre_region[img->region_num].x2?-?img->pre_region[img->region_num].x1?+?1;??
  110. ????????????????????img->pre_region[img->region_num].height?=?img->pre_region[img->region_num].y2?-?img->pre_region[img->region_num].y1?+?1;??
  111. ??????????????
  112. ????????????????????img->region_num++;??
  113. ????????????????}??
  114. ????????????}??
  115. ????????}??
  116. ??????????
  117. ??????????
  118. ????}??
  119. ????free(temp);??
  120. ????temp?=?NULL;??
  121. ????return?0;??
  122. }??

6、截取車牌區域圖像




四、黃色車牌檢測

1、車輛圖像信息



2、HSV過濾分割

由于車牌顏色 與 車輛顏色一直,出現大量噪聲信息,全局投影已不可能分割出車牌信息了,

這里只是 利用候選區域長寬比來進行矩形分割,肯定會出現一些符合比例但是不是車牌的區域,必須在后面的處理中加以區分或者添加判斷跳變規律的函數



3、去噪



4、 膨脹


6、邊緣檢測



7、候選區域 連通域篩選

從圖中可以看到黃框 部分即是符合候選區域的地方



8、截取候選區域

此候選區域只是符合長寬比,需要另行處理 除去不是車牌的區域



五、小結

車牌定位比較復雜,但對于車牌識別來說,最為重要,我認為它是影響車牌識別最大因素。雖然復雜,但是方法多種多樣。

這里僅此個人愛好和研究,希望各位朋友繼續提出批評和建議,大家的鼓勵給了我堅持下去的勇氣。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387657.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387657.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387657.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python - 排序( 插入, 冒泡, 快速, 二分 )

插入排序 算法分析 兩次循環, 大循環對隊列中的每一個元素拿出來作為小循環的裁定對象 小循環對堆當前循環對象在有序隊列中尋找插入的位置 性能參數 空間復雜度  O(1) 時間復雜度  O(n^2) 詳細代碼解讀 import randomdef func(l):# 外層循環: 對應遍歷所有的無序數據for i…

[EmguCV|C#]使用CvInvoke自己繪製色彩直方圖-直方圖(Hitsogram)系列(4)

2014-02-0610325 0C# 檢舉文章 過年結束了&#xff0c;雖然還是學生所以其實還有兩個禮拜的假期&#xff0c;不過為了不讓自己發慌&#xff0c;趁著假期多利用充實自己&#xff0c;所以提早回到開工狀態&#xff0c;而這次總算要把一直說的自己動手繪製猜色直方圖文章寫出。 …

G.點我

鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/903/G 題意&#xff1a; X腿與隊友到河北省來參加2019河北省大學生程序設計競賽&#xff0c;然而這場比賽的題目難度實在是太高了。比賽開始一個小時后&#xff0c;X腿仍然沒有做出一個題。這時候&#xff0c;X腿驚訝的發…

輪廓的查找、表達、繪制、特性及匹配(How to Use Contour? Find, Component, Construct, Features Match)

前言 輪廓是構成任何一個形狀的邊界或外形線。前面講了如何根據色彩及色彩的分布&#xff08;直方圖對比和模板匹配&#xff09;來進行匹配&#xff0c;現在我們來看看如何利用物體的輪廓。包括以下內容&#xff1a;輪廓的查找、表達方式、組織方式、繪制、特性、匹配。 查…

Android:IntentService的學習

在Android的四大組件中&#xff0c;Service排行老二&#xff0c;在Android中的主要作用是后臺服務&#xff0c;進行與界面無關的操作。由于Service運行在主線程&#xff0c;所以進行異步操作需要在子線進行。為此Android為我們提供了IntentService。 IntentService是一個抽象類…

智能商業大會構造信息化交流平臺

在快速發展的當今社會&#xff0c;所有事物都在日新月異地變化著&#xff0c;相較于過去的傳統商業的變化速度&#xff0c;現今基于數據的互聯網商業變化速度高出了一個量級&#xff0c;同時市場對于企業的應對速度也有了更高的要求&#xff0c;然而面對大體量的數據&#xff0…

itcast-ssh-crm實踐

分析 BaseDao 文件上傳 轉載于:https://www.cnblogs.com/hellowq/p/10209761.html

分類器大牛們

David Lowe&#xff1a;Sift算法的發明者&#xff0c;天才。 Rob Hess&#xff1a;sift的源碼OpenSift的作者&#xff0c;個人主頁上有openSift的下載鏈接&#xff0c;Opencv中sift的實現&#xff0c;也是參考這個。 Koen van de Sande&#xff1a;作者給出了sift,densesift,co…

go 成長路上的坑(1)

一、先來看一段代碼 package mainimport "fmt"type X struct{}func (x *X) test(){println("h1",x) } func main(){a : X{} a.test()(&X{}).test()(X{}).test() } 猜猜他的結果 二、揭曉答案 package mainimport "fmt"type X struct{}func (…

利用python腳本程序監控文件被修改

需求&#xff1a;利用python編寫監控程序&#xff0c;監控一個文件目錄&#xff0c;當目錄下的文件發生改變時&#xff0c;實現有修改就發報警郵件 郵件使用QQ郵箱&#xff0c;需要開啟smtp&#xff0c;使用手機發生短信&#xff0c;騰訊會給你發郵箱密碼。如下所示&#xff1a…

Oracle RAC

環境如下&#xff1a; Linux操作系統&#xff1a;Centos 6.5 64bit &#xff08;這個版本的redhat 6內核等OS在安裝grid最后執行root.sh時會出現crs-4124&#xff0c;是oracle11.2.0.1的bug&#xff09; VMware version&#xff1a;Workstation 8.0.3 build-703057 Oracle…

好程序員web前端分享MVVM框架Vue實現原理

好程序員web前端分享MVVM框架Vue實現原理&#xff0c;Vue.js是當下很火的一個JavaScript MVVM庫&#xff0c;它是以數據驅動和組件化的思想構建的。相比于Angular.js和react.js更加簡潔、更易于理解的API&#xff0c;使得我們能夠快速地上手并使用Vue.js。?1.什么是MVVM呢&…

HDU - 3516 Tree Construction

HDU - 3516 思路&#xff1a; 平行四邊形不等式優化dp &#xff1a;&#xff09; 代碼&#xff1a; #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc.h> using namespace std; #define y1 y11 #define fi first #define se…

各類總線傳輸速率

1. USB總線 USB1.1&#xff1a; -------低速模式(low speed)&#xff1a;1.5Mbps -------全速模式(full speed)&#xff1a; 12Mbps USB2.0&#xff1a;向下兼容。增加了高速模式&#xff0c;最大速率480Mbps。 -------高速模式(high speed)&#xff1a; 25~480Mbps US…

Activiti多人會簽例子

Activiti中提供了多實例任務&#xff08;for-each&#xff09;將多實例應到到UserTask中可以實現會簽功能。 Multi-instance (for each) Description A multi-instance activity is a way of defining repetition for a certain step in a business process. In programming …

Django 【認證系統】auth

本篇內容 介紹Django框架提供的auth 認證系統 方法&#xff1a; 方法名 備注 create_user 創建用戶 authenticate 登錄驗證 login 記錄登錄狀態 logout 退出用戶登錄 is_authenticated 判斷用戶是否登錄 login_required裝飾器 進行登錄判斷 引入模塊 from django.…

兒科常見疾病的中成藥療法

孩子感冒&#xff0c;分清寒熱是關鍵——兒童風寒感冒和風熱感冒的中成藥內服外治法 兒童不養兒不知父母恩&#xff0c;每個人恐怕都只有自己做了父母&#xff0c;才能感受到父母的愛。嬰幼兒正處于最初的發育期&#xff0c;抵抗力弱&#xff0c;有個感冒發燒的也是常有的事兒。…

物化視圖

有個項目因為有比較多的查詢匯總&#xff0c;考慮到速度&#xff0c;所以使用了物化視圖。簡單的把用到的給整理了下。先看簡單創建語句&#xff1a;create materialized view mv_materialized_test refresh force on demand start with sysdate nextto_date(concat(to_char( s…

為什么直接ping知乎的ip不能訪問知乎的網站,而百度就可以?

結論&#xff1a; 簡單的說&#xff0c;就是baidu有錢。 正文&#xff1a; 大型網站依靠自身稀稀落落的服務器很難滿足網頁“秒開”的用戶需求&#xff0c;會加入CDN加速的隊伍。 當用戶訪問 http://www.zhihu.com 時&#xff0c;域名解析到距離用戶最近的CDN服務器的公網IP&am…

皮膚病

小偏方治百病/《國醫絕學健康館》編委會編.—重慶&#xff1a;重慶出版社&#xff0c;2010.3&#xff08;國醫絕學健康館&#xff09; 濕疹 苦參湯熏洗治陰囊濕疹方 苦參、蛇麻子中藥各50克&#xff0c;混合后&#xff0c;在晚上煎湯&#xff0c;可直接放在臉盆中煎。煎好后&am…