zoukankan      html  css  js  c++  java
  • 机器视觉车牌识别切割代码

    import cv2 
    img = cv2.imread("D:/photo/123456.jpg")
    cv2.imshow("img",img)
    cv2.waitKey(0)
    #灰度图
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    cv2.imshow("gray",gray)
    cv2.waitKey(0)
    #二值化
    ret,im_fixed=cv2.threshold(gray,50,100,cv2.THRESH_BINARY)
    cv2.imshow("im_fixed",im_fixed)
    cv2.waitKey(0)
    #反色
    img2 = gray.copy()
    cv2.threshold(gray,80,255,0,gray)
    for i in range(0,gray.shape[0]):
        for j in range(0,gray.shape[1]):
            img2[i,j] = 255-gray[i,j]
    cv2.imshow("img2",img2)
    cv2.waitKey(0)
    #水平投影
    img3 = img2.copy() 
    #返回图像的高和宽
    (h,w)=img3.shape
    #初始化一个跟图像高一样长度的数组,用于记录每一行的黑点个数
    a=[0 for z in range(0,h)]
    for i in range(0,h):          #遍历每一行
        for j in range(0,w):      #遍历每一列
            if img3[i,j]==0:      #判断该点是否为黑点,0代表黑点
                a[i]+=1           #该行的计数器加一
                img3[i,j]=255     #将其改为白点,即等于255
    for i in range(0,h):          #遍历每一行
        for j in range(0,a[i]):   #从该行应该变黑的最左边的点开始向最右边的点设置黑点
            img3[i,j]=0           #设置黑点
    cv2.imshow("shuiping",img3)
    cv2.waitKey(0)
    img4 = img2.copy()
    #垂直投影
    #返回图像的高和宽
    (h,w)=img4.shape
    #初始化一个跟图像宽一样长度的数组,用于记录每一列的黑点个数
    a =[0 for z in range(0,w)]
    for i in range(0,w):           #遍历每一列  
        for j in range(0,h):       #遍历每一行
            if img4[j,i]==0:       #判断该点是否为黑点,0代表是黑点
                a[i]+=1            #该列的计数器加1
                img4[j,i]=255      #记录完后将其变为白色,即等于255
    for i in range(0,w):           #遍历每一列
        for j in range(h-a[i],h):  #从该列应该变黑的最顶部的开始向最底部设为黑点
            img4[j,i]=0            #设为黑点
    cv2.imshow("chuizhi",img4)
    cv2.waitKey(0)
    #画矩形框
    image = img2.copy()
    
    cv2.rectangle(image, (10,10), (65,120),(0,0,255),1)#设置矩形的各参数依次是:图片,添加的文字,左上角坐标(整数),字体,字体大小,颜色,字体粗细
    cv2.rectangle(image, (75,10), (135,120),(0,0,255), 1)
    cv2.rectangle(image, (160,10), (220,120),(0,0,255), 1)
    cv2.rectangle(image, (225,10), (290,120),(0,0,255), 1)
    cv2.rectangle(image, (300,10), (355,120),(0,0,255), 1)
    cv2.rectangle(image, (360,10), (415,120),(0,0,255), 1)
    cv2.rectangle(image, (420,10), (480,120),(0,0,255), 1)
    cv2.imshow('image',image)
    cv2.waitKey(0)

     

     

     

     

     

     

    import cv2
     
    # 1、读取图像,并把图像转换为灰度图像并显示
    img = cv2.imread("D:/photo/123456.jpg")  # 读取图片
    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)

    结果截图:

     

           

  • 相关阅读:
    20145226夏艺华 《Java程序设计》第9周学习总结
    20145226夏艺华 EXP5 MSF基础应用
    20145226夏艺华 《Java程序设计》第7&8周学习总结、实验一
    20145226夏艺华 网络对抗技术EXP4 恶意代码分析
    Qt 图形视图框架<二>——<QGraphicsView、QGraphicsScene>
    Qt 图形视图框架<一>——<QGraphicsItem>
    【转载】C++ 自由存储区是否等价于堆?
    QML学习(五)——<TextInput和TextEdif输入框>
    QML学习(四)——<Text显示>
    QML学习(二)——<QML语法>
  • 原文地址:https://www.cnblogs.com/sndd/p/12545616.html
Copyright © 2011-2022 走看看