亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python驗證碼識別教程之利用滴水算法分割圖片

2020-02-15 21:38:54
字體:
來源:轉載
供稿:網友

滴水算法概述

滴水算法是一種用于分割手寫粘連字符的算法,與以往的直線式地分割不同 ,它模擬水滴的滾動,通過水滴的滾動路徑來分割字符,可以解決直線切割造成的過分分割問題。

引言

之前提過對于有粘連的字符可以使用滴水算法來解決分割,但智商捉急的我實在是領悟不了這個算法的精髓,幸好有小伙伴已經實現相關代碼。

我對上面的代碼進行了一些小修改,同時升級為python3的代碼。

還是以這張圖片為例:

在以前的我們已經知道這種簡單的粘連可以通過控制閾值來實現分割,這里我們使用滴水算法。

首先使用之前文章中介紹的垂直投影或者連通域先進行一次切割處理,得到結果如下:

針對于最后粘連情況來使用滴水算法處理:

from itertools import groupbydef binarizing(img,threshold): """傳入image對象進行灰度、二值處理""" img = img.convert("L") # 轉灰度 pixdata = img.load() w, h = img.size # 遍歷所有像素,大于閾值的為黑色 for y in range(h):  for x in range(w):   if pixdata[x, y] < threshold:    pixdata[x, y] = 0   else:    pixdata[x, y] = 255 return imgdef vertical(img): """傳入二值化后的圖片進行垂直投影""" pixdata = img.load() w,h = img.size result = [] for x in range(w):  black = 0  for y in range(h):   if pixdata[x,y] == 0:    black += 1  result.append(black) return resultdef get_start_x(hist_width): """根據圖片垂直投影的結果來確定起點  hist_width中間值 前后取4個值 再這范圍內取最小值 """ mid = len(hist_width) // 2 # 注意py3 除法和py2不同 temp = hist_width[mid-4:mid+5] return mid - 4 + temp.index(min(temp))def get_nearby_pix_value(img_pix,x,y,j): """獲取臨近5個點像素數據""" if j == 1:  return 0 if img_pix[x-1,y+1] == 0 else 1 elif j ==2:  return 0 if img_pix[x,y+1] == 0 else 1 elif j ==3:  return 0 if img_pix[x+1,y+1] == 0 else 1 elif j ==4:  return 0 if img_pix[x+1,y] == 0 else 1 elif j ==5:  return 0 if img_pix[x-1,y] == 0 else 1 else:  raise Exception("get_nearby_pix_value error")def get_end_route(img,start_x,height): """獲取滴水路徑""" left_limit = 0 right_limit = img.size[0] - 1 end_route = [] cur_p = (start_x,0) last_p = cur_p end_route.append(cur_p) while cur_p[1] < (height-1):  sum_n = 0  max_w = 0  next_x = cur_p[0]  next_y = cur_p[1]  pix_img = img.load()  for i in range(1,6):   cur_w = get_nearby_pix_value(pix_img,cur_p[0],cur_p[1],i) * (6-i)   sum_n += cur_w   if max_w < cur_w:    max_w = cur_w  if sum_n == 0:   # 如果全黑則看慣性   max_w = 4  if sum_n == 15:   max_w = 6  if max_w == 1:   next_x = cur_p[0] - 1   next_y = cur_p[1]  elif max_w == 2:   next_x = cur_p[0] + 1   next_y = cur_p[1]  elif max_w == 3:   next_x = cur_p[0] + 1   next_y = cur_p[1] + 1  elif max_w == 5:   next_x = cur_p[0] - 1   next_y = cur_p[1] + 1  elif max_w == 6:   next_x = cur_p[0]   next_y = cur_p[1] + 1  elif max_w == 4:   if next_x > cur_p[0]:    # 向右    next_x = cur_p[0] + 1    next_y = cur_p[1] + 1   if next_x < cur_p[0]:    next_x = cur_p[0]    next_y = cur_p[1] + 1   if sum_n == 0:    next_x = cur_p[0]    next_y = cur_p[1] + 1  else:   raise Exception("get end route error")  if last_p[0] == next_x and last_p[1] == next_y:   if next_x < cur_p[0]:    max_w = 5    next_x = cur_p[0] + 1    next_y = cur_p[1] + 1   else:    max_w = 3    next_x = cur_p[0] - 1    next_y = cur_p[1] + 1  last_p = cur_p  if next_x > right_limit:   next_x = right_limit   next_y = cur_p[1] + 1  if next_x < left_limit:   next_x = left_limit   next_y = cur_p[1] + 1  cur_p = (next_x,next_y)  end_route.append(cur_p) return end_routedef get_split_seq(projection_x): split_seq = [] start_x = 0 length = 0 for pos_x, val in enumerate(projection_x):  if val == 0 and length == 0:   continue  elif val == 0 and length != 0:   split_seq.append([start_x, length])   length = 0  elif val == 1:   if length == 0:    start_x = pos_x   length += 1  else:   raise Exception('generating split sequence occurs error') # 循環結束時如果length不為0,說明還有一部分需要append if length != 0:  split_seq.append([start_x, length]) return split_seqdef do_split(source_image, starts, filter_ends): """ 具體實行切割 : param starts: 每一行的起始點 tuple of list : param ends: 每一行的終止點 """ left = starts[0][0] top = starts[0][1] right = filter_ends[0][0] bottom = filter_ends[0][1] pixdata = source_image.load() for i in range(len(starts)):  left = min(starts[i][0], left)  top = min(starts[i][1], top)  right = max(filter_ends[i][0], right)  bottom = max(filter_ends[i][1], bottom) width = right - left + 1 height = bottom - top + 1 image = Image.new('RGB', (width, height), (255,255,255)) for i in range(height):  start = starts[i]  end = filter_ends[i]  for x in range(start[0], end[0]+1):   if pixdata[x,start[1]] == 0:    image.putpixel((x - left, start[1] - top), (0,0,0)) return imagedef drop_fall(img): """滴水分割""" width,height = img.size # 1 二值化 b_img = binarizing(img,200) # 2 垂直投影 hist_width = vertical(b_img) # 3 獲取起點 start_x = get_start_x(hist_width) # 4 開始滴水算法 start_route = [] for y in range(height):  start_route.append((0,y)) end_route = get_end_route(img,start_x,height) filter_end_route = [max(list(k)) for _,k in groupby(end_route,lambda x:x[1])] # 注意這里groupby img1 = do_split(img,start_route,filter_end_route) img1.save('cuts-d-1.png') start_route = list(map(lambda x : (x[0]+1,x[1]),filter_end_route)) # python3中map不返回list需要自己轉換 end_route = [] for y in range(height):  end_route.append((width-1,y)) img2 = do_split(img,start_route,end_route) img2.save('cuts-d-2.png')if __name__ == '__main__': p = Image.open("cuts-2.png") drop_fall(p)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲福利在线播放| 7777精品久久久久久| 青青草99啪国产免费| 中文字幕欧美精品在线| 色老头一区二区三区| 日韩福利伦理影院免费| 国产精品久久不能| 尤物yw午夜国产精品视频| 91美女片黄在线观看游戏| 久久成人av网站| 欧美在线视频免费观看| 亚洲伊人成综合成人网| 91九色国产社区在线观看| 91精品久久久久久久久青青| 久久久久99精品久久久久| 国语自产偷拍精品视频偷| 亚洲男子天堂网| 国产91在线播放精品91| 国产精品高清在线观看| 国产成人在线一区二区| 精品色蜜蜜精品视频在线观看| 欧美日韩视频在线| 亚洲欧洲一区二区三区久久| 三级精品视频久久久久| 自拍亚洲一区欧美另类| 成人免费在线视频网站| 亚洲天堂免费在线| 亚洲毛片一区二区| 亚洲福利视频网站| 96sao精品视频在线观看| 久久不射电影网| 久久久www成人免费精品| 久久成人精品一区二区三区| 国产在线拍偷自揄拍精品| 亚洲剧情一区二区| 欧美大肥婆大肥bbbbb| 国产精品成人aaaaa网站| 九九热这里只有精品免费看| 国产精品久久久久久久久久ktv| 中文字幕亚洲欧美日韩2019| 欧美激情国产精品| 亚洲欧美在线免费观看| 国产欧美va欧美va香蕉在| 国产偷国产偷亚洲清高网站| 日韩精品在线第一页| 国产女人精品视频| 都市激情亚洲色图| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品久久久亚洲| 国产精品一区二区久久| 日韩黄色高清视频| 亚洲精品v欧美精品v日韩精品| 欧美自拍视频在线| 亚洲国产日韩欧美在线动漫| 亚洲男女性事视频| 日本不卡免费高清视频| 精品久久久91| 亚洲一区二区国产| 国产精品 欧美在线| 国内精品一区二区三区四区| 国产精品极品美女粉嫩高清在线| 亚洲国产高潮在线观看| 久久久久免费视频| 欧美精品免费播放| 色综合久久天天综线观看| 精品精品国产国产自在线| 亚洲综合一区二区不卡| 国产亚洲欧美日韩美女| 欧美性生活大片免费观看网址| 亚洲视频国产视频| 国产精品爱久久久久久久| 国产最新精品视频| 亚洲深夜福利视频| 国产成人在线一区| 久久久国产一区二区三区| 久久久亚洲精品视频| 国产欧美精品日韩精品| 亚洲综合精品伊人久久| 国产午夜精品全部视频在线播放| 欧美区二区三区| 亚洲一区二区自拍| 欧美午夜www高清视频| 亚洲精品福利在线| 国产精品视频永久免费播放| 亚洲一区美女视频在线观看免费| 久久精品视频中文字幕| 国产精品免费久久久久久| 亚洲视频第一页| 北条麻妃一区二区在线观看| 97视频在线观看视频免费视频| 精品中文视频在线| 国产中文日韩欧美| 久久深夜福利免费观看| 欧美理论片在线观看| 这里只有精品视频| 青青青国产精品一区二区| 日韩欧美成人网| 亚洲高清福利视频| 国产热re99久久6国产精品| 欧美三级欧美成人高清www| 欧美极品少妇全裸体| 日韩精品在线观看网站| 最近中文字幕mv在线一区二区三区四区| 欧美精品久久一区二区| 欧美电影第一页| 国产一区二区三区在线观看网站| 亚洲精品福利资源站| 欧美性xxxxx极品娇小| 亚洲视频免费一区| 国模精品视频一区二区三区| 国产欧美日韩丝袜精品一区| 成人信息集中地欧美| 成人激情视频小说免费下载| 茄子视频成人在线| 日本一区二区三区四区视频| 中文字幕精品视频| 911国产网站尤物在线观看| 日产精品久久久一区二区福利| 亚洲精品国产拍免费91在线| 亚洲综合自拍一区| 国产精品久久久久久久天堂| 欧美日韩亚洲91| 久久久久久91| 精品亚洲一区二区三区| 欧美性受xxxx黑人猛交| 福利二区91精品bt7086| 国产亚洲成av人片在线观看桃| 久久久久国产一区二区三区| 国产精品7m视频| 精品中文字幕在线| 91精品久久久久久久久久另类| 日韩美女视频免费看| 精品露脸国产偷人在视频| 亚洲视频在线免费观看| 日韩精品一区二区三区第95| 日韩免费在线观看视频| 国产精品成人久久久久| 性亚洲最疯狂xxxx高清| 国模吧一区二区| 国产精品久久久久久久久男| 欧美激情在线播放| 激情亚洲一区二区三区四区| 日韩国产欧美精品在线| 亚洲白拍色综合图区| 亚洲综合中文字幕68页| 亚洲精选一区二区| 成人激情视频小说免费下载| 一个人www欧美| 成人精品福利视频| 久久国产精品亚洲| 日韩欧美成人免费视频| 国产亚洲欧美另类中文| 中文字幕精品一区久久久久| 成人妇女淫片aaaa视频| 亚洲aa中文字幕| 91av在线免费观看视频| 91精品国产成人| 亚洲激情视频在线| 57pao成人国产永久免费| 亚洲xxxxx性| 国产精品小说在线| 三级精品视频久久久久| 国内精品视频在线| 97av在线视频|