人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

Python中OpenCV實(shí)現(xiàn)簡單車牌字符切割

發(fā)布日期:2022-03-12 15:17 | 文章來源:CSDN

在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)] #初始化一個(gè)長度為w的數(shù)組,用于記錄每一行的黑點(diǎn)個(gè)數(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]初始化一個(gè)長度為w的數(shù)組,用于記錄每一列的黑點(diǎn)個(gè)數(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)個(gè)數(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]
 #對(duì)行圖像進(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)#第一個(gè)參數(shù)是原圖;第二個(gè)參數(shù)是矩陣的左上點(diǎn)坐標(biāo);第三個(gè)參數(shù)是矩陣的右下點(diǎn)坐標(biāo);第四個(gè)參數(shù)是畫線對(duì)應(yīng)的rgb顏色;第五個(gè)參數(shù)是所畫的線的寬度
cv2.imshow('rect',image2)
cv2.waitKey(0)

2.運(yùn)行結(jié)果

3. 遇到的問題及解決方法

對(duì)于二值化后的灰度圖,在確定了各個(gè)字符坐標(biāo)后,使用cv2.rectangle()方法畫矩形框:cv2.rectangle(image2, (Position[m][0],Position[m][1]), (Position[m][2],Position[m][3]), (0, 255, 0), 2)。其中,第一個(gè)參數(shù)表示原圖,第二個(gè)參數(shù)表示矩陣的左上點(diǎn)坐標(biāo),第三個(gè)參數(shù)表示矩陣的右下點(diǎn)坐標(biāo);第四個(gè)參數(shù)是畫線對(duì)應(yīng)的RGB顏色,第五個(gè)參數(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)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

美國服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部