百度指数数据抓取Python+selenuim+OpenCV(二)

(四)在浏览器截图中找到所需要的数字区域

 在这个过程中用到了开头所说的aircv这个库,该库中有一个方法可以匹配目标图片在指定图片中的位置。首先我们
先用截图软件截取目标图片如下所示:
所用的方法如下所示:
 # 打开截图切割
            im = cv2.imread(str(path) + ".png")
            obj = cv2.imread("../baidu/obj.png")
            pos = ac.find_template(im, obj)
            ran = pos["rectangle"]
            objrex = ran[2][0] - ran[0][0]
            objrey = ran[1][1] - ran[0][1]
            re = im[ran[0][1] + int(1.0 / 2.0 * objrey):ran[3][1],
                 ran[0][0] + int(1.0 / 4.0 * objrex):ran[3][0] - int(1.0 / 2.0 * objrex)]
            cv2.imwrite(str(path) + "y.png", re)
在得到上述图片的区域之后,按照一定的比例将图中的数字部分截取下来(这个得考自己调整不同的内容不同),代码如下:
 im = cv2.imread(path+"3.png")
    obj = cv2.imread(path+"obj.png")
    pos = ac.find_template(im,obj)
    ran = pos["rectangle"]
    objrex = ran[2][0] - ran[0][0]
    objrey = ran[1][1] - ran[0][1]
    re = im[ran[0][1]+int(1.0/2.0*objrey):ran[3][1],ran[0][0]+int(1.0/4.0*objrex):ran[3][0]-int(1.0/2.0*objrex)]
    cv2.imwrite('./aa.png',re)
所得到图片:


(五)数据图片处理切割

将得到的数字图片区域去噪,二值化,放大,并且颜色反转之后进行数字切割:
图片处理
 image = Image.open(str(path) + "y.png")
        imgry = image.convert('L')
        binary = imgry.point(initTable(), '1')
        im1 = binary.convert('L')
        im2 = ImageOps.invert(im1)
        im3 = im2.convert('1')
        im4 = im3.convert('L')
        (x, y) = im4.size
        x_s = x * 2
        y_s = y * 2
        out = im4.resize((x_s, y_s), Image.ANTIALIAS)
        out.save(str(path) + "c.jpg")
处理后得到的图片(样例图片可能不一致):
处理完图片后将图片进行切割:
 image = Image.open(path+ "c.jpg")
    x1 = 5
    y1 = 20
    x2 = 25
    y2 = 56
    res = []
    for i in range(6):#6是切割区域数目
        rangle = (x1,y1,x2,y2)
        cr = image.crop(rangle)
        cr.save(path+str(i)+".jpg")
        x1 = x1 + 20
        x2 = x2 + 20
切割玩后图片: 。。。。不一一显示


上面那么多都是在处理从网上抓取数据的图片,是属于爬虫的部分,但是在抓取完该部分的图片后进行数字识别也是一个重点。
我在网上看到的大部分教程基本都是用第四部得到的第一个图直接放大调用方法识别字符串,但是准确的不能达到100%,所以
我就自己用了一个简单的分类器,下面主要介绍图片文本分类的过程。




你可能感兴趣的:(百度指数数据抓取Python+selenuim+OpenCV(二))