【笔记】OpenCV3 车牌定位 基于边缘检测的分割

  • Post author:
  • Post category:其他



摘抄一段目前常用的方法

  1. 基于颜色的分割方法,这种方法主要利用颜色空间的信息,实现车牌分割,包括彩色边缘算法、颜色距离和相似度算法等
  2. 基于纹理的分割方法,这种方法主要利用车牌区域水平方向的纹理特征进行分割,包括小波纹理、水平梯度差分纹理等

  3. 基于边缘检测的分割方法
  4. 基于数学形态法的分割方法


基于近段时间研究的内容,先尝试下第三种方法。。。

  • 具体步骤

  1. 将车牌图像转换成灰度图
  2. 对灰度图,利用高斯平滑处理,去除噪声
  3. 使用Canny行边缘检测
  4. 对图像进行膨胀、腐蚀,闭运算,开运算的形态学组合变换
  5. 对图像medianBlur去噪
  6. 对图像进行轮廓查找,根据车牌的长宽比提取车牌,也可以叠加上颜色,让它更精准

  • 读入图片,并转换灰度图
def rec_car(img_name):
    img = cv2.imread(img_name)
    cv2.imshow('img',img)
    img_old = img.copy()
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray', img)


百度查找的图片,如有不适,请及时联系我删除。。。  谢谢!


  • 高斯模糊 + 边缘检测
    gblur = cv2.GaussianBlur(img,(5,5),0)
    cv2.imshow('guass',gblur)

    canny = cv2.Canny(gblur,150,380)
    cv2.imshow('car-canny', canny)


  • 膨胀+腐蚀组合

先膨胀,填充内部,再腐蚀 空出边缘

    kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 1))
    kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20))

    sure = cv2.dilate(canny, kernelX, iterations=2)
    cv2.imshow('car-sure1', sure)
    opening = cv2.erode(sure, kernelX, iterations=4)
    cv2.imshow('car-open1', opening)
    sure = cv2.dilate(opening, kernelX, iterations=2)
    cv2.imshow('car-sure2', sure)

    opening = cv2.erode(sure, kernelY, iterations=1)
    cv2.imshow('car-open2', opening)
    sure = cv2.dilate(opening, kernelY, iterations=1)


    cv2.imshow('car-sure3', sure)

最后再膨胀一次,效果已经相当好了。。。

  • 最后再去噪,选取轮廓,标记,就出来了,因为有的图片,最终出来的结果,有些其他的干扰,加上车牌长宽比的范围,过滤
    img = cv2.medianBlur(sure,15)
    cv2.imshow('car-medina',img)

    contours,hier = cv2.findContours(img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    print('get: ', len(contours))
    for c in contours:
        x,y,w,h = cv2.boundingRect(c)

        # 车牌正常情况下宽高比在2.7-5之间
        rat = float(w)/float(h)
        print(rat)
        if rat > 2 and rat<5.2:
            cv2.rectangle(img_old, (x,y),(x+w,y+h),(0,255,0),2)

    cv2.imshow('car', img_old)

百度了一些图片,放到文件夹中,试了下,部分还可以,部分效果不行

要针对某一张图片进行手工调整边缘检测、腐蚀、膨胀的参数,才可以有效识别,

不能自动。。。。太衰。。。

只能算是勉强可以,后续还有很多的地方需要继续完善。。。。

调整了个参数,一次出的这几张。。。。。

if __name__ == "__main__":
    try:
        imgdir = r"./img/car"
        for imgfile in os.listdir(imgdir):
            img_name = os.path.join(imgdir,imgfile)
            if os.path.isdir(img_name):
                continue
            rec_car(img_name, imgfile)

        cv2.waitKey(0)
        cv2.destroyAllWindows()
    except Exception as ex:
        print(ex)


百度查找的图片,如有不适,请及时联系我删除。。。  谢谢!



版权声明:本文为hopena原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。