<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [博客園CNblogs@小五義](http://www.cnblogs.com/xiaowuyi) 用python加“驗證碼”為關鍵詞在baidu里搜一下,可以找到很多關于驗證碼識別的文章。我大體看了一下,主要方法有幾類:一類是通過對圖片進行處理,然后利用字庫特征匹配的方法,一類是圖片處理后建立字符對應字典,還有一類是直接利用ocr模塊進行識別。不管是用什么方法,都需要首先對圖片進行處理,于是試著對下面的驗證碼進行分析。 ????????**一、圖片處理** ![](http://pic002.cnblogs.com/images/2012/383503/2012090716463726.png) ??????? 這個驗證碼中主要的影響因素是中間的曲線,首先考慮去掉圖片中的曲線。考慮了兩種算法: ??????? 第一種是首先取到曲線頭的位置,即x=0時,黑點的位置。然后向后移動x的取值,觀察每個x下黑點的位置,判斷前后兩個相鄰黑點之間的距離,如果距離在一定范圍內,可以基本判斷該點是曲線上的點,最后將曲線上的點全部繪成白色。試了一下這種方法,結果得到的圖片效果很一般,曲線不能完全去除,而且容量將字符的線條去除。 ??????? 第二種考慮用單位面積內點的密度來進行計算。于是首先計算單位面積內點的個數,將單位面積內點個數少于某一指定數的面積去除,剩余的部分基本上就是驗證碼字符的部分。本例中,為了便于操作,取了5*5做為單位范圍,并調整單位面積內點的標準密度為11。處理后的效果: ![](http://pic002.cnblogs.com/images/2012/383503/2012090716461987.jpg) ????????**二、字符驗證** ??????? 這里我使用的方法是利用pytesser進行ocr識別,但由于這類驗證碼字符的不規則性,使得驗證結果的準確性并不是很高。具體哪位大牛,有什么好的辦法,希望能給指點一下。 ????????**三、準備工作與代碼實例** ??????? 1、PIL、pytesser、tesseract (1)安裝PIL:下載地址:http://www.pythonware.com/products/pil/ ??????? (2)pytesser:下載地址:http://code.google.com/p/pytesser/ ,下載解壓后直接放在代碼相同的文件夾下,即可使用。 (3)Tesseract OCR engine下載:http://code.google.com/p/tesseract-ocr/ 下載后解壓,找到tessdata文件夾,用其替換掉pytesser解壓后的tessdata文件夾即可。 [TOC] 2、具體代碼 ![復制代碼](http://common.cnblogs.com/images/copycode.gif) ~~~ #encoding=utf-8 ###利用點的密度計算 import Image,ImageEnhance,ImageFilter,ImageDraw import sys from pytesser import * #計算范圍內點的個數 def numpoint(im): w,h = im.size data = list( im.getdata() ) mumpoint=0 for x in range(w): for y in range(h): if data[ y*w + x ] !=255:#255是白色 mumpoint+=1 return mumpoint #計算5*5范圍內點的密度 def pointmidu(im): w,h = im.size p=[] for y in range(0,h,5): for x in range(0,w,5): box = (x,y, x+5,y+5) im1=im.crop(box) a=numpoint(im1) if a<11:##如果5*5范圍內小于11個點,那么將該部分全部換為白色。 for i in range(x,x+5): for j in range(y,y+5): im.putpixel((i,j), 255) im.save(r'img.jpg') def ocrend():##識別 image_name = "img.jpg" im = Image.open(image_name) im = im.filter(ImageFilter.MedianFilter()) enhancer = ImageEnhance.Contrast(im) im = enhancer.enhance(2) im = im.convert('1') im.save("1.tif") print image_file_to_string('1.tif') if __name__=='__main__': image_name = "1.png" im = Image.open(image_name) im = im.filter(ImageFilter.DETAIL) im = im.filter(ImageFilter.MedianFilter()) enhancer = ImageEnhance.Contrast(im) im = enhancer.enhance(2) im = im.convert('1') ##a=remove_point(im) pointmidu(im) ocrend() ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看