• python中验证码连通域分割的方法详解


    python中验证码连通域分割的方法详解

    这篇文章主要给大家介绍了关于python中验证码连通域分割的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    实现思路

    是用深度遍历,对图片进行二值化处理,先找到一个黑色像素,然后对这个像素的周围8个像素进行判断,如果没有访问过,就保存起来,然后最后这个数组的最小x和最大x就是x轴上的切割位置。这种分割的方法还是只能适用于没有粘连的验证码,比垂直分割的好处是,可以处理位置比较奇怪的验证码。
    示例代码    
    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 1))
     return cuts
      
    def saveSmall(img, outDir, cuts):
     w, h = img.size
     pixdata = img.load()
     for i, item in enumerate(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))
    总结
    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值

     

  • 相关阅读:
    Reactor Cooling(无源汇有上下界网络流)
    费用流——消圈算法
    中间数(二分)+单调队列
    使用ServerSocket建立聊天服务器(二)
    使用ServerSocket建立聊天服务器(一)
    ServerSocket的建立和使用
    Socket介绍
    使用HttpClient进行Post通信
    使用HttpClient进行Get通信
    使用Post进行Http通信
  • 原文地址:https://www.cnblogs.com/amengduo/p/9586243.html
Copyright © 2020-2023  润新知