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