ToB企服应用市场:ToB评测及商务社交产业平台

标题: 数据挖掘(八) [打印本页]

作者: 怀念夏天    时间: 2024-11-4 22:43
标题: 数据挖掘(八)
数据挖掘(八)


  
   从图像中抽取信息很难,图像包罗大量原始数据,图像的尺度编码单元像素提供的信息量很少。图像特别是照片可能存在一系列标题,比如含糊不清、离目标太近、光线太亮或太暗、比例失真、残缺、扭曲等,这会增加计算机体系抽取有用信息的难度。本文先容如何用神经网络辨认图像中的字母,从而主动辨认验证码CAPTCHA。
  人工神经网络

  f ( x ) = L 1 + e − k ( x − x 0 ) f(x) = \frac{L}{1 + e^-k(x-x0)} f(x)=1+e−k(x−x0)L​
创建数据集

   我们以破解网站4个字母的英文单词的验证码为例,编写步伐还原图像中的单词。步骤是把大图像分成只包罗一个字母的4张小图像,为每个字母分类,把字母重新组合为单词,用词典修正单词辨认错误。假设验证码中的单词是一个完备的有用的英文单词,长度为4个字母,现实上我们利用同一个词典生成和破解验证码;单词全部字母均为大写情势,不实用符号、数字或空格。为了增加难度,再生成图像时对单词利用差异的错切变化效果。
  绘制验证码

  1. import numpy as np
  2. from PIL import Image, ImageDraw, ImageFont
  3. from skimage import transform as tf
  4. from matplotlib import pyplot as plt
  5. # 生成验证码的基础函数,接收一个单词和错切值(通常在0到0.5之间),还可以指定图像大小
  6. def create_captcha(text, shear=0, size=(100, 24)):
  7.     # 使用字母L生成一张黑白图像,为ImageDraw类初始化一个实例
  8.     im = Image.new('L', size, 'black')
  9.     draw = ImageDraw.Draw(im)
  10.     # 指定验证码文字所使用的字体
  11.     font = ImageFont.truetype(r'C:\Windows\Fonts\Gabriola.ttf', 22)
  12.     draw.text((2, 2), text, fill=1, font=font)
  13.     # 把PIL图像转换为numpy数组
  14.     image = np.array(im)
  15.     # 应用错切变化效果,返回图像
  16.     affine_tf = tf.AffineTransform(shear=shear)
  17.     # 根据给定的坐标变换图像
  18.     image = tf.warp(image, affine_tf)
  19.     # 对图像特征进行归一化处理,确保特征值落在0~1之间
  20.     return image/image.max()
  21. image = create_captcha('JOHN', shear=0.5)
  22. plt.imshow(image, cmap='gray')
  23. plt.show()
复制代码
  1. from skimage.measure import label, regionprops
  2. # 图像分割函数接收图像,返回小图像列表,每张小图像为单词的一个字母
  3. def segment_iamge(image):
  4.     # 检测每个字母的位置,使用label函数能找出图像中像素值相同且由连接在一起的像素块
  5.     # label函数参数是图像数组,返回跟输入同型的数组,在返回的数组中图像连接在一起的区域用不同的值表示,在这些区域以外的像素用0表示
  6.     labeled_image = label(image > 0)
  7.     subimages = []
  8.     # regionprops函数可以抽取连续区域,遍历这些区域分别处理,通过region对象获取到当前区域的相关信息
  9.     for region in regionprops(labeled_image):
  10.         # 用当前区域的起始位置坐标作为索引就能抽取到小图像
  11.         start_x, start_y, end_x, end_y = region.bbox
  12.         subimages.append(image[start_x:end_x, start_y:end_y])
  13.     # 没有找到小图像就把原图像作为子图返回
  14.     if len(subimages) == 0:
  15.         return [image,
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4