我想以与标准 CAPTCHA 对字体进行排序相同的方式对一些图像进行排序。我将如何在 python 中实现它?我应该使用哪些库/算法?任何概念验证?
免责声明:在我问这个问题之前,我在谷歌上搜索了一段时间,但我找不到任何令人满意的答案。我是该领域的新手,所以我无法提供任何代码证明我的“研究努力”......
我想以与标准 CAPTCHA 对字体进行排序相同的方式对一些图像进行排序。我将如何在 python 中实现它?我应该使用哪些库/算法?任何概念验证?
免责声明:在我问这个问题之前,我在谷歌上搜索了一段时间,但我找不到任何令人满意的答案。我是该领域的新手,所以我无法提供任何代码证明我的“研究努力”......
我认为您正在寻找 PyCaptcha http://svn.navi.cx/misc/trunk/pycaptcha/
扭曲的实际代码在这里:http ://svn.navi.cx/misc/trunk/pycaptcha/Captcha/Visual/Distortions.py
这项工作是由 PIL 的 transform 函数完成的,如下所示:
image.transform(image.size, Image.MESH, mesh, self.filtering)
其余代码本质上是为了生成使用的网格。
简单地说:你有一个图像,它是一个二维数组,每个数组元素代表一个像素。扭曲图像意味着您将一些像素值也放在以前没有的相邻位置。
为了给你举个例子,我从matplotlib
;中修改了一个例子。我将常规的 x/y 重新定位到不规则的间距,从而扭曲了图像。对于验证码外观,你必须想出一些比我更有创意的重新映射。更专业的显然是将值重新映射到数组以保持规则间隔的数据。
因此,您仍然可以玩一些乐趣(;希望这对您有所帮助。
import pylab as P
import numpy as N
# http://matplotlib.org/examples/images_contours_and_fields
# /pcolormesh_levels.html
dx, dy = 0.05, 0.05
y, x = N.mgrid[slice(1, 5 + dy, dy),
slice(1, 5 + dx, dx)]
z = N.sin(x) ** 10 + N.cos(10 + y * x) * N.cos(x)
#distort from regular pixels to something else...
x1 = N.exp(x)
y1 = N.sqrt(y)
P.figure()
P.pcolormesh(x,y,z)
P.figure()
P.pcolormesh(x1,y1,z)
P.show()
使图像失真意味着将一个像素与其任何相邻像素进行混洗。
如果算法对远处的像素进行混洗,则失真度很高,如果对附近的像素进行混洗,则失真度较低
几天前我曾研究过类似的问题,为此我使用了 PIL。
import math
from PIL import Image
img = Image.open('image.jpg') #open a image
width ,height = img.size
img_data = img.load() #loading it, for fast operation
output = Image.new('RGB',img.size,"gray") #New image for putput
output_img = output.load() #loading this also, for fast operation
pix=[0, 0]
delta_x = 40 #you can lower the delta for high distortion
delta_y = 90 #or you can higher the delta for low distortion
for x in range(width):
for y in range(height):
#following expression calculates the snuffling
x_shift, y_shift = ( int(abs(math.sin(x)*width/delta_x)) ,
int(abs(math.tan(math.sin(y)))*height/delta_y))
#checking bounds
if x + x_shift < width:
pix[0] = x + x_shift
else:
pix[0] = x
if y + y_shift < height :
pix[1] = y + y_shift
else:
pix[1] = y
# do the shuffling
output_img[x,y] = img_data[tuple(pix)]
#Saving the image
output.save('output.jpeg')
下面的表达式是这里的关键,你可以通过做一点数学来修改或创建任何类似的表达式,尽管这也可能适合你。
x_shift, y_shift = ( int(abs(math.sin(x)*width/delta_x)) ,
int(abs(math.tan(math.sin(y)))*height/delta_y))
我有一个样本:输入图像 输出图像
我希望这有帮助。
您可以调整django-simple-captchacaptcha_image
的代码,https ://raw.github.com/mbi/django-simple-captcha/master/captcha/views.py 中有一个您可以轻松调整的函数。