一個圖像處理小項目感想
前段時間幫一朋友做過一個關於圖像處理的小項目,項目中涉及到圖像的預處理,分割,識別等一些模塊。大概需求如下:
拿到需求以後對於做過圖像處理的人來說應該不算難事,但是後面在做的過程中發現坑還是比較多。演算法的硬性要求是:1.項目部署在手機上面 2.項目被安卓程序調用 。實際看下來發現這個要求並不高,用java做出來也不是很麻煩,無奈本人不會java,只能用python硬著頭皮上了。一開始初步方案是python + so文件/flask restful 服務,由於我對手機部署安卓不是很了解,我印象中安卓是用的linux內核,我想當然的認為拿到root許可權後,安卓上python就可以直接起服務了。到後來在做的過程中,發現這個能安裝上去,但是在安裝opencv的時候遇到了大問題。沒辦法,只能曲線部署,用了qpython。qpython的好處是直接可以一鍵安裝opencv,numpy等一些必須的包,還有非常可愛的keras包(實際後來我沒用上,後面我會說遇到什麼麻煩了)。
拿到圖以後首先是要將屏幕給分割出來,首先想到用的是二值化→形態變換→輪廓分割(這個很多做圖像處理的都不會用這個思路的,除非在背景、光照變化不大的情況下),當時我的思路是將圖像轉化到hsv空間,然後取v空間的圖像做二值化來進行分割,這邊又會遇到一個問題,就是二值化怎麼選。當時我的方案用的是opencv里的THRESH_BINARY+THRESH_OTSU。
主要選取led時的特徵有下面幾個:
1.led的面積在輪廓中排序靠前,我在代碼里是取的排名前6的輪廓
2.形狀是四邊形
3.由於圖片都是正放的,因此是寬大於高
通過以上三個特徵,就可以篩選出來led區域。
具體代碼如下:
def selectLedZone(img_rgb,flag): function: 選出led顯示區域 參數: img_rgb是輸入的原圖 flag 是進行交通檢測時使用,如果為0表示的交通燈,其他都為1 返回: led區域的roi圖片 hsv = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2HSV) h,s,v = cv2.split(hsv) # v_bin = binImg(v) # 二值化 _, v_bin = cv2.threshold(v, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) if flag==1: v_bin = cv2.dilate(v_bin,None,iterations=2) #膨脹操作 else: v_bin = ~cv2.dilate(v_bin,None,iterations=2) #膨脹操作 # 得到二值圖的輪廓 _,cnts, h = cv2.findContours(v_bin,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cs = sorted(cnts, key=cv2.contourArea, reverse=True)[:6] result = [] for ind,c in enumerate(cs): rect = cv2.minAreaRect(c) peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.04 * peri, True) length = len(approx) x, y, w, h = cv2.boundingRect(c) if length==4 and w > h: src_img_rot = img_rgb[y:y+h,x:x+w] result.append(src_img_rot) if len(result)!=0: return result[0] else: return "noL
得到led區域以後,就是對於不同區域進行不同處理。重點來說說車牌識別(其他兩個過於簡單沒必要說了)。車牌識別已經是非常成熟的解決方案了。現在用深度學習基本可以做到99%以上準確率,已經大規模商用。
當時想的方案是用深度學習,直接端到端識別。在進行識別也需要在切除出來的車牌進行。
如下圖所示:
到後面部署的時候發現theano和tensorflow都無法安裝(摔桌子),即便是安裝上去,估計效率也是一個大問題。遇到這種問題,那就退而求其次,用了傳統方法。
1.字元分割 使用了投影法
2.識別用的是svm+hog。
最終識別準確率在測試樣本中能到93%
至此一個簡單小項目就此完成,涉及到圖像預處理、圖像分割、圖像識別。
ps:打個廣告,喜歡圖像處理的可以加我微信,拉你進群,微信號:lixianjie0518
推薦閱讀:
※OpenCV機器學習——樸素貝葉斯NBC
※【小林的OpenCV基礎課 番外】霍夫變換原理
※使用OpenCV與Face++實現人臉解鎖
※OpenCV3.3.0在Visual Studio 2017上的配置
※用色彩空間做圖像處理,讓顏色提取更高效