图像

计划写一个爬虫的demo.之后,关于图像处理的应该不会再写了,技能点点错了.(2016.12.28)

5.简单验证码识别(pytesseract)
方法1:第三方库

pytesseract //通过pip安装
依赖:

1.OCR 光学识别 google tesseract-ocr 通过Homebrew安装
2.PIL (Pillow) //通过pip安装

ps: 通过brew安装的tesseract默认只识别英文和数字,如果要识别为中文的话,需要下载中文包,放入路径/usr/local/share/tessdata/chi_sim.traineddata中
使用方法:

import pytesseract

im = 预处理过的图片
text = pytesseract.image_to_string(im, lang='chi_sim')
//lang 需要识别的语言类型 .参数可省略,默认识别英文/数字

tent.com/tesseract-ocr/tessdata/master/chi_sim.traineddata

方法二:自己训练数据

应该算是做简单的数据训练了吧,(这里仅仅提取特征,是分类了而已,匹配而已,说不上训练)
[原作者的代码][53]
[担心原作者链接失效,fork了一份][54]
[53]:https://github.com/StandOpen/python_certify
[54]:https://github.com/EnjoyWT/python_certify

4.图片降噪

2.干扰线(部分)去除

#这里没有系统的研究怎样去除干扰线,
#对于每种类型的干扰线都采用一种算法的话,这样工作量有点大.
#试着看看机器学习是否有更好的解决办法.
#这里只列出一些思考角度上的例子
 1. 图像落在X轴上的点的高度
     因为干扰线一般都是单条的线,在x轴上的落点会比目标字符的落点少,统计落点的高度去除一部分 
2.

1.简单的FloodFill填充,通过面积参数去噪点.

def extractChar(im,thr): 
   OFFSETLIST = [(1, 0), (0, 1), (-1, 0), (0, -1), (1, 1), (-1, 1), (1, -1), (-1, -1)]
    pixelAccess = im.load()
    num = 1    queue = []
    ff = [[0] * im.size[1] for i in range(im.size[0])] 
   '''        floodfill 提出块    '''
    for i in range(im.size[0]):
        for j in range(im.size[1]):
            '''                pixelAccess[i,j] == 0 表示是黑点            ''' 
           if pixelAccess[i, j] == 0 and ff[i][j] == 0:
                ff[i][j] = num
                queue.append((i, j))
                while len(queue) > 0:
                    a, b = queue[0]
                    queue = queue[1:] 
                    for offset1, offset2 in OFFSETLIST:
                        x, y = a + offset1, b + offset2
                        if x < 0 or x >= im.size[0]: continue
                        if y < 0 or y >= im.size[1]: continue
                        if pixelAccess[x, y] == 0 and ff[x][y] == 0:
                            ff[x][y] = num
                            queue.append((x, y))
                num += 1
    ''' 字符点阵的坐标列表,对齐到 (0,0)
        eg: [(1,2),(3,24),(54,23)]    '''
    # 初始化字符数组
    info = {
        "number": 0,
        "points": []
    }
    charList = [copy.deepcopy(info) for i in range(num)]
    # 统计
    for i in range(im.size[0]):
        for j in range(im.size[1]):
            if ff[i][j] == 0:
                continue
            id = ff[i][j]
            charList[id]['number'] += 1
            charList[id]['points'].append((i, j))
    # 过滤杂点
    ret = [one for one in charList if one['number'] < thr]
    for one in  ret:
        for point in  one["points"]:
            im.putpixel(point,255)
    return im
3.图像二值化

使用Pillow模块,有三种方法
方法一: point 函数

w, h = mg.size
ts = 125
table = []
for i in  range(256):  
      if i < ts :
        table.append(0)
    else:
        table.append(1)
 newImage = mg.point(table,"1")#二值化
//point函数会生成一个新的Image对象

方法二 :load 函数

w, h = mg.size
ts = 125
pixData = mg.load()
for y in  range(h):
    for x in  range(w):
        if pixData[x,y] > ts:
            pixData[x,y] = 1
        else:
            pixData[x,y] = 0
 //对mg对象进行二值化
//load生成一个对对象操作的工具对象 PyAccess,

方法三 : putpixel()/getpixel() 函数

w, h = mg.size
ts = 125
for y in  range(h):
    for x in  range(w):
        if mg.getpixel((x,y)) > ts:
           mg.putpixel((x,y),1)
        else:
           mg.putpixel((x,y),0)
//对mg对象进行二值化
//putpixel()/getpixel() 函数调用时,也会调用load()方法,
//如果mg的属性pyaccess存在的话,调用逻辑其实走的是方法二.

PS.速度对比

方法一point函数最快
方法二load函数次之,花费方法一的约2倍的时间
方法三get函数最慢 ,花费方法二约10倍的时间

//40 x 10 循环10次 耗时如下(相互比不随循环次数改变):
get === 0.008507999999999988
load === 0.0007540000000000047
point === 0.00043999999999999595
2.图像矩阵互转
numpy模块,
ar = numpy.array(im)#图片转矩阵
PIL的image
im = Image.fromarray(ar,mode="RGB")#矩阵转图片

1.单通道和多通道
图像通道在RGB色彩模式下就是指那单独的红色R、绿色G、蓝色B部分。也就是说
一幅完整的图像,是由红色绿色蓝色三个通道组成的。他们共同作用产生了完整的图
像。同样在HSV色系中指的是色调H,饱和度S,亮度V三个通道。除了这两个三通道图像模式
#也就是一个像素点用几个不同类型的值来表示.有几个不同类型值,就表示有多少个通道.
0.图像模

1、位图模式

位图模式是1位深度的图像。它只是黑和白两种颜色。它可以由扫描或置入黑色的矢量线条图像生成,也能由灰度模式或双色调模式转换而成。其他图像模式不能直接转换为位图模式。

2、灰度模式

灰度模式是8位深度的图像模式。也就是28,28=256,在全黑和全白之间插有254个灰度等级的颜色来描绘灰度模式的图像。
所有模式的图像都能换成灰度模式,甚至位图也可转换为灰度模式。Photoshop几乎所有的功能都支持灰度模式。(单通道模式)

3、双色调模式

双色调模式不是单个的图像模式,而是一个分类。它仅仅是单色调、双色调、三色调和四色调的一个统称。双色调模式只有一个通道。双色调模式和位图模式一样,也只有灰度模式才能转换。

4、RGB模式

RGB模式是数码图像中最重要的一个模式,Photoshop的全部功能都支持它,因为Photoshop就是以它为基础来开发的。显示屏上显示的颜色是RGB模式,电视屏幕也是RGB模式,所不同的它不是用数码而是用电平来描述的。扫描仪和数码相机都是捕捉RGB图像信息的。
RGB模式是相加的模式,当R、G、B的值都达到最大值时,三色合成便成白色。
RGB模式是24位颜色深度。它共有三个通道,每个通道都有8位深度。三个通道合成一起可生成1677万种颜色,我们也称之谓“真彩色”。

5、CMYK模式

CMYK模式是用来打印或印刷的模式,它是相减的模式,当C、M、Y三值达到最大值时,在理论上应为黑色,但实际上因颜料的关系,呈显的不是黑色,而是深褐色。为弥补这个问题,所以加进了黑色K。
由于加了黑色,CMYK共有四个通道,正因为如此,对于同一个图像文件来说,CMYK模式比RGB模式的信息量要大四分之一。
但RGB模式的色域范围比CMYK模式大。因为印刷颜料在印刷过程中不能重现RGB色彩。
CMY和RGB为互补色。
C-青色:由G-绿色和B-蓝色合成,其中没有R-红色成份;
M-洋红:由R-红色和B-蓝色合成,其中没有G-绿色成份;
Y-黄色:由R-绿色和G-红色合成,其中没有B-蓝色成份;
CMYK模式不能转换为索引模式。

6、Lab模式

Lab模式是24位颜色深度的图像模式,有三个通道。L通道是亮度通道(Lightness),a和b两个为色彩通道。它的特点在于:
(1)他的色域范围最广,它和RGB与CMYK模式的关系如下:
就色域范围而言Lab>RGB>CMYK
(2)此模式下的图像是独立于设备外的,它的颜色不会因不同的印刷设备,显示器和操作平台而改变。由于它有以上的有点,当Photoshop把RGB模式和CMYK模式互相转换时,它成为中间模式,颜色信息就不会因以上两模式的色域范围不同而丢失。

a分量是由绿色向红色过度。
B分量是由蓝色向黄色过渡。
Lab模式不能转换为索引模式。
Photoshop的大部分功能不支持Lab模式。

7、索引颜色模式

索引颜色模式是8位颜色深度模式,它最多只能拥有256种颜色。
(1)每一副图像都各自拥有一张颜色表,而随图像不同,颜色表也不同。这一点是至关重要的。
(2)它的信息量小,又可制动画,所以它的图像和动画被广泛地用于网页制作上。
(3)它可制成透明图像,在网页使用。
在转换时,只有灰度和RGB两种模式,不能转换成索引颜色模式。
转换时只有两个选择是实用的:
(随样性 )当图像颜色数大于256时,使用该选项,Photoshop会定做颜色表。实际当图像颜色小于256时,使用该选项,就用实际的颜色制作颜色表。
Photoshop完全不支持索引颜色模式。

8、多通道模式

多通道模式是把含有通道的图像分割成单个的通道。
CMYK模式转为多通道模式时,生成的通道为青色、洋红、黄色和黑色四个通道。
Lab模式转为多通道模式时,生成三个Alpha通道。
9、8位/通道和16位/通道
在灰度、RGB和CMYK模式下可以用每个通道16位深度来取代8位深度。那么,每个通道的颜色数从256色剧增到65536色,可生成更好的颜色细节。
目前,由于设备的不支持,16位/通道的图像不能被打印或印刷。

你可能感兴趣的:(图像)