下载  >  人工智能  >  机器学习  > python OCR 识别

python OCR 识别 评分

图像识别,图像处理,图像识别,图像处理,图像识别,图像处理,图像识别,图像处理,图像识别,图像处理,图像识别,图像处理,图像识别,图像处理,图像识别,图像处理,
2018/1/17 Pythωn环境下的图像处理及OCR识别-首席机械键盘手 13 CV2. imwrite( output/number_gray. png", img -gray 5、图像二值化 图像二值化分为全局阈值二值化与局部阈值二值化。当月图像灰度化完成之后,图中的每一个像素 由一个0~255的值来表示。 对灰度图做二值化的时候,首先需要确定一个阈值T。当灰度图的某个像素值小于T,则值置为0; 当某个像素值大于T,则值置为255。所以图像二值化的问题实际上就是针对一幅灰度图来求其阈值 T的过程。而全局阈值二值化与局部阈值二值化的区别在于阈值是针对全局图像取得还是针对局部 取得。目前图像二值化的算法部共有100多种,分别在不同的场合下发挥出不同的效果。这里我们 直接使用 opencv- python提供的方法来完成图像二值化。 01 import cv2 02 import numpy as np 03 import matplotlib. pyplot as plot 04 05#以灰度化方式读入图像 06 img_gray = Cv2. imread( "input/number. png", CV2. IMREAD-GRAYSCALE 07# 08 thresh =0 09 th, img_binary cv2 threshold(img_gray, thresh, 255, CV2 THRESH_BINAR 10 1#注意这里显示出来仍然是彩色的,但是保存为文件再用图像浏览器打开就可发现变为二值化医 12 plot. imshow( img_binary 13 plot. showO) 14 15#保存为二值化图像文件 6 CV2.imwritec "output/number_binary. png", img _binary 6、针对性的图像预处理 图像去噪、灰度化和二值化是一般情况下图像预处理必做的三步。但是我们这次的应用场景是识别 网页截图中的文字。我们假设需要处理的图像背景是单色的,前景是规整的文字。这样的话其实可 以直接对图像进行二值化处理 1)N*M大小的png图像读入后是一个N行M列的矩阵,我们对其逐行进行遍历 2)如本行中像素值(RGB三值)全部一致,则说明本行均为背景,而背景色就是本行的颜色 C,如果C大于127,则二值化背景色B取0(黑色),二值化前景色F取255(黑色);如果C 于小127,则二值化背景色B取255(白色),二值化背景色F取0(黑色) 3)重新逐行遍历矩阵,将所有值为C的像素替换为二值化背景色B,将所有值不为C的像素替 换为二值化前景色F。到此图像的二值化完毕。 以下是一个非常简单的代码实现 01 import Cv2 02 import numpy as np 03 import matplotlib. pyplot as plot 04 05#读取图像文件,如果指定了读取的模式,则按照该模式来读取 06 def image__readc filename, mode s None ) 07 08 if mode ! none http://www.xuzhigang.com/pythonoe7%8eyOafye5%0a2c839oe4%b8%08b9ce702a9084%0e59c9B%besce5%083%08f0e5%0a4%c849ce790%086%e5%08f%08...316 2018/1/17 Pythωn环境下的图像处理及OCR识别-首席机械键盘手 09 return Cv2.imreadc filename, mode 10 else 11 return Cva. imreadc filename 13#保存图像文件 14 def image_save( filename, image 15 16 return cv2. imwritec filename, image 18#图像二值化 9 def image-binarization( image 20 21 #获取行数和列数 22 row_length s Len( image 3 column_length len( image[ 0]) 24 ba_color 0 26 front color 0 27 28 #寻找背景颜色 29 30 fof bgcolor is-found =Trueth 31 32 for column in range( 0, column_length 33 if color = image[ row column ]: 34 pass 35 else ba_color_is found False break 38 39 if bg_color_is_found: ba_color= color 41 break 42 43 #二值化,遍历每个像素 4 for row in range( 0, row_Length 45 for coLumn in range 0, column_length #当前像素跟背景颜色一致,则置背景值 48 if image[ row ][ column]=s bg_color 49 50 #如果背景颜色大于127,则背景值置255 51 if ba_color>127 52 image row column ]=255 53 #如果背景颜色小于或等于127,则背景值置0 else 56 image row[ column]s 0 57 58 #当前像素跟背景颜色不一致,则置前景值 59 else 60 61 #前景置值的逻辑跟背景置值的逻辑正好相反 62 if bg_color >127: 63 image row co lumn]= 0 64 else. 65 image[ row column]= 255 66 67 68 return image 69 70 def mainO #以灰度化的方式打开图像,每个像素只有一个通道 73 image image_read(" input/number. png",mode= CV2. IMREAD_ GRAYSCAL 74 75 #保存灰度化的图像以备观察 76 image_ save( output/number -gray. png", image 78 #对灰度图进行二值化 ttp://ww. xuzhigang. com/ python%E7%8E%A上%上5%A2%83%E4%B8%8B%E7%9A%84%上5%9B%B上化E5%83%8上%上5%A4%84%E7%9%86%E5%8上%8..416 2018/1/17 Pythωn环境下的图像处理及OCR识别-首席机械键盘手 9 image binary s image binarization( np. copy image )) 81 #保存二值化之后的图像 82 image_save(output/number _binary. png", image binary 3 84#程序入口 85 if __name 1! matn 86 87 maino 下面分别是原图及对应的灰度图、二值图 1234567890 0987654321 1234567890 0987654321 1234567890 0987654321 1234567890 0987654321 1234567890 0987654321 1234567890 0987654321 ttp:/www.zhigang.com/python%上7%8AH%上5%A2%83%上4%B8%8B%E7%9A%84%E5%9%BE5%83%8%上5%A4%84%E7%9%86%E5%8F%8.516 2018/1/17 Pythωn环境下的图像处理及OCR识别-首席机械键盘手 1234567890 0987654321 1234567890 0987654321 1234567890 0987654321 7、分割字符 将图片中的字符分割为最小单位(如一个汉字/字母/数字/标点符号等)。 需要识别的图片并不仅仅只有一行内容。首先需要寻找整个图片中内容的大轮廓;然后依次分行, 找到每一行的轮廓;最后寻找每一行的每一个字符的轮廓。一般来说寻找轮廓要按照顺序进行,因 为文本内容是有序的。 因为我们要识别的是网页截图,内容的格式都比较规整,所以并不需要提前做图像的校正、去噪 内容分块、分行最常用的方式是利用投影直方图,分割字符则可以利用投影直方图或分析连通域。 但是在做网页截图的识别时,用简单的背景前景对比即可在规整的图像中分割出行、字符。 下面是源代码,注意是在上面的代码基础上添加 01### 02#需要在上面代码的基础上添加这两个方法 04这些代码仅为演示效果,实际使用中并不需要绘制分割线 03 05 06#将图像中的文字行分割出来 07 def image_row_split( image 08 09 #假设背景色是255(即白色) 10 bg_color =255 row_ length Len( image 12 column_length= len( image[0]) 14 is last blank row true for row in range( 0, row_length ): is row blank true 17 for column in range 0, column_length if image row J coLumn]== bg_color 19 pass ttp:/ww. zhigang. com/ python%上7%8AH%上5%A2%83%上4%B8%8B%E7%9A%84%E5%9%BE5%83%8%上5%A4%84%E7%9%86%E5%8F%8.616 2018/1/17 Pythωn环境下的图像处理及OCR识别-首席机械键盘手 20 else 21 is row blank false 22 break 23 24 if is last blank row e is row blank pass 26 else if is row blank s false: 28 image[ row-1]=[0 for column in range( 0, column 29 else image[ row]=[ 0 for column in range( 0, column_leng 31 32 is last blank row is row blank 33 34 return Image 35 36#对行分割的代码进行改造,即可得出分割字符的代码 37 def image_char_split( image, image_row- splited 38 39 image- save( "output/image _test. png", image 41 bg_color 255 42 row_length Len( image 43 column_length len( image[ 0] 44 is last blank column True 46 for co Lumn in range( 0, co Lumn_Length is column blank true for row in range(0, row_length ) 49 if image row ][ column]== bg_color: 50 pass 51 else is column blank e false break 54 if is last blank column = is column blank 56 pass else 58 if is column blank e false 59 for row in range( 0, row_length ) 60 image_row_splited[ row ][ column -1]=0 61 else 62 for row in range( 0, row_length ): 63 image_row_splited row J co Lumn]= 0 64 65 is last blank column= is column blank 67 return image_row_splited 68 69 def main(: 70 71 #在上节的main代码上添加这几行 73 #分行 74 image_row_splited s image_row_split( np. copy( image_binar image_save( "output/number _row_splited. png", image_row_splited 76 77 #分字符 78 image_char_spLited= image_char_split( np. copy( image_binary ),n 79 image_save( "output/number_char_splited. png", image_char_splited 下面分别是在上面三张图的基础上进行的行分割、字符分割(仅为演示用,实际使用的时候只需要 获取到分割坐标即可,不用绘制分割线。在实际应用中,每列的字符不可能恰好对齐,因此需要把 每一行单独拿出来进行字符分割) ttp:/www.zhigang.com/python%上7%8AH%上5%A2%83%上4%B8%8B%E7%9A%84%E5%9%BE5%83%8%上5%A4%84%E7%9%86%E5%8F%8.7/16 2018/1/17 Pythωn环境下的图像处理及OCR识别-首席机械键盘手 1234567890 0987654321 1234567890 0987654321 1234567890 0987654321 1234567890 0987654921 234567890 0987654321 1234567890 0987654321 上面的处理只是找到每一行和每一列,并划上分割线。实际应用中我们需要把其中的每一个字符都 切割出来,并进行大小统一化才能进行下一步的识别。步骤如下 1)先将图片按照行进行切割,然后对每一行进行字符切割。注意这些操作都需要保证分割出 来的字符都是有序的; 2)分割岀来的字符很可能高度、宽度、大小不一致,我们需要将它们转换为同一大小。一般 做法是统一转換为高、宽相等的正文形字符块,边长取高、宽值大者 ttp:/www.zhigang.com/python%上7%8AH%上5%A2%83%上4%B8%8B%E7%9A%84%E5%9%BE5%83%8%上5%A4%84%E7%9%86%E5%8F%8.816 2018/1/17 Pythωn环境下的图像处理及OCR识别-首席机械键盘手 3)大小变换之后,不同的算法会对内容进行不同的处理。 opencv的默认做法会将我们切割出 的二值化字符变为灰度字符。因此这里需要再次将切割出的、进行过大小统一的字符全都二值 化 最后产生的结果是一堆有序的、大小和格式统一的字符图像。然后就可以交给下一步进行特征提取 和识别了。 程序是在上面几步的基础上修改的,完整代码如下: 001 import CV2 002 import numpy as np 003 import matplotlib. pyplot as plot 004 005 def image_read( filename, mode = None 006 007 if mode ! none: 008 return cv2. imread( filename, mode d 009 else 010 return cv2. imread( filename 011 012 def image_save( filename, image 013 014 return CV2. imwritec filename, image 015 016 def image_binarization( image ) 017 018 row_length s Len( image 019 column_length s len( image[0]) 020 021 bg_color 0 022 023 for row in range( 0, row_length ) 024 bg_color__is_found s True 025 color image[ row][0 1 02 for coLumn in range( 0, coLumn_length 027 if color = image[ row ][ column 028 pass 029 else 030 bg_color_is_found s false 031 break 032 033 if bg_color_is_found 034 bg_color color 035 break 036 037 for row in range( 0, row_length ): 038 for column in range( 0, column__length ) 039 if image[ row ][ column g_co lor 040 讠 f bg_color>127: 041 image[ row ][ column ]=255 042 else 043 image[ row ] column ]=0 044 045 else 046 if bg_color>127: 047 image row][ column ]=0 048 else 049 image row column ]=255 050 051 052 return lmage 053 054 def image_row_split( image 055 056 bg_color 255 http://www.xuzhigang.com/pythonoe7%8eyOafye5%0a2c839oe4%b8%08b9ce702a9084%0E59c9b%besce5%083%08F0e5%0a4%c849ce790%86%e5%08f%08...9716 2018/1/17 Pythωn环境下的图像处理及OCR识别-首席机械键盘手 057 row_ length s Len( image 058 column_length Len( image[0]) 059 060 image_in_rows [I 061 062 s last blank row e true 063 last row index 0 064 for row in range( 0, row_Length ) 065 is row blank true 066 for coLumn in range( 0, coLumn_length 067 if image[ row ] column g_color 068 pass 069 else 070 is row blank s false 071 break 072 07 if is last blank row = is row blank: 074 pass 075 else 076 if is row blank false 077 image row-1 ]=[0 for column in range( 0, co lumr 078 079 #本行开始位置的行号 080 last row index row 081 else 082 image[ row]= a for column in range( 0, column_ler 0 084 #已经找到本行开始位置和结束位置的行号,然后复制一行 085 image_in_rows. append image[ last_row_index row]) 086 087 is last blank row e is row blank 088 089 #第一个返回值是划了分行线的完整图像 090 #第二个返回值是一个List,每个元素都是分割出来的一行 091 return image, image_in__rows 092 093 def image_char- split( image, image_row__splited 094 095 image_save("output/image_test. png", image 096 097 bg_color= 255 98 row_length s len( image 099 column_length s len( image[0]) 100 101 is last blank column True 102 last left line index o 103 chars_splited= [] 104 for column in range( 0, coLumn_length 105 is column blank True 106 for row in range( 0, row_length ) 107 els, pass row co Lumn bg_co lor 108 109 110 is column blank false 111 break 112 113 if is last blank column = is column blank 114 pass 115 else 116 if is column blank = False 117 for row in range( 0, row_length ) 118 image_row_splited row column -1]=0 119 20 #找到本列字符的开始列号 121 Last left line index column 122 else 123 single_char= 124 for row in range( 0, row_length ) 125 image_row_splited row It column =0 126 ttp:/www.zhigang.com/python%上7%8AH%上5%A2%83%上4%B8%8B%E7%9A%84%E5%9%B上E5%83%8%上5%A4%84%E7%%86%E5%8上%8.1016

...展开详情
所需积分/C币:16 上传时间:2018-06-28 资源大小:6.09MB
举报 举报 收藏 收藏 (2)
分享 分享

评论 下载该资源后可以进行评论 1

qq_42367924 不是想要的
2018-12-12
回复