十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
是的,不干扰,一次运行程序时,会产生一个keepWorking.txt 文件,可以修改这个文件中的变量。如果检测到已经存在这个文件,则读取文件中的配置。
成都创新互联公司2013年至今,是专业互联网技术服务公司,拥有项目网站设计制作、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元三门做网站,已为上家服务,为三门各地企业和个人服务,联系电话:18980820575
等待delay 秒后,让鼠标水平跳动pix 个像素,再等待delay 秒后,再跳回去。
到达maxDelay 秒时,程序退出,不再模拟操作鼠标。
click =1 表示鼠标移动后,是否模拟左击操作。设置为0可能起不到防止休眠的作用。
It's either a bug or unimplemented in PIL/Pillow. Here is a workaround:
import Image
image = Image.open("Fredy1_002.tif")
image.mode = 'I'
image.point(lambda i:i*(1./256)).convert('L').save('my.jpeg')
这里判断是否为灰度图的标准是:每一个像素所对应的R、G、B的值是否相等。
def is_color_image(url):
im=Image.open(url)
pix=im.convert('RGB')
width=im.size[0]
height=im.size[1]
oimage_color_type="Grey Image"
is_color=[]
for x in range(width):
for y in range(height):
r,g,b=pix.getpixel((x,y))
r=int(r)
g=int(g)
b=int(b)
if (r==g) and (g==b):
pass
else:
oimage_color_type='Color Image'
return oimage_color_type
可以使用 Python Image Library 做,load() 函数会返回一个对象,这个对象我们可以把它当作一个二维数组对待,而数组中存放的就是点的 RGB 值,可以很容易地访问到任何像素点的 RGB 值:
from PIL import Image
# 可以支持很多种图片格式.
im = Image.open("your_picture.jpg")
pix = im.load()
# 获得图片的尺度,可以用于迭代
print im.size
# 获得某个像素点的 RGB 值,像素点坐标由 [x, y] 指定
print pix[x,y]
# 设置 [x, y] 点的 RGB 的值为 value
pix[x,y] = value
遍历图片对象?可是怎么个遍历法呢?Pillow 提供了一个 .load() 方法,用来处理像素。图片嘛,当然是二维的,有宽和高的。
pixels = image.load()
for x in ramge(image.width):
for y in range(image.height):
pixsels[x, y] = 255 if pixsels[x, y] 125 else 0
当然了,只是最简单的二值化的话,直接 image.convert('1') 就可以了 :-)
最近在折腾验证码识别。最终的脚本的识别率在92%左右,9000张验证码大概能识别出八千三四百张左右。好吧,其实是验证码太简单。下面就是要识别的验证码。
我主要用的是Python中的PIL库。
首先进行二值化处理。由于图片中的噪点颜色比较浅,所以可以设定一个阈值直接过滤掉。这里我设置的阈值是150,像素大于150的赋值为1,小于的赋为0.
def set_table(a):
table = []
for i in range(256): if i a:
table.append(0) else:
table.append(1) return table
img = Image.open("D:/python/单个字体/A"+str(i)+".jpg")
pix = img.load()#将图片进行灰度化处理img1 = img.convert('L')#阈值为150,参数为1,将图片进行二值化处理img2 = img1.point(set_table(150),'1') 1234567891011121314151617
处理后的图片如下。
阈值不同产生的不同效果:
接下来对图片进行分割。遍历图片中所有像素点,计算每一列像素为0的点的个数(jd)。对于相邻两列,若其中一列jd=0,而另一列jd!=0,则可以认为这一列是验证码中字符边界,由此对验证码进行分割。这样分割能达到比较好的效果,分割后得到的字符图片几乎能与模板完全相同。
(Width,Height) = img2.size
pix2 = img2.load()
x0 = []
y0 = []for x in range(1,Width):
jd = 0
# print x
for y in range(1,Height): # print y
if pix2[x,y] == 0:
jd+=1
y0.append(jd) if jd 0:
x0.append(x)#分别对各个字符边界进行判断,这里只举出一个 for a in range(1,Width): if (y0[a] != 0)(y0[a+1] != 0):
sta1 = a+1
break123456789101112131415161718192021
分割完成后,对于识别,目前有几种方法。可以遍历图片的每一个像素点,获取像素值,得到一个字符串,将该字符串与模板的字符串进行比较,计算汉明距离或者编辑距离(即两个字符串的差异度),可用Python-Levenshtein库来实现。
我采用的是比较特征向量来进行识别的。首先设定了4个竖直特征向量,分别计算第0、2、4、6列每一列像素值为0的点的个数,与模板进行比较,若小于阈值则认为该字符与模板相同。为了提高识别率,如果通过竖直特征向量未能识别成功,引入水平特征向量继续识别,原理与竖直特征向量相同。
另外,还可以通过局部特征进行识别。这对于加入了旋转干扰的验证码有很好效果。由于我写的脚本识别率已经达到了要求,所以并没有用到这个。
最后的结果是这样的:
最终在模板库只有25条的情况下,识别率在92%左右(总共测试了一万六千张验证码)。好吧,只能说验证码太简单。。
以上。