這篇文章主要介紹了關於python驗證碼識別教程之利用投影法、連通域法分割圖片,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
前言
今天這篇文章主要記錄如何切分驗證碼,用到的主要函式庫就是Pillow和Linux下的影像處理工具GIMP。首先假設一個固定位置和寬度、無黏連、無幹擾的例子學習如何使用Pillow來切割圖片。
使用GIMP開啟圖片後,按加號放大圖片,然後點擊View->Show Grid來顯示網格線:
from PIL import Image p = Image.open("1.png") # 注意位置顺序为左、上、右、下 cuts = [(20,20,40,70),(60,20,90,70),(100,10,130,60),(140,20,170,50)] for i,n in enumerate(cuts,1): temp = p.crop(n) # 调用crop函数进行切割 temp.save("cut%s.png" % i)
def vertical(img): """传入二值化后的图片进行垂直投影""" pixdata = img.load() w,h = img.size ver_list = [] # 开始投影 for x in range(w): black = 0 for y in range(h): if pixdata[x,y] == 0: black += 1 ver_list.append(black) # 判断边界 l,r = 0,0 flag = False cuts = [] for i,count in enumerate(ver_list): # 阈值这里为0 if flag is False and count > 0: l = i flag = True if flag and count == 0: r = i-1 flag = False cuts.append((l,r)) return cuts p = Image.open('1.png') b_img = binarizing(p,200) v = vertical(b_img)
[(21, 37), (62, 89), (100, 122), (146, 164)]
[(5, 27), (33, 53), (59, 108)]
[(5, 27), (33, 53), (60, 79), (83, 108)]
import queue def cfs(img): """传入二值化后的图片进行连通域分割""" pixdata = img.load() w,h = img.size visited = set() q = queue.Queue() offset = [(-1,-1),(0,-1),(1,-1),(-1,0),(1,0),(-1,1),(0,1),(1,1)] cuts = [] for x in range(w): for y in range(h): x_axis = [] #y_axis = [] if pixdata[x,y] == 0 and (x,y) not in visited: q.put((x,y)) visited.add((x,y)) while not q.empty(): x_p,y_p = q.get() for x_offset,y_offset in offset: x_c,y_c = x_p+x_offset,y_p+y_offset if (x_c,y_c) in visited: continue visited.add((x_c,y_c)) try: if pixdata[x_c,y_c] == 0: q.put((x_c,y_c)) x_axis.append(x_c) #y_axis.append(y_c) except: pass if x_axis: min_x,max_x = min(x_axis),max(x_axis) if max_x - min_x > 3: # 宽度小于3的认为是噪点,根据需要修改 cuts.append((min_x,max_x)) return cuts
python驗證碼識別教程之灰階處理、二值化、降噪與tesserocr辨識
#
以上是python驗證碼辨識教學之利用投影法、連通域法分割圖片的詳細內容。更多資訊請關注PHP中文網其他相關文章!