Python中OpenCV實(shí)現(xiàn)簡單車牌字符切割
在Jupyter Notebook上使用Python+opencv實(shí)現(xiàn)如下簡單車牌字符切割。關(guān)于opencv庫的安裝可以參考:Python下opencv庫的安裝過程與一些問題匯總。
1.實(shí)現(xiàn)代碼
import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image #讀取原圖片 image1=cv2.imread("123456.jpg") cv2.imshow("image1", image1) #灰度化處理 image1_1=cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) cv2.imshow("image1_1", image1_1) #圖像反色 h,w = image1_1.shape image1_2=image1_1.copy() for i in range(h): for j in range(w): image1_2[i,j] = 255-image1_2[i,j] cv2.imshow('image1_2', image1_2) #圖像二值化 ret,image2 = cv2.threshold(image1_2, 100, 255, cv2.THRESH_BINARY) cv2.imshow('image2', image2) #水平投影 h1,w1=image2.shape #返回高和寬 image3=image2.copy() a = [0 for z in range(0, h1)] #初始化一個長度為w的數(shù)組,用于記錄每一行的黑點(diǎn)個數(shù) #記錄每一行的波峰 for j in range(0,h1): for i in range(0,w1): if image3[j,i]==0: a[j]+=1 image3[j,i]=255 for j in range(0,h1): for i in range(0,a[j]): image3[j,i]=0 plt.imshow(image3,cmap=plt.gray())#灰度圖正確的表示方法 plt.show() cv2.imshow('image3',image3) #垂直投影 h2,w2=image2.shape #返回高和寬 image4=image2.copy() b = [0 for z in range(0, w2)] #b = [0,0,0,0,0,0,0,0,0,0,...,0,0]初始化一個長度為w的數(shù)組,用于記錄每一列的黑點(diǎn)個數(shù) #記錄每一列的波峰 for j in range(0,w2): #遍歷一列 for i in range(0,h2): #遍歷一行 if image4[i,j]==0: #如果該點(diǎn)為黑點(diǎn) b[j]+=1 #該列的計(jì)數(shù)器加一,最后統(tǒng)計(jì)出每一列的黑點(diǎn)個數(shù) image4[i,j]=255 #記錄完后將其變?yōu)榘咨喈?dāng)于擦去原圖黑色部分 for j in range(0,w2): for i in range((h2-b[j]),h2): #從該列應(yīng)該變黑的最頂部的點(diǎn)開始向最底部涂黑 image4[i,j]=0 #涂黑 plt.imshow(image4,cmap=plt.gray()) plt.show() cv2.imshow('image4',image4) #分割字符 Position = [] start = 0 a_Start = [] a_End = [] #根據(jù)水平投影獲取垂直分割位置 for i in range(len(a)): if a[i] > 0 and start ==0: a_Start.append(i) start = 1 if a[i] <= 0 and start == 1: a_End.append(i) start = 0 #分割行,分割之后再進(jìn)行列分割并保存分割位置 for i in range(len(a_Start)): #獲取行圖像 cropImg = image2[a_Start[i]:a_End[i], 0:w1] #對行圖像進(jìn)行垂直投影 bstart = 0 bend = 0 b_Start = 0 b_End = 0 for j in range(len(b)): if b[j] > 0 and bstart ==0: b_Start =j bstart = 1 bend=0 if b[j] <= 0 and bstart == 1: b_End =j bstart = 0 bend=1 if bend == 1: Position.append([b_Start,a_Start[i],b_End,a_End[i]]) bend =0 image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)#將灰度圖轉(zhuǎn)為RGB彩圖 #根據(jù)確定的位置分割字符 for m in range(len(Position)): cv2.rectangle(image2, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0, 0, 255), 2)#第一個參數(shù)是原圖;第二個參數(shù)是矩陣的左上點(diǎn)坐標(biāo);第三個參數(shù)是矩陣的右下點(diǎn)坐標(biāo);第四個參數(shù)是畫線對應(yīng)的rgb顏色;第五個參數(shù)是所畫的線的寬度 cv2.imshow('rect',image2) cv2.waitKey(0)
2.運(yùn)行結(jié)果
3. 遇到的問題及解決方法
對于二值化后的灰度圖,在確定了各個字符坐標(biāo)后,使用cv2.rectangle()方法畫矩形框:cv2.rectangle(image2, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0, 255, 0), 2)。其中,第一個參數(shù)表示原圖,第二個參數(shù)表示矩陣的左上點(diǎn)坐標(biāo),第三個參數(shù)表示矩陣的右下點(diǎn)坐標(biāo);第四個參數(shù)是畫線對應(yīng)的RGB顏色,第五個參數(shù)是畫線寬度。在設(shè)置RGB顏色時(shí)發(fā)現(xiàn)矩形框顏色只能顯示為黑色和白色,原因是在二值圖上畫圖顏色沒有三通道,無法顯示彩色圖像。
解決方法:將灰度圖轉(zhuǎn)換為RGB彩圖。代碼為image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)。
到此這篇關(guān)于Python中OpenCV實(shí)現(xiàn)簡單車牌字符切割的文章就介紹到這了,更多相關(guān)OpenCV 車牌字符切割內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中使用PyExecJS庫執(zhí)行JavaScript函數(shù)
Python在運(yùn)行JavaScript函數(shù)時(shí),需要用到外部庫來執(zhí)行JavaScript,本文主要介紹了Python中使用PyExecJS庫執(zhí)行JavaScript函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04Python3中內(nèi)置類型bytes和str用法及byte和string之間各種編碼轉(zhuǎn)換 問題
這篇文章主要介紹了Python3中內(nèi)置類型bytes和str用法及byte和string之間各種編碼轉(zhuǎn)換問題,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09找Python安裝目錄,設(shè)置環(huán)境路徑以及在命令行運(yùn)行python腳本實(shí)例
這篇文章主要介紹了找Python安裝目錄,設(shè)置環(huán)境路徑以及在命令行運(yùn)行python腳本實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03python學(xué)習(xí)pymongo模塊的使用方法
這篇文章主要介紹了python學(xué)習(xí)pymongo模塊的使用方法,pymongo模塊是python操作mongo數(shù)據(jù)的第三方模塊,總結(jié)一下常用到的簡單用,需要的小伙伴可以參考一下2022-09-09tensorflow將圖片保存為tfrecord和tfrecord的讀取方式
今天小編就為大家分享一篇tensorflow將圖片保存為tfrecord和tfrecord的讀取方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02