一、前言

各种网站的数据都是宝贵的资源,资源要体现出它的价值就要提供给用户使用,但是使用的时候,总有人想把你的数据搞走。网站为了维护自己的利益就会想各种的办法把数据保护起来。常用的手段就是限制用户访问,限制你的IP。还有的就是吧文本转化成图片或者是视频,音频,然后就算你把数据爬了过去,也用不了。
本文就教大家怎么遇处理图片-处理图片中的干扰,但是不涉及这么识别图片中的文字,如果只是想知道怎么识别文字,请参考其他相关的文章或是我后续的博客。

二、本文要用到到工具

  • Jupter notebook : Python 的浏览器IDE,神器
  • Python : Version: 3.0
  • PIL : python的pillow,图片处理库,强大到没有朋友,没有安装的童鞋请自己安装
  • matplotlib : 生成图片用的,强大到没有女朋友 ,没有安装的童鞋请自己安装

三、观察图片

如下的图片,我们需要的文字被网站的开发者裹的严严实实,不但把数据转化成了图片,而且图片上面还加了各种的干扰文字。这些开发人员我想也是被产品逼的吧。现在我们就来个大法,破了他的道。这个图片,为什么我们的眼睛能够分别出图片中的信息,肯定不是你牛,而是你的区别不同的颜色。这就是根本原因,有了这个思想我们就接着向下走。

tesseract 图片识别去除背景干扰_Image

四、撸代码

1.导入库

from PIL import Image #图片处理
import matplotlib.pyplot as plt #画表格图片

2 打开我们的备用图片,就是上面的那个货

img = Image.open("/home/tianwei/QQ图片20171222141102.png")
img = img.convert("RGB")

这个图片本身是PNG,它是四通道的图片(RGBA),为了方便处理,我们把它转化成RGB图片,看上去基本没有变化,对我们以后的文字识别没有任何的影响。

3. 分析下图片的颜色值的分布

下面的代码有点长,简要概括就是每个颜色的出现次数统计了一下,然后丢给plot画出来,便于观察,颜色出现次数很多的我过滤掉了,这样图片稍微好看一些。不想看代码的话就看后面的图片。

newImg = Image.new("RGB", img.size, (255,255,255,255))
#字典转list
def dict2list(dic:dict):
    keys = dic.keys()
    vals = dic.values()
    lst = [(key, val) for key, val in zip(keys, vals)]
    return lst
w,h = img.size
a = {}
#统计颜值出现的次数
for i in range(w):
    for j in range(h):
        r,g,b = img.getpixel((i,j))
        t = r*255*255 + g * 255 + b
        if t in a.keys():
            a[t] =  a[t] + 1
        else:
            a[t]  = 1
l = sorted(dict2list(a), key=lambda x:x[1], reverse=True)
dic = {}
#去掉出现次数太多的颜色,不影响我们的观察
for i in l:
    if(i[1] < 500):
        dic[i[0]] = i[1]
#下面的代码是画图用的
plt.figure(1, figsize=(20,5))
plt.scatter(dic.keys(), dic.values(), linewidth=1)
plt.legend()
plt.show()

完成以后得到如下的颜色分布图,x是颜色值,y是出现的次数,很明显的看到颜值在6000000与8000000的中间出现了一个断层,这就是我们想要的颜值分界线,太丑的点我们要把它去掉。

tesseract 图片识别去除背景干扰_Image_02

4 生成一个新的图片

# New 一个与原图一样大小的图片,默认用白色填充
rmg = Image.new("RGB", img.size, (255,255,255,255))
for i in range(w):
    for j in range(h):
        r,g,b = img.getpixel((i,j))
        t = r*255*255 + g * 255 + b
        #小与颜值分界线的点我们就把颜色填充到新的图片上面
        if(t<7000000):
            rmg.putpixel((i,j), (r,g,b))
rmg

大功告成的图片,一个大写的完美,请客官看图,啥也不说了

tesseract 图片识别去除背景干扰_数据_03

五、后记

这篇文章只是教大家怎么预处理图片,并没有教大家怎么识别图片,如果你想识别图片的话,请用百度的通用文字识别AI,溜的飞起。如果大家想知道怎么用Tensorflow的神经网络模型去训练,大家可以给我留言,我在以后的博客中教大家.