Python項目實戰(zhàn)篇之常用驗證碼標(biāo)注&識別(數(shù)據(jù)采集/預(yù)處理/字符圖切割)
大家好,我是Snowball。
一、前言
上一篇文章小編給大家講解了需求分析和實現(xiàn)思路,Python項目實戰(zhàn)篇——常用驗證碼標(biāo)注和識別(需求分析和實現(xiàn)思路),這篇文章繼續(xù)沿著上一篇文章的內(nèi)容,給大家講解下數(shù)據(jù)采集/預(yù)處理/字符圖切割內(nèi)容。
二、數(shù)據(jù)采集
數(shù)據(jù)采集:根據(jù)圖片驗證碼鏈接進行批量下載圖片,最開始時下載個20張先進行手動改文件名進行標(biāo)注,下載這塊代碼編寫不難,這里不貼代碼了,見image_download.py文件。
三、預(yù)處理
預(yù)處理:根據(jù)需求分析中的字符切割描述,針對筆者的圖片驗證碼案例情況,需要先進行常規(guī)驗證碼圖片預(yù)處理,預(yù)處理通過OpenCV庫實現(xiàn),處理過程為:
- 原始圖->灰度圖->中值濾波->二值化->輪廓檢測繪制(部分情況才可以加)->字符切割填充
大概過程功能簡單描述如下,詳細原理可以參考OpenCV相關(guān)文章和視頻,引用鏈接:
- [3.OpenCV文章專欄](https://blog.csdn.net/yukinoai/category_9283880.html)
- [4.OpenCV-Python視頻](https://www.bilibili.com/video/BV1tb4y1C7j7)
原始圖(RGB)轉(zhuǎn)灰度圖:去除顏色信息,減少圖片大小,單通道值方便濾波處理。讀者可以腦洞一下,不去除顏色信息,能提取到指定字符顏色的輪廓嗎?
灰度圖中值濾波:進行噪音去除,取中間像素平均值
二值化:只留下0、255二種值,方便輪廓檢測
輪廓檢測:這一步主要用于提取字符輪廓矩形坐標(biāo),不適合字符挨得特別緊的情況
字符切割填充:根據(jù)生成的字符輪廓圖片矩形坐標(biāo)進行切割再填充對齊到指定寬高
具體執(zhí)行效果如下:
下面是預(yù)處理過程部分核心代碼,詳細代碼見image_split.py文件。
- def pre_process_image(img, file_name):
- # 去除邊緣
- img = img[2:-2, 2:-2]
- # print(img.shape)
- #得到灰度圖
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- # show("gray", gray)
- #去除噪音
- blur = cv2.medianBlur(gray, 3)
- # show("blur", blur)
- temp = gray.mean().item()
- #二值化
- ret, threshold = cv2.threshold(blur, temp, 255, cv2.THRESH_BINARY)
- # show("threshold", threshold)
- #保存二值化圖片
- if IS_SAVE_FILE:
- cv2.imwrite(DST_IMG_DIR + file_name + "_threshold.png", threshold)
- return threshold
執(zhí)行圖片預(yù)處理程序后具體效果圖1-3如下:
輪廓檢測繪制結(jié)果1:
根據(jù)圖片輪廓進行字符切割結(jié)果2:
根據(jù)字符切割圖片進行文件分類結(jié)果3:
以上就是字符圖片切割的全部過程了,核心過程代碼如下:
- def split_image(file_path):
- file_name = get_file_name(file_path)
- img = read_image(file_path)
- #驗證碼預(yù)處理
- threshold = pre_process_image(img, file_name)
- #查找輪廓邊界列表
- contours = find_counters(threshold)
- #過濾合適的輪廓矩形列表
- rect_list,result_rect = get_filter_rect(contours, img, file_name)
- #分割矩形圖片
- return split_rect_img(file_path, threshold, rect_list, result_rect)
詳細代碼可以閱讀源碼,這里說一下這個過程中筆者編寫預(yù)處理代碼遇到的幾個問題:
- 部分圖片輪廓檢測可以檢測到多個輪廓,部分圖片只有1-2個輪廓,部分可能一個輪廓都沒有,這里代碼進行了相應(yīng)的調(diào)整處理,比如過濾大的外部輪廓和較小的內(nèi)部輪廓,根據(jù)剩下的輪廓進行坐標(biāo)排序,根據(jù)部分坐標(biāo)得到所有字符輪廓
- 得到4個字符輪廓圖片后,每個圖片大小不一致,需要進行大小補齊,這個寬高參數(shù)需要根據(jù)數(shù)據(jù)集進行調(diào)整
以上就是數(shù)據(jù)采集/預(yù)處理的實現(xiàn)過程了,這里稍微說下學(xué)習(xí)OpenCV相關(guān)知識過程的情況,筆者是采用文章+視頻間斷性學(xué)習(xí),大概是20-40個小時左右,然后再開始寫具體字符圖片切割的代碼,讀者可根據(jù)自己的時間安排學(xué)習(xí)速度,建議工具類的東西是快速學(xué)習(xí),現(xiàn)學(xué)現(xiàn)用。好的,接下來介紹高效率、可復(fù)用的通用圖片驗證碼數(shù)據(jù)標(biāo)注功能實現(xiàn)。
四、總結(jié)
我是Snowball。上一篇文章給大家分享了,Python項目實戰(zhàn)篇——常用驗證碼標(biāo)注和識別(需求分析和實現(xiàn)思路),這篇內(nèi)容主要講解了常用驗證碼標(biāo)注&識別的數(shù)據(jù)采集/預(yù)處理的實現(xiàn)過程。下一篇文章,小編給大家介紹高效率、可復(fù)用的通用圖片驗證碼數(shù)據(jù)標(biāo)注功能實現(xiàn)。
小伙伴們,快快用實踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。