最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中超簡單的字符分割算法記錄(車牌識別、儀表識別等)

 更新時間:2021年09月24日 09:57:23   作者:聽、 風(fēng)  
這篇文章主要給大家介紹了關(guān)于python中超簡單的字符分割算法記錄,如車牌識別、儀表識別等,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

背景

在諸如車牌識別,數(shù)字儀表識別等問題中,最關(guān)鍵的就是將單個的字符分割開來再分別進行識別,如下圖。最近剛好用到,就自己寫了一個簡單地算法進行字符分割,來記錄一下。

圖像預(yù)處理

彩圖二值化以減小參數(shù)量,再進行腐蝕膨脹去除噪點。

image = cv2.imread('F://demo.jpg', 0)  # 讀取為灰度圖
_, image = cv2.threshold(image, 50, 255, cv2.THRESH_BINARY)  # 二值化
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))  # 腐蝕膨脹核
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 腐蝕膨脹核
image = cv2.erode(image, kernel=kernel1)  # 腐蝕
image = cv2.dilate(image, kernel=kernel2)  # 膨脹

確定字符區(qū)域

考慮最理想的情況,圖中的字符是端正沒有傾斜歪曲的。將像素灰度矩陣分別進行列相加、行相加,則在得到的列和、行和數(shù)組中第一個非 0 元素索引到最后一個非 0 元素索引包裹的區(qū)間即就是字符區(qū)域。

h, w = image.shape  # 原圖的高和寬
list1 = []  # 列和
list2 = []  # 行和

for i in range(w):
    list1.append(1 if image[:, i].sum() != 0 else 0)  # 列求和,不為0置1
for i in range(h):
    list2.append(1 if image[i, :].sum() != 0 else 0)  # 行求和,不為0置1

# 裁剪字符區(qū)域
# 求行的范圍
flag = 0
for i, e in enumerate(list1):
    if e != 0:
        if flag == 0:  # 第一個不為0的位置記錄
            start_w = i
            flag = 1
        else:  # 最后一個不為0的位置
            end_w = i
# 求列的范圍
flag = 0
for i, e in enumerate(list2):
    if e != 0:
        if flag == 0:  # 第一個不為0的位置記錄
            start_h = i
            flag = 1
        else:  # 最后一個不為0的位置
            end_h = i

print(start_w, end_w)  # 行索引范圍
print(start_h, end_h)  # 列索引范圍

分割單個字符

與分割全部字符區(qū)域同理,在行和數(shù)組中非 0 元素索引的范圍即是單個字符的區(qū)域。

l = ([i for i, e in enumerate(list1) if e != 0])  # 列和列表中不為0的索引
img_list = []  # 分割數(shù)字圖片存儲列表
temp = []  # 存儲某一個數(shù)字的所有行索引值
n = 0  # 數(shù)字圖片數(shù)量

for x in l:
    temp.append(x)
    if x+1 not in l:  # 索引不連續(xù)的情況
        if len(temp) != 1:
            start_w = min(temp)  # 索引最小值
            end_w = max(temp)  # 索引最大值
            img_list.append(image[start_h:end_h, start_w:end_w])  # 對該索引包括數(shù)字切片
            n += 1
        temp = []

print(n)  # 字符數(shù)

完整源碼

import cv2

start_h, end_h, start_w, end_w = 0, 0, 0, 0  # 字符區(qū)域的高和寬起止

image = cv2.imread('F://001_1.jpg', 0)  # 直接讀取為灰度圖
cv2.imshow('img_GRAY', image)

_, image = cv2.threshold(image, 50, 255, cv2.THRESH_BINARY)  # 二值化
cv2.imshow('img_BINARY', image)

# 去噪點
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))  # 簡單腐蝕膨脹核
kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 簡單腐蝕膨脹核
image = cv2.erode(image, kernel=kernel1)  # 腐蝕
image = cv2.dilate(image, kernel=kernel2)  # 膨脹
cv2.imshow('img_denoise', image)


h, w = image.shape  # 原圖的高和寬
# print(h, w)

list1 = []  # 列和
list2 = []  # 行和

for i in range(w):
    list1.append(1 if image[:, i].sum() != 0 else 0)  # 列求和,不為0置1
for i in range(h):
    list2.append(1 if image[i, :].sum() != 0 else 0)  # 行求和,不為0置1

# print(len(list1))
# print(len(list2))

# 裁剪字符區(qū)域
# 求行的范圍
flag = 0
for i, e in enumerate(list1):
    if e != 0:
        if flag == 0:  # 第一個不為0的位置記錄
            start_w = i
            flag = 1
        else:  # 最后一個不為0的位置
            end_w = i
# 求列的范圍
flag = 0
for i, e in enumerate(list2):
    if e != 0:
        if flag == 0:  # 第一個不為0的位置記錄
            start_h = i
            flag = 1
        else:  # 最后一個不為0的位置
            end_h = i

print(start_w, end_w)  # 行索引范圍
print(start_h, end_h)  # 列索引范圍

cv2.imshow('img_number', image[start_h:end_h, start_w:end_w])

l = ([i for i, e in enumerate(list1) if e != 0])  # 列和列表中不為0的索引
# print(l)

img_list = []  # 分割數(shù)字圖片存儲列表

temp = []  # 存儲某一個數(shù)字的所有行索引值
n = 0  # 數(shù)字圖片數(shù)量
for x in l:
    temp.append(x)
    if x+1 not in l:  # 索引不連續(xù)的情況
        if len(temp) != 1:
            start_w = min(temp)  # 索引最小值
            end_w = max(temp)  # 索引最大值
            img_list.append(image[start_h:end_h, start_w:end_w])  # 對該索引包括數(shù)字切片
            n += 1
            # print(temp)
        temp = []

print(n)  # 字符數(shù)

for i in range(n):  # 顯示保存字符
    cv2.imshow('number'+str(i), img_list[i])
    cv2.imwrite('F://demo'+str(i+1).zfill(2)+'.jpg', img_list[i])

cv2.waitKey(0)

結(jié)語

利用列向和行向相加的方法簡單分割字符的方法并不適用更加復(fù)雜的分割要求,另外算法中也沒有考慮小數(shù)點分割問題,僅作為學(xué)習(xí)參考,歡迎有問題一起討論交流。

到此這篇關(guān)于python中超簡單的字符分割算法記錄(車牌識別、儀表識別等)的文章就介紹到這了,更多相關(guān)python字符分割算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用Python的OpenCV庫處理圖像和視頻

    如何使用Python的OpenCV庫處理圖像和視頻

    基于opencv可以顯示圖片,并進行相應(yīng)的處理,下面這篇文章主要給大家介紹了關(guān)于如何使用Python的OpenCV庫處理圖像和視頻的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 詳解Python如何與?java高效的交互

    詳解Python如何與?java高效的交互

    這篇文章主要為大家介紹了詳解Python如何與java高效的交互的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Github?Copilot結(jié)合python的使用方法詳解

    Github?Copilot結(jié)合python的使用方法詳解

    最近也是聽說github出了一種最新的插件叫做copilot,于是申請了,下面這篇文章主要給大家介紹了關(guān)于Github?Copilot結(jié)合python使用的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • python基于queue和threading實現(xiàn)多線程下載實例

    python基于queue和threading實現(xiàn)多線程下載實例

    這篇文章主要介紹了python基于queue和threading實現(xiàn)多線程下載實例,是比較實用的技巧,需要的朋友可以參考下
    2014-10-10
  • Python DataFrame使用drop_duplicates()函數(shù)去重(保留重復(fù)值,取重復(fù)值)

    Python DataFrame使用drop_duplicates()函數(shù)去重(保留重復(fù)值,取重復(fù)值)

    這篇文章主要介紹了Python DataFrame使用drop_duplicates()函數(shù)去重(保留重復(fù)值,取重復(fù)值),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python庫textract提取各種文檔類型中文本數(shù)據(jù)

    Python庫textract提取各種文檔類型中文本數(shù)據(jù)

    Python的textract庫是一個強大的工具,它可以從各種文檔類型中提取文本數(shù)據(jù),無論是PDF、Word文檔、圖片還是其他格式的文件,textract都可以輕松地將文本提取出來,本文將詳細(xì)介紹textract的功能和用法,并提供豐富的示例代碼來幫助大家深入了解
    2024-01-01
  • Django的多表查詢操作實戰(zhàn)

    Django的多表查詢操作實戰(zhàn)

    Django提供一種強大而又直觀的方式來"處理"查詢中的關(guān)聯(lián)關(guān)系,它在后臺自動幫你處理JOIN,下面這篇文章主要給大家介紹了關(guān)于Django多表查詢操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Python實現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法

    Python實現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法

    下面小編就為大家?guī)硪黄狿ython實現(xiàn)Windows和Linux之間互相傳輸文件(文件夾)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Python中摘要算法MD5,SHA1簡介及應(yīng)用實例代碼

    Python中摘要算法MD5,SHA1簡介及應(yīng)用實例代碼

    這篇文章主要介紹了Python中摘要算法MD5,SHA1簡介及應(yīng)用實例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python寫了個疫情信息快速查看工具實例代碼

    Python寫了個疫情信息快速查看工具實例代碼

    本次使用PyQt5開發(fā)了一款疫情信息快速查看工具,實現(xiàn)了多個數(shù)據(jù)源的查看,代碼量不大,功能相當(dāng)于瀏覽器,只是限定了一些特定網(wǎng)址,這篇文章主要介紹了Python寫了個疫情信息快速查看工具,需要的朋友可以參考下
    2022-11-11

最新評論

库伦旗| 淮北市| 凭祥市| 屏东市| 依兰县| 石台县| 乳山市| 聊城市| 庆安县| 合阳县| 富宁县| 象山县| 攀枝花市| 枞阳县| 三亚市| 云浮市| 临泽县| 茌平县| 梁平县| 富宁县| 彭山县| 青海省| 西吉县| 灵石县| 石棉县| 平定县| 望谟县| 独山县| 美姑县| 福鼎市| 多伦县| 茌平县| 东安县| 清水河县| 衡南县| 奉节县| 洛扎县| 大安市| 栾城县| 东辽县| 阳春市|