激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 爬蟲Python驗(yàn)證碼識(shí)別入門

爬蟲Python驗(yàn)證碼識(shí)別入門

2021-12-26 13:40李國(guó)寶 Python

這篇文章主要介紹了爬蟲Python驗(yàn)證碼識(shí)別,屬于入門級(jí)別的介紹,剛接觸爬蟲的朋友可以參考如下

爬蟲python驗(yàn)證碼識(shí)別

前言:

二值化、普通降噪、8鄰域降噪
tesseract、tesserocr、pil
參考文獻(xiàn)--代碼地址:https://github.com/liguobao/python-verify-code-ocr

 1、批量下載驗(yàn)證碼圖片

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import shutil
import requests
from loguru import logger
 
for i in range(100):
    url = 'http://xxxx/create/validate/image'
    response = requests.get(url, stream=true)
    with open(f'./imgs/{i}.png', 'wb') as out_file:
        response.raw.decode_content = true
        shutil.copyfileobj(response.raw, out_file)
        logger.info(f"download {i}.png successfully.")
    del response

爬蟲Python驗(yàn)證碼識(shí)別入門

爬蟲Python驗(yàn)證碼識(shí)別入門

2、識(shí)別代碼看看效果

?
1
2
3
4
5
6
7
8
9
10
from pil import image
import tesserocr
img = image.open("./imgs/98.png")
img.show()
img_l = img.convert("l")# 灰階圖
img_l.show()
verify_code1 = tesserocr.image_to_text(img)
verify_code2 = tesserocr.image_to_text(img_l)
print(f"verify_code1:{verify_code1}")
print(f"verify_code2:{verify_code2}")

爬蟲Python驗(yàn)證碼識(shí)別入門

爬蟲Python驗(yàn)證碼識(shí)別入門

毫無疑問,無論是原圖還是灰階圖,一無所有。

 3、折騰降噪、去干擾

python圖片驗(yàn)證碼降噪 - 8鄰域降噪

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from pil import image
# https://www.cnblogs.com/jhao/p/10345853.html python圖片驗(yàn)證碼降噪 — 8鄰域降噪
 
 
def noise_remove_pil(image_name, k):
    """
    8鄰域降噪
    args:
        image_name: 圖片文件命名
        k: 判斷閾值
    returns:
    """
 
    def calculate_noise_count(img_obj, w, h):
        """
        計(jì)算鄰域非白色的個(gè)數(shù)
        args:
            img_obj: img obj
            w: width
            h: height
        returns:
            count (int)
        """
        count = 0
        width, height = img_obj.size
        for _w_ in [w - 1, w, w + 1]:
            for _h_ in [h - 1, h, h + 1]:
                if _w_ > width - 1:
                    continue
                if _h_ > height - 1:
                    continue
                if _w_ == w and _h_ == h:
                    continue
                if img_obj.getpixel((_w_, _h_)) < 230# 這里因?yàn)槭腔叶葓D像,設(shè)置小于230為非白色
                    count += 1
        return count
 
    img = image.open(image_name)
    # 灰度
    gray_img = img.convert('l')
 
    w, h = gray_img.size
    for _w in range(w):
        for _h in range(h):
            if _w == 0 or _h == 0:
                gray_img.putpixel((_w, _h), 255)
                continue
            # 計(jì)算鄰域非白色的個(gè)數(shù)
            pixel = gray_img.getpixel((_w, _h))
            if pixel == 255:
                continue
 
            if calculate_noise_count(gray_img, _w, _h) < k:
                gray_img.putpixel((_w, _h), 255)
    return gray_img
 
 
if __name__ == '__main__':
    image = noise_remove_pil("./imgs/1.png", 4)
    image.show()

看下圖效果:

爬蟲Python驗(yàn)證碼識(shí)別入門

這樣差不多了,不過還可以提升

提升新思路:

爬蟲Python驗(yàn)證碼識(shí)別入門

這邊的干擾線是從某個(gè)點(diǎn)發(fā)出來的紅色線條,

其實(shí)我只需要把紅色的像素點(diǎn)都干掉,這個(gè)線條也會(huì)被去掉。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pil import image
import tesserocr
img = image.open("./imgs/98.png")
img.show()
 
# 嘗試去掉紅像素點(diǎn)
w, h = img.size
for _w in range(w):
    for _h in range(h):
        o_pixel = img.getpixel((_w, _h))
        if o_pixel == (255, 0, 0):
            img.putpixel((_w, _h), (255, 255, 255))
img.show()
 
img_l = img.convert("l")
# img_l.show()
verify_code1 = tesserocr.image_to_text(img)
verify_code2 = tesserocr.image_to_text(img_l)
print(f"verify_code1:{verify_code1}")
print(f"verify_code2:{verify_code2}")

看起來ok,上面還有零星的藍(lán)色像素掉,也可以用同樣的方法一起去掉。

爬蟲Python驗(yàn)證碼識(shí)別入門

爬蟲Python驗(yàn)證碼識(shí)別入門

甚至ocr都直接出效果了
好了,完結(jié)撒花。
不過,后面發(fā)現(xiàn),有些紅色線段和藍(lán)色點(diǎn),是和驗(yàn)證碼重合的。
這個(gè)時(shí)候,如果直接填成白色,就容易把字母切開,導(dǎo)致識(shí)別效果變差。
當(dāng)前點(diǎn)是紅色或者藍(lán)色,判斷周圍點(diǎn)是不是超過兩個(gè)像素點(diǎn)是黑色。
是,填充為黑色。
否,填充成白色。

最終完整代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from pil import image
import tesserocr
from loguru import logger
 
 
class verfycodeocr():
    def __init__(self) -> none:
        pass
 
    def ocr(self, img):
        """ 驗(yàn)證碼ocr
 
        args:
            img (img): imgobject/imgpath
 
        returns:
            [string]: 識(shí)別結(jié)果
        """
        img_obj = image.open(img) if type(img) == str else img
        self._remove_pil(img_obj)
        verify_code = tesserocr.image_to_text(img_obj)
        return verify_code.replace("\n", "").strip()
 
    def _get_p_black_count(self, img: image, _w: int, _h: int):
        """ 獲取當(dāng)前位置周圍像素點(diǎn)中黑色元素的個(gè)數(shù)
 
        args:
            img (img): 圖像信息
            _w (int): w坐標(biāo)
            _h (int): h坐標(biāo)
 
        returns:
            int: 個(gè)數(shù)
        """
        w, h = img.size
        p_round_items = []
        # 超過了橫縱坐標(biāo)
        if _w == 0 or _w == w-1 or 0 == _h or _h == h-1:
            return 0
        p_round_items = [img.getpixel(
            (_w, _h-1)), img.getpixel((_w, _h+1)), img.getpixel((_w-1, _h)), img.getpixel((_w+1, _h))]
        p_black_count = 0
        for p_item in p_round_items:
            if p_item == (0, 0, 0):
                p_black_count = p_black_count+1
        return p_black_count
 
    def _remove_pil(self, img: image):
        """清理干擾識(shí)別的線條和噪點(diǎn)
 
        args:
            img (img): 圖像對(duì)象
 
        returns:
            [img]: 被清理過的圖像對(duì)象
        """
        w, h = img.size
        for _w in range(w):
            for _h in range(h):
                o_pixel = img.getpixel((_w, _h))
                # 當(dāng)前像素點(diǎn)是紅色(線段) 或者 綠色(噪點(diǎn))
                if o_pixel == (255, 0, 0) or o_pixel == (0, 0, 255):
                    # 周圍黑色數(shù)量大于2,則把當(dāng)前像素點(diǎn)填成黑色;否則用白色覆蓋
                    p_black_count = self._get_p_black_count(img, _w, _h)
                    if p_black_count >= 2:
                        img.putpixel((_w, _h), (0, 0, 0))
                    else:
                        img.putpixel((_w, _h), (255, 255, 255))
 
        logger.info(f"_remove_pil finish.")
        # img.show()
        return img
 
 
if __name__ == '__main__':
    verfycodeocr = verfycodeocr()
    img_path = "./imgs/51.png"
    img= image.open(img_path)
    img.show()
    ocr_result = verfycodeocr.ocr(img)
    img.show()
    logger.info(ocr_result)

爬蟲Python驗(yàn)證碼識(shí)別入門

到此這篇關(guān)于爬蟲python驗(yàn)證碼識(shí)別入門的文章就介紹到這了,更多相關(guān)python驗(yàn)證碼識(shí)別內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/liguobao/p/15111849.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人男女激情免费视频 | 蜜桃视频网站www | 色猫av | 最新中文字幕第一页视频 | av在线播放免费 | 亚洲少妇诱惑 | 欧美视频一区二区三区 | 调教小男生抽打尿孔嗯啊视频 | 国产精品视频一区二区三区四 | 国产亚洲精品久久 | 免费在线观看国产精品 | 亚洲一区在线视频观看 | 日韩一级成人 | 婷婷中文字幕一区二区三区 | videos真实高潮xxxx | 色悠悠久久久久 | 日韩av电影免费看 | 色av成人天堂桃色av | 毛片视频播放 | 国产精品视频二区不卡 | 久久久国产精品网站 | 国产91九色在线播放 | av电影在线观看免费 | 男女无遮挡羞羞视频 | 亚洲精品永久视频 | 久久区二区| 日本精品久久久一区二区三区 | 欧美一区二区三区中文字幕 | 欧美hdfree性xxxx | 91女上位 在线播放 bt 自拍 另类 综合 欧美 | 护士hd老师fre0性xxx | 亚洲资源在线播放 | 欧美成人高清视频 | 99国内精品 | 国产亚洲精品成人 | 看毛片的网址 | 99久久久国产精品露出 | 亚洲精品在线观看免费 | 蜜桃网站在线 | 狠狠干最新网址 | 新久草视频 |