佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Python中OpenCV實現(xiàn)簡單車牌字符切割

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

熱門標(biāo)簽:美圖手機 呼叫中心市場需求 鐵路電話系統(tǒng) 銀行業(yè)務(wù) 服務(wù)器配置 網(wǎng)站文章發(fā)布 檢查注冊表項 智能手機

在Jupyter Notebook上使用Python+opencv實現(xiàn)如下簡單車牌字符切割。關(guān)于opencv庫的安裝可以參考:Python下opencv庫的安裝過程與一些問題匯總。

1.實現(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ù)組,用于記錄每一行的黑點個數(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ù)組,用于記錄每一列的黑點個數(shù)
#記錄每一列的波峰
for j in range(0,w2): #遍歷一列 
    for i in range(0,h2):  #遍歷一行
        if  image4[i,j]==0:  #如果該點為黑點
            b[j]+=1  #該列的計數(shù)器加一,最后統(tǒng)計出每一列的黑點個數(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)該變黑的最頂部的點開始向最底部涂黑
        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

#分割行,分割之后再進行列分割并保存分割位置
for i in range(len(a_Start)):
    #獲取行圖像
    cropImg = image2[a_Start[i]:a_End[i], 0:w1]
    #對行圖像進行垂直投影
    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ù)是矩陣的左上點坐標(biāo);第三個參數(shù)是矩陣的右下點坐標(biāo);第四個參數(shù)是畫線對應(yīng)的rgb顏色;第五個參數(shù)是所畫的線的寬度
cv2.imshow('rect',image2)
cv2.waitKey(0)

2.運行結(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ù)表示矩陣的左上點坐標(biāo),第三個參數(shù)表示矩陣的右下點坐標(biāo);第四個參數(shù)是畫線對應(yīng)的RGB顏色,第五個參數(shù)是畫線寬度。在設(shè)置RGB顏色時發(fā)現(xiàn)矩形框顏色只能顯示為黑色和白色,原因是在二值圖上畫圖顏色沒有三通道,無法顯示彩色圖像。

解決方法:將灰度圖轉(zhuǎn)換為RGB彩圖。代碼為image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)。

到此這篇關(guān)于Python中OpenCV實現(xiàn)簡單車牌字符切割的文章就介紹到這了,更多相關(guān)OpenCV 車牌字符切割內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • OpenCV實現(xiàn)車牌字符分割(C++)
  • OpenCV+Python識別車牌和字符分割的實現(xiàn)
  • Python+OpenCV實現(xiàn)車牌字符分割和識別

標(biāo)簽:樂山 紅河 滄州 上海 新疆 沈陽 河南 長治

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python中OpenCV實現(xiàn)簡單車牌字符切割》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    凤翔县| 改则县| 榆树市| 得荣县| 论坛| 白银市| 三穗县| 恩施市| 绥中县| 元谋县| 大田县| 鹿泉市| 蓬莱市| 兴海县| 天台县| 宜兴市| 蓬溪县| 山阳县| 新宾| 霸州市| 宁海县| 通榆县| 公主岭市| 稻城县| 东方市| 县级市| 蒙阴县| 乌拉特前旗| 阿合奇县| 丰宁| 长沙市| 浑源县| 蒲城县| 庄河市| 丹凤县| 新巴尔虎右旗| 河间市| 清新县| 红河县| 保定市| 敖汉旗|