验证码识别(最简单之印刷体数字)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证码识别(最简单之印刷体数字)相关的知识,希望对你有一定的参考价值。

# -*- coding: utf-8 -*-  
import numpy
from PIL import Image

image = Image.open("5.gif")

heigh = image.size[0]
weigh = image.size[1]

checkbox = ([-1,0],[0,1],[1,0],[0,-1])

#降噪除去一个点
def clearpoint(im):
   for i in range(heigh):
       for j in range(weigh):
            if im.getpixel((i,j))==0:
                 result = 0
                 for count in range(4):
                     if im.getpixel((i+checkbox[count][0],j+checkbox[count][1])):result+=1
                 if result == 4:
                     im.putpixel((i,j),255)
   return im


box = numpy.array([0,0,13,20])
imagenumsit = []   #chun cun 5 ge shuzi
imagenumbit = []
imagedoublevalue = image.convert("1")
imagedoublevalue = clearpoint(imagedoublevalue)
resultnum = 0
for i in range(5):
    imagenum = imagedoublevalue.crop(box)
    imagenumsit.append(imagenum)
    box[0]=box[2]
    box[2]+=9

for i in range(5):
    w = imagenumsit[i].size[0]
    h = imagenumsit[i].size[1]
    vector = [0]*w
    imagenumbitsingle = numpy.tile(vector,(h,1))
    for x in range(h):
       for y in range(w):
           if imagenumsit[i].getpixel((y,x)) == 0:imagenumbitsingle[x][y]=1
    imagenumbit.append(imagenumbitsingle)

imagenumsit[1].show()
print imagenumbit[1]

 代码用来分隔图像并且把图像二值化,分别保存。

python代码实现记录:

  • 对Pillow库的使用,基本图像操作。
  • image.size[0]表示图像的像素高度,类似于矩阵的表示方式,image.size[1]为图像的长度。
  • image.getpixel((i,j)) ,对于图像(i,j)坐标的像素取颜色值,因为这里已经做过二值化,所以黑色值为0,白色值为255,降噪函数用搜索,把单独(周围都是白色像素点)黑色像素点去除掉
  • image.convert(),用于转换RGB图像,PIL中所有格式的图像open()后都是RGB图像或者L图像(灰度图),共可以转化为九种模式图像:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
  1. “1”:二值化图像,非黑即白,0表示黑,255表示白
  2. “L”:灰度图像,0-255表示不同灰度,转换公式:L=R * 299/1000 + G * 587/1000+ B * 114/1000
  3. “P”:8bit彩色图像
  4. “RGBA”:32bit彩色图像,其中24bit通道表示红绿蓝,剩下8bit表示透明度(alpha),alpha默认值:255(完全不透明)
  5. “CMYK”:32bit彩色图像,其中多出8bit来表示黑色油墨度,四种标准颜色是:C:Cyan = 青色,又称为‘天蓝色’或是‘湛蓝’M:Magenta = 品红色,又称为‘洋红色’;Y:Yellow = 黄色;K:Key Plate(blacK) = 定位套版色(黑色),K默认值:0
  6. “YCbCr”:24bit彩色图像:Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量,转换公式Y= 0.257*R+0.504*G+0.098*B+16;Cb = -0.148*R-0.291*G+0.439*B+128;Cr = 0.439*R-0.368*G-0.071*B+128,
  7. “I”:32bit灰度图像,其中每个像素用0-255色度表示,转换公式:I = R * 299/1000 + G * 587/1000 + B * 114/1000
  8. “F”:32bit浮点灰度图像,其中每个像素用0-255色度表示,转换公式:F = R * 299/1000+ G * 587/1000 + B * 114/1000

 

以上是关于验证码识别(最简单之印刷体数字)的主要内容,如果未能解决你的问题,请参考以下文章

Java实现超简单验证码识别

验证码识别与生成类API调用的代码示例合集:六位图片验证码生成四位图片验证码生成简单验证码识别等

利用pytesser识别图形验证码

简单验证码识别入门

爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别

验证码识别之效果不太理想(上)