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)

    结果截图:

     

           

  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/sndd/p/12545616.html
Copyright © 2011-2022 走看看