3

我想以与标准 CAPTCHA 对字体进行排序相同的方式对一些图像进行排序。我将如何在 python 中实现它?我应该使用哪些库/算法?任何概念验证?

免责声明:在我问这个问题之前,我在谷歌上搜索了一段时间,但我找不到任何令人满意的答案。我是该领域的新手,所以我无法提供任何代码证明我的“研究努力”......

4

4 回答 4

7

我认为您正在寻找 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)

其余代码本质上是为了生成使用的网格。

于 2013-10-03T01:42:45.360 回答
2

简单地说:你有一个图像,它是一个二维数组,每个数组元素代表一个像素。扭曲图像意味着您将一些像素值也放在以前没有的相邻位置。

为了给你举个例子,我从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()
于 2013-09-30T11:38:23.053 回答
2

使图像失真意味着将一个像素与其任何相邻像素进行混洗。

如果算法对远处的像素进行混洗,则失真度很高,如果对附近的像素进行混洗,则失真度较低

几天前我曾研究过类似的问题,为此我使用了 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))

我有一个样本:输入图像在此处输入图像描述 输出图像在此处输入图像描述

我希望这有帮助。

于 2013-10-08T08:26:35.863 回答
0

您可以调整django-simple-captchacaptcha_image的代码,https ://raw.github.com/mbi/django-simple-captcha/master/captcha/views.py 中有一个您可以轻松调整的函数。

于 2013-10-07T21:11:16.543 回答