python中验证码连通域分割的方法详解
实现思路
是用深度遍历,对图片进行二值化处理,先找到一个黑色像素,然后对这个像素的周围8个像素进行判断,如果没有访问过,就保存起来,然后最后这个数组的最小x和最大x就是x轴上的切割位置。这种分割的方法还是只能适用于没有粘连的验证码,比垂直分割的好处是,可以处理位置比较奇怪的验证码。
示例代码
defcfs(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=[] forxinrange(w): foryinrange(h): x_axis=[] #y_axis=[] ifpixdata[x,y]==0and(x,y)notinvisited: q.put((x,y)) visited.add((x,y)) whilenotq.empty(): x_p,y_p=q.get() forx_offset,y_offsetinoffset: x_c,y_c=x_p+x_offset,y_p+y_offset if(x_c,y_c)invisited: continue visited.add((x_c,y_c)) try: ifpixdata[x_c,y_c]==0: q.put((x_c,y_c)) x_axis.append(x_c) #y_axis.append(y_c) except: pass ifx_axis: min_x,max_x=min(x_axis),max(x_axis) ifmax_x-min_x>3: #宽度小于3的认为是噪点,根据需要修改 cuts.append((min_x,max_x+1)) returncuts defsaveSmall(img,outDir,cuts): w,h=img.size pixdata=img.load() fori,iteminenumerate(cuts): box=(item[0],0,item[1],h) img.crop(box).save(outDir+str(i)+".png") img=Image.open('out/51.png') saveSmall(img,'cfs/',cfs(img))
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
参考这篇文章:https://www.nhooo.com/article/141434.htm