精华内容
下载资源
问答
  • python 验证码字符分割

    2020-11-27 13:08:04
    然而效果不是很好,如果是两个长度较短的字符相邻还是没有用,w字符容易丢失像素,没有太好的解决办法。另一个解决方法把像素点过多的图片去除,剩下的图片可以用来训练字体 # 下载验证码 import reques

    用tesseract-ocr 识别率不高,想要自己训练字体

    这里用的是中国知网注册页面的验证码

    在这里插入图片描述
    在这里插入图片描述
    实现思路,图片二值化后,遍历每一个像素点找到起始像素,向上下左右寻找相邻像素直至结束。有个问题就是若两个字符挨着就会把全部相邻的字符都找到
    在这里插入图片描述
    加了个简单的判断,限制字体长度
    在这里插入图片描述
    然而效果不是很好,如果是两个长度较短的字符相邻还是没有用,w字符容易丢失像素,没有太好的解决办法。另一个解决方法把像素点过多的图片去除,剩下的图片可以用来训练字体
    在这里插入图片描述

    # 下载验证码
    import requests
    import os
    
    path = os.path.dirname(__file__)
    
    for i in range(10):
        url = 'https://my.cnki.net/Register/CheckCode.aspx?id=1605429917005'
    
        response = requests.get(url)
        file_path = path + '/jpg/{}.jpg'.format(i)
    
        with open(file_path,'wb') as f:
            f.write(response.content)
    

    图片处理

    from PIL import Image
    import sys
    import os
    
    sys.setrecursionlimit(1000000)
    pixel_list = []
    all_pixel_list = []
    
    #二值化
    def Binarization(image):
    
        threshold = 160
        table = []
        for i in range(256):
            if i < threshold:
                table.append(0)
            else:
                table.append(1)
        image = image.point(table, '1')
        return image
    
    
    def partition(image):
        width = image.size[0]
        height = image.size[1]
    
        count = 1
        for w in range(width):
            for h in range(height):
                pixel = image.getpixel((w, h))
    
                if pixel == 0:
                    zuobiao = str(w) + ',' + str(h)
    
                    if zuobiao not in all_pixel_list:
    
                        print('起始像素', zuobiao)
                        if len(pixel_list) > 20:
                            pixel_list.clear()
    
                        all_pixel_list.append(zuobiao)
                        pixel_list.append(zuobiao)
                        check_around(w, h)
                        print(pixel_list)
    
                        if len(pixel_list)  > 20:
                            image_save(count)
                            count += 1
                        else:
                            if count != 1:
                                add_pixel(id,count-1)
    
    
    def check_around(width,height):
    
        # 判断字体长度
        '''
        for pixel in pixel_list:
            w, h = pixel.split(',')
            if int(h) == height:
                if width - int(w) > 9:
                    return'''
    
        shang = ( width , height-1)
        xia = ( width , height+1 )
        zuo = ( width-1, height)
        you = ( width+1 , height)
    
        if image.getpixel(shang) == 0:
            zuobiao = str(shang[0]) + ',' + str(shang[1])
            if zuobiao not in all_pixel_list:
                all_pixel_list.append(zuobiao)
                pixel_list.append(zuobiao)
                check_around(shang[0], shang[1])
    
        if image.getpixel(xia) == 0:
            zuobiao = str(xia[0])+','+str(xia[1])
            if zuobiao not in all_pixel_list:
                all_pixel_list.append(zuobiao)
                pixel_list.append(zuobiao)
                check_around(xia[0],xia[1])
    
        if image.getpixel(zuo) == 0:
            zuobiao = str(zuo[0])+','+str(zuo[1])
            if zuobiao not in all_pixel_list:
                all_pixel_list.append(zuobiao)
                pixel_list.append(zuobiao)
                check_around(zuo[0],zuo[1])
    
        if image.getpixel(you) == 0:
            zuobiao = str(you[0])+','+str(you[1])
            if zuobiao not in all_pixel_list:
                all_pixel_list.append(zuobiao)
                pixel_list.append(zuobiao)
                check_around(you[0],you[1])
    #保存图片
    def image_save(count):
        im = Image.new(mode="1", size=(64, 25),color=1)
        for i in pixel_list:
            x,y = i.split(',')
            im.putpixel((int(x),int(y)),0)
    
        filename = '{}_分割{}.jpg'.format(id,count)
        im.save(out_path + filename)
    
    #添加像素
    def add_pixel(id,count):
        filename = '{}_分割{}.jpg'.format(id,count)
        im = Image.open(out_path + filename)
        for i in pixel_list:
            x, y = i.split(',')
            im.putpixel((int(x), int(y)), 0)
    
        im.save(out_path + filename)
        pixel_list.clear()
    
    
    if __name__ == '__main__':
        path = os.path.dirname(__file__) +'/jpg/'
        out_path = os.path.dirname(__file__) +'/out_jpg/'
    
        for filename in os.listdir(path):
    
            image = Image.open(path + filename)
            image = image.convert('L')
            id = filename.split('.')[0]
            image = Binarization(image)
    
            #image.save(out_path + '\{}_二值化.jpg'.format(id))
            partition(image)
            all_pixel_list.clear()
    
    
    展开全文
  • OpenCV+Python车牌字符分割和识别入门

    万次阅读 多人点赞 2017-11-28 00:33:26
    最近做一个车牌识别项目,入门级别的,十分简单。 车牌识别总体分成两个大的步骤...在这种情况下,很难区分谁是背景,谁是字符,所以需要对图像进行一些处理,把每个RGB定义的像素点都转化成一个bit位(即0-1代码),具


    最近做一个车牌识别项目,入门级别的,十分简单。

    车牌识别总体分成两个大的步骤:

    一、车牌定位:从照片中圈出车牌

    二、车牌字符识别

    这里只说第二个步骤,字符识别包括两个步骤:

    1、图像处理:原本的图像每个像素点都是RGB定义的,或者称为有R/G/B三个通道。在这种情况下,很难区分谁是背景,谁是字符,所以需要对图像进行一些处理,把每个RGB定义的像素点都转化成一个bit位(即0-1代码),具体方法如下:

    ①将图片灰度化

    名字拗口,但是意思很好理解,就是把每个像素的RGB都变成灰色的RGB值,而灰色的RGB值是R=G=B的。具体怎么改变暂且忽略,因为OpenCV有封装好的函数。

    ②将灰度图片二值化

    我们做第一步的目的就是为了让每个像素都可以转变成0或1。再解释一下,既然每个像素的RGB值都相等了,那么将这个值称为灰度值,假设一张灰度车牌图片中,背景的灰度值集中在180(十进制)左右,而字符的灰度值集中在20左右,那么我们规定一个中间值100,小于100的像素点就可以全部变成0,大于100的像素点可以全部变成1,这样就实现了二值化。

    ③旋转调平

    这个就不说了。

    ④去燥

    这个涉及另外一些方法,以后有时间再补充,入门项目不作要求。


    2、图像切割和识别

    ①图像切割

    切割可以很简单,也可以很难,关键是方法的选择。

    在这就用最弱智的方法进行切割吧。

    图片现在已经成为一个0-1矩阵了,其中要么0是背景而1是字符,或者1是背景而0是字符,那就简单粗暴地用每一列的0-1数来切割。

    我先在这里假设图片几乎水平,而且几乎没有噪点,具体方法如下:

    a.将每一列的1值和0值分别统计起来。

    b.根据每一列的0-1总和变换来切割字符

    ②图像识别

    将每一个字符的图片分割出来后,就可以根据模板来判断是哪个字符了。

    简单的方法有两种:

    a.逐个像素比对,如果一致则count加一,最后根据count值确定匹配结果。

    b.投影匹配:将每行、每列的像素位统计起来,根据差值大小来确定匹配结果。

    两种方法结合效果很好。

    具体的识别之后再补充。


    下面是字符分割的代码。

    import cv2
    
    # 1、读取图像,并把图像转换为灰度图像并显示
    img = cv2.imread("chepai/6.png")  # 读取图片
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # 转换了灰度化
    cv2.imshow('gray', img_gray)  # 显示图片
    cv2.waitKey(0)
    
    # 2、将灰度图像二值化,设定阈值是100
    img_thre = img_gray
    cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY_INV, img_thre)
    cv2.imshow('threshold', img_thre)
    cv2.waitKey(0)
    
    # 3、保存黑白图片
    cv2.imwrite('thre_res.png', img_thre)
    
    # 4、分割字符
    white = []  # 记录每一列的白色像素总和
    black = []  # ..........黑色.......
    height = img_thre.shape[0]
    width = img_thre.shape[1]
    white_max = 0
    black_max = 0
    # 计算每一列的黑白色像素总和
    for i in range(width):
        s = 0  # 这一列白色总数
        t = 0  # 这一列黑色总数
        for j in range(height):
            if img_thre[j][i] == 255:
                s += 1
            if img_thre[j][i] == 0:
                t += 1
        white_max = max(white_max, s)
        black_max = max(black_max, t)
        white.append(s)
        black.append(t)
        print(s)
        print(t)
    
    arg = False  # False表示白底黑字;True表示黑底白字
    if black_max > white_max:
        arg = True
    
    # 分割图像
    def find_end(start_):
        end_ = start_+1
        for m in range(start_+1, width-1):
            if (black[m] if arg else white[m]) > (0.95 * black_max if arg else 0.95 * white_max):  # 0.95这个参数请多调整,对应下面的0.05
                end_ = m
                break
        return end_
    
    n = 1
    start = 1
    end = 2
    while n < width-2:
        n += 1
        if (white[n] if arg else black[n]) > (0.05 * white_max if arg else 0.05 * black_max):
            # 上面这些判断用来辨别是白底黑字还是黑底白字
            # 0.05这个参数请多调整,对应上面的0.95
            start = n
            end = find_end(start)
            n = end
            if end-start > 5:
                cj = img_thre[1:height, start:end]
                cv2.imshow('caijian', cj)
                cv2.waitKey(0)
    
    



    源程序中没有将图片输出,而只是显示出来,下面是执行结果

    原图片:


    灰度图片:



    二值图片:(白底黑字)


    分割后:

    总体分割效果还是补充。但是遇到干扰较多的图片,比如左右边框太大、噪点太多,这样就不能分割出来,各位可以试一下不同的照片。


    展开全文
  • 车牌识别三大步骤: 1、从图中找出车牌 2、从车牌中识别车牌号 3、通过训练提高识别率... 图片处理:1、将图片灰度化;2、将灰度图片二值化;3、校正;4、去燥;  图像切割识别:1、图像切割;2、图像识别 代...

    车牌识别三大步骤:

    1、从图中找出车牌

    2、从车牌中识别车牌号

    3、通过训练提高识别率

           本次仅实现第二步,这也是核心,其他两个属于附属功能,第三个可以通过GAN或Tesseract来进行训练,这个下篇再进行介绍。

    核心步骤:

           图片处理:1、将图片灰度化;2、将灰度图片二值化;3、校正;4、去燥;

           图像切割识别:1、图像切割;2、图像识别

    代码演示(注释):

            需要导入,引入库为:opencv-python

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    """
        Author Alexantao By Charm
    """
    
    import cv2
    
    # 定义,都可根据应用进行调整
    binary_threshold = 100
    segmentation_spacing = 0.9  # 普通车牌值0.95,新能源车牌改为0.9即可
    
    
    # 1、读取图片,并做灰度处理
    img = cv2.imread('img/nycar_num_test1.png')
    img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    cv2.imshow('gray',img_gray)
    cv2.waitKey(0)
    
    
    # 2、将灰度图二值化,设定阀值为140
    img_thre = img_gray
    cv2.threshold(img_gray, binary_threshold, 255, cv2.THRESH_BINARY_INV, img_thre)
    cv2.imshow('threshold', img_thre)
    cv2.waitKey(0)
    
    # 3、保存黑白图片
    cv2.imwrite('img/thre_res.png',img_thre)
    
    # 4、分割字符
    white = []  # 记录每一列的白色像素总和
    black = []  # 记录每一列的黑色像素总和
    height = img_thre.shape[0]
    width = img_thre.shape[1]
    print(width, height)
    white_max = 0   # 仅保存每列,取列中白色最多的像素总数
    black_max = 0   # 仅保存每列,取列中黑色最多的像素总数
    
    # 循环计算每一列的黑白色像素总和
    for i in range(width):
        w_count = 0     # 这一列白色总数
        b_count = 0     # 这一列黑色总数
        for j in range(height):
            if img_thre[j][i] == 255:
                w_count += 1
            else:
                b_count += 1
        white_max = max(white_max, w_count)
        black_max = max(black_max, b_count)
        white.append(w_count)
        black.append(b_count)
    
    
    # False表示白底黑字;True表示黑底白字
    arg = black_max > white_max
    
    
    # 分割图像,给定参数为要分割字符的开始位
    def find_end(start_):
        end_ = start_ + 1
        for m in range(start_+1, width - 1):
            if(black[m] if arg else white[m]) > (segmentation_spacing * black_max if arg else segmentation_spacing * white_max):
                end_ = m
                break
        return end_
    
    
    n = 1
    start = 1
    end = 2
    while n < width - 1:
        n += 1
        if(white[n] if arg else black[n]) > ((1 - segmentation_spacing) * white_max if arg else (1 - segmentation_spacing) * black_max):
            # 上面这些判断用来辨别是白底黑字还是黑底白字
            start = n
            end = find_end(start)
            n = end
            if end - start > 5:
                print(start, end)
                cj = img_thre[1:height, start:end]
                cv2.imwrite('img/{0}.png'.format(n), cj)      #此句是输出每个字符,当时未输出直接看的时候因为刷新问题,解决好久,后来发现只是显示刷新的问题
                cv2.imshow('cutChar', cj)
                cv2.waitKey(0)
    

    图片:

              

              

         二值图片:(白底黑字)

             

         分割后:

              一个一个字符分割显示。

    展开全文
  • 利用opencv实现车牌的字符分割 原图 运行结果如下 灰度化 反色 二值处理 水平投影 垂直投影 字符分割 实现代码 import cv2 import numpy as np img=cv2.imread('E:\\123456.jpg') ...

    利用opencv实现车牌的字符分割

    原图

    运行结果如下

    灰度化

    反色

    二值处理

    水平投影

    垂直投影

    字符分割

    实现代码

    import cv2  
    import numpy as np  
    
    
    img=cv2.imread('E:\\123456.jpg')
    cv2.imshow('image1',img)
    
    #将图像转为灰度图
    img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow('image2',img)
    
    #反色
    def inverse_color(edged):
        height,width = edged.shape
        img2 = edged.copy()
        for i in range(height):
            for j in range(width):
                img2[i,j] = (255-edged[i,j])
        return img2
        
    cv2.imshow('image3',inverse_color(img))
    
    #水平投影
    ret,thresh1=cv2.threshold(inverse_color(img),130,255,cv2.THRESH_BINARY)
    cv2.imshow('image4',thresh1)
    image=thresh1.copy()
    (h,w)=thresh1.shape #返回高和宽
    #初始化一个跟图像高一样长度的数组,用于记录每一行的黑点个数
    a = [0 for z in range(0, h)] 
    for j in range(0,h):  #遍历每一行
        for i in range(0,w):  #遍历每一列
            if  thresh1[j,i]==0: #判断该点是否为黑点,0代表黑点
                a[j]+=1 #该行的计数器加一
                thresh1[j,i]=255#将其改为白点,即等于255
             
    for j  in range(0,h):  #遍历每一行
        for i in range(0,a[j]):   #从该行应该变黑的最左边的点开始向最右边的点设置黑点
            thresh1[j,i]=0    #设置黑点
    cv2.imshow('image5',thresh1)
    
    #垂直投影
    ret,thresh1=cv2.threshold(inverse_color(img),130,255,cv2.THRESH_BINARY)
    (h,w)=thresh1.shape #返回高和宽
    #初始化一个跟图像宽一样长度的数组,用于记录每一列的黑点个数
    a = [0 for z in range(0, w)]
    for j in range(0,w):   #遍历每一列 
        for i in range(0,h):  #遍历每一行
            if  thresh1[i,j]==0: #判断该点是否为黑点,0代表是黑点
                a[j]+=1 #该列的计数器加1
                thresh1[i,j]=255#记录完后将其变为白色,即等于255
             
    for j  in range(0,w):  #遍历每一列
        for i in range(h-a[j],h):#从该列应该变黑的最顶部的开始向最底部设为黑点
        #for i in range(0,a[i]):   
            thresh1[i,j]=0  #设为黑点
    cv2.imshow('image6',thresh1)        
    
    #矩形分割字符
    image = cv2.cvtColor(image,cv2.COLOR_GRAY2RGB)
    red = (0,0,255)
    #设置矩形的各参数
    cv2.rectangle(image, (10,10), (65,120),red,2)
    cv2.rectangle(image, (75,10), (135,120),red,2) 
    cv2.rectangle(image, (160,10), (220,120),red,2) 
    cv2.rectangle(image, (225,10), (290,120),red,2) 
    cv2.rectangle(image, (300,10), (355,120),red,2) 
    cv2.rectangle(image, (360,10), (415,120),red,2) 
    cv2.rectangle(image, (420,10), (480,120),red,2)
    cv2.imshow('image7',image)
    cv2.waitKey(0)
    

    遇到的问题

    在图片分割时,图像框是黑色,无法变成彩色

    解决方法:

    这是因为原本的图片进行了灰度转换,而在灰度图上绘制彩色标识,只会出现黑色或者白色,所以我将灰度图转换成了彩色图

    就会出现彩色矩形了

    展开全文
  • OpenCV—python 字符分割

    2020-07-15 10:07:46
    本博客主要探讨基于传统方法的验证码识别,更多的是做粘连扭曲的验证码识别的分割,其实在验证码识别这一块,深度学习做的已经非常好了,识别效率与速度都是不错的。【验证码识别】 连通域:...
  • OpenCV+Python识别车牌和字符分割

    万次阅读 多人点赞 2019-01-30 17:37:54
    本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分: 1.车辆图像获取 2.车牌...
  • Python实现PDF字符分割

    千次阅读 2017-07-07 14:20:59
    https://github.com/tianzhi0549/CTPN ... 这边我选个一个PDF论文中一段,进行分割和翻译。如下图。分割效果如下:调试了几个参数,发现不太能够一个单词一个单词这样分割,将上图直接输入给CRNN是无法识别出其中的单
  • 本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分: 1.车辆图像获取 2.车牌定位...
  • 这是一道Python的关于字符分割的问题,为什么输入数字为40时就不行了呢?麻烦大佬们帮忙看看代码写的哪出问题了 这是报错内容: 答案错误:您提交的程序没有通过所有的测试用例 case通过率为0.00% 用例: 40
  • Opencv—python 基于投影的字符分割

    千次阅读 2018-10-07 09:47:22
    字符分割有很多方法,根据自己的需要来分析,那种方法更加适合自己。大致适而言有两种方法:投影分割法和连通域分割法。 投影法的原理:利用二值化图片的像素的分布直方图进行分析,从而找出相邻字符的分界点进行...
  • 利用opencv或其他工具编写程序实现简单车牌字符分割。 实现过程 import cv2 from pathlib import Path import numpy as np current_path = Path.cwd() #读取图片 image1 = cv2.imread(str(Path(current_path....
  • https://m.jb51.net/article/137487.htm车牌识别总体分成两个大的步骤:一、车牌...在这种情况下,很难区分谁是背景,谁是字符,所以需要对图像进行一些处理,把每个RGB定义的像素点都转化成一个bit位(即0-1代码...
  • python+opencv图片分割字符

    千次阅读 热门讨论 2019-01-26 19:40:29
    图片中的字符分离出一张张字符图片(缺陷:字符不能重合) # -*- coding:utf-8 -*- import numpy as np import cv2 def car(): img = cv2.imread(&quot;C:\\Users\\Administrator.000\\Desktop\\a.png...
  • 字符分割 ...链接: OpenCV+Python车牌字符分割和识别入门. 流程图 Created with Raphaël 2.2.0开始灰度化、二值化去除边框闭操作分割字符结束 首先需要对前面定位到的车牌图块进行灰度化、...
  • python libsvm 图像分割 字符识别

    千次阅读 2014-12-12 14:51:23
    Python 用的是2.7版本 #coding=utf-8 #!/usr/bin/env python import Image import cv2 from cv2 import cv import numpy as np from pylab import * import glob import os from svmutil import *...分割图片中的
  • 今天小编要跟大家分享的文章是怎样用Python编程读取文件?这节课我们主要学习读文件,怎样利用Python语言,从文件夹中获得我们想要的内容,python入门新手和正在python学习的小伙伴快来看一看吧,希望能够对大家有所...
  • 这是一篇介绍基于 OpenCV 和 Python 实现车牌提取项目思路和源码的文章,本文涉及一些人工智能和图像识别技术,具体而言,涉及到关于车牌号码识别的研究(车牌提取和字符分割),网上查找到的方案有 tensorflow 和...
  • 在这种情况下,很难区分谁是背景,谁是字符,所以需要对图像进行一些处理,把每个RGB定义的像素点都转化成一个bit位(即0-1代码),具体方法如下: ①将图片灰度化 名字拗口,但是意思很好理解,就是把每个像素的RGB...
  • Python 字符分割split不拆分括号里面的内容欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...
  • 基于python车牌识别 || 车牌字符分割

    千次阅读 2020-07-08 08:32:31
    车牌字符分割重要性 无法做端到端的车牌识别,于是,为了识别准确率更高,我们需要对字符进行精准分割,并且极可能的牌除各种干扰。 以下将分为三部分进行车牌字符分割 1.图片预处理 目的是为了排除一些干扰,...
  • 本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置!车牌号检测需要大致分为四个部分:1.车辆图像获取2.车牌定位、3....
  • 在诸如车牌识别,数字仪表识别等问题中,最关键的就是将单个的字符分割开来再分别进行识别,如下图。最近刚好用到,就自己写了一个简单地算法进行字符分割,来记录一下。 图像预处理 彩图二值化以减小参数量,再...
  • 主要为大家详细介绍了python实现图片中文字分割效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 图片字符进行定位及分割python+cv2)-附件资源

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,594
精华内容 7,037
关键字:

python图片字符分割

python 订阅